System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact f96f53e4a3f355c8bc8413e1aa4ed7dc842950d1:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
11d0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
11e0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
11f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1200: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
1210: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1220: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1230: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
1240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1260: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1270: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
1280: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
1290: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
12a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
12b0: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
12c0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
12d0: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
12e0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
12f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1300: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1310: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
1320: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
1330: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
1340: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
1350: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
1360: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
1370: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1380: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
1390: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
13a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
13c0: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
13d0: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
13e0: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
13f0: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
1400: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1410: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
1420: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
1430: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
1440: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
1450: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
1460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1470: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
1480: 20 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76            $nativ
1490: 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c  e ? [machineToPl
14a0: 61 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d  atform $::test_m
14b0: 61 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20  achine] : ""..  
14c0: 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20        }]..      
14d0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
14e0: 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
14f0: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d  tform(machine)]}
1500: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1510: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1520: 54 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62  TE: For native b
1530: 75 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68  uilds, return th
1540: 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  e platform name 
1550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1560: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1570: 20 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72    the machine ar
1580: 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65  chitecture; othe
1590: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
15a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
15b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15c0: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
15d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  {..          $na
15e0: 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65 54  tive ? [machineT
15f0: 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c  oPlatform $::tcl
1600: 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e  _platform(machin
1610: 65 29 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  e)] : ""..      
1620: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
1630: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1640: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1650: 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61 72 63 68   No machine arch
1660: 69 74 65 63 74 75 72 65 20 69 73 20 61 76 61 69  itecture is avai
1670: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
1680: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a   empty string...
1690: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
16a0: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
16b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
16c0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
16d0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
16e0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
16f0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
1700: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
1710: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
1720: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1730: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
1740: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
1750: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1760: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
1770: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
1780: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
1790: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
17a0: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
17b0: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
17c0: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
17d0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
17e0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
17f0: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
1800: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
1810: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
1820: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1830: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
1840: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
1850: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
1860: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
1870: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
1880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
1890: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
18a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18b0: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
18c0: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
18d0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
18e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
18f0: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
1900: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
1910: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
1920: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1930: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
1940: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
1950: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
1960: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
1970: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
1980: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
1990: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
19a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19b0: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
19c0: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
19d0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
19e0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
19f0: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
1a00: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
1a10: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a20: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
1a30: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
1a40: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
1a50: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
1a60: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1a70: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
1a80: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
1a90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ab0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1ac0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
1ad0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
1ae0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1af0: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
1b00: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
1b10: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
1b20: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
1b30: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
1b40: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
1b50: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
1b60: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
1b80: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
1b90: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
1ba0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
1bb0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
1bc0: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
1bd0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
1be0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
1bf0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
1c00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1c10: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1c20: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
1c30: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
1c40: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
1c50: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
1c60: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
1c70: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1c80: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
1c90: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
1ca0: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
1cb0: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
1cc0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
1cd0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
1ce0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1cf0: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
1d00: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
1d10: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
1d20: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1d30: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
1d40: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
1d50: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1d60: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
1d70: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
1d80: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
1d90: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
1da0: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1db0: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
1dc0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1dd0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
1de0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1df0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
1e00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
1e10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
1e20: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
1e30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
1e40: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1e50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1e60: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
1e70: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
1e80: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
1e90: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
1ea0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1eb0: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
1ec0: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
1ed0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1ee0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1ef0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
1f00: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
1f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
1f20: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1f40: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
1f50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
1f60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
1f70: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
1f80: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
1f90: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1fa0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1fb0: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
1fc0: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
1fd0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
1fe0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
1ff0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
2000: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
2010: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2020: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
2030: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2040: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
2050: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
2060: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
2070: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2080: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
2090: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
20a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
20b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
20c0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
20d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
20e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
20f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2100: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2110: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
2120: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
2130: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
2140: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
2150: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
2160: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
2170: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2180: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
2190: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
21a0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
21b0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
21c0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
21d0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
21e0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
21f0: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
2200: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
2210: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
2220: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
2230: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
2240: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
2250: 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 20  tory of the one 
2260: 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  containing..    
2270: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
2280: 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d   file (i.e. "com
2290: 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66 20  mon.eagle"), if 
22a0: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
22b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
22c0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e  eturn [file dirn
22d0: 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ame $::common_di
22e0: 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20 20 20 20  rectory]..      
22f0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
2300: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
2310: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
2320: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
2330: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
2340: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2350: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
2360: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
2370: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
2380: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
2390: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
23a0: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
23b0: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
23c0: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
23d0: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
23e0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
23f0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
2400: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
2410: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
2420: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
2430: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2440: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
2450: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
2460: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
2470: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
2480: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2490: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
24a0: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
24b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
24c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
24d0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
24e0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
24f0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
2500: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
2510: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
2520: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
2530: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
2540: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2550: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
2560: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2570: 70 72 6f 63 20 69 73 4d 69 78 65 64 4d 6f 64 65  proc isMixedMode
2580: 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e  Assembly { fileN
2590: 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  ame {varName ""}
25a0: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
25b0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
25c0: 73 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  st, make sure th
25d0: 65 20 74 65 73 74 20 73 75 69 74 65 20 69 6e 66  e test suite inf
25e0: 72 61 73 74 72 75 63 74 75 72 65 20 69 73 20 61  rastructure is a
25f0: 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20 20 20 20  llowed to..     
2600: 20 23 20 20 20 20 20 20 20 75 73 65 20 74 68 65   #       use the
2610: 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e   [exec] command.
2620: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
2630: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2640: 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26  ts ::no(exec)] &
2650: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
2660: 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d  ::no(corFlags)]}
2670: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2680: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2690: 54 45 3a 20 49 66 20 74 68 65 20 6c 6f 63 61 74  TE: If the locat
26a0: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 20  ion of CorFlags 
26b0: 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
26c0: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a  e environment,..
26d0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26e0: 75 73 65 20 69 74 3b 20 6f 74 68 65 72 77 69 73  use it; otherwis
26f0: 65 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 69  e assume it is i
2700: 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a 20 20 20  n the PATH...   
2710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2720: 73 65 74 20 63 6f 72 46 6c 61 67 73 20 5b 65 78  set corFlags [ex
2730: 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  pr {..          
2740: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
2750: 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20  nv(CorFlags)] ? 
2760: 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29  $::env(CorFlags)
2770: 20 3a 20 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20   : "CorFlags".. 
2780: 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20         }]....   
2790: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
27a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
27b0: 74 6f 20 65 78 65 63 75 74 65 20 43 6f 72 46 6c  to execute CorFl
27c0: 61 67 73 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ags on the speci
27d0: 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20  fied file...    
27e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
27f0: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
2800: 20 20 20 20 20 20 20 65 78 65 63 20 2d 2d 20 24         exec -- $
2810: 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e  corFlags [file n
2820: 61 74 69 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e  ativename $fileN
2830: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame]..        } 
2840: 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  exec] == 0} then
2850: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
2860: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
2870: 45 3a 20 49 66 20 72 65 71 75 65 73 74 65 64 20  E: If requested 
2880: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61  by our caller, a
2890: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
28a0: 69 6e 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ine the..       
28b0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
28c0: 6f 72 6d 20 66 6f 72 20 74 68 65 20 73 70 65 63  orm for the spec
28d0: 69 66 69 65 64 20 66 69 6c 65 20 61 73 20 77 65  ified file as we
28e0: 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ll...          #
28f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2900: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2910: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
2920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2930: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2940: 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74   # NOTE: Store t
2950: 68 65 20 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74  he platform in t
2960: 68 65 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c  he named variabl
2970: 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  e in the..      
2980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
2990: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
29a0: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ler...          
29b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
29c0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
29d0: 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20  e platform....  
29e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
29f0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2a00: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2a10: 61 63 74 20 74 68 65 20 50 45 20 6c 69 6e 65 20  act the PE line 
2a20: 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72 65  from the capture
2a30: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  d..            #
2a40: 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20         output.  
2a50: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
2a60: 20 22 50 45 33 32 22 20 6f 72 20 22 50 45 33 32   "PE32" or "PE32
2a70: 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  +", the..       
2a80: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
2a90: 65 6d 62 6c 79 20 66 69 6c 65 20 69 73 20 33 32  embly file is 32
2aa0: 2d 62 69 74 20 6f 72 20 36 34 2d 62 69 74 2c 20  -bit or 64-bit, 
2ab0: 72 65 73 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20  respectively;.. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
2ad0: 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74     otherwise, it
2ae0: 73 20 74 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77  s type is unknow
2af0: 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n...            
2b00: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
2b10: 65 74 20 70 61 74 74 65 72 6e 20 7b 5e 50 45 20  et pattern {^PE 
2b20: 20 20 20 20 20 20 20 3a 20 28 50 45 33 32 7c 50         : (PE32|P
2b30: 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20  E32\+)\s+$}.... 
2b40: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
2b50: 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20  regexp -line -- 
2b60: 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20 64  $pattern $exec d
2b70: 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74 68 65 6e  ummy pe32]} then
2b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2b90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
2ba0: 20 20 20 23 20 48 41 43 4b 3a 20 54 68 69 73 20     # HACK: This 
2bb0: 5b 73 77 69 74 63 68 5d 20 61 73 73 75 6d 65 73  [switch] assumes
2bc0: 20 74 68 61 74 20 33 32 2d 62 69 74 20 65 78 65   that 32-bit exe
2bd0: 63 75 74 61 62 6c 65 73 20 61 72 65 0d 0a 20 20  cutables are..  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2bf0: 20 20 20 20 61 6c 77 61 79 73 20 78 38 36 20 61      always x86 a
2c00: 6e 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 65  nd that 64-bit e
2c10: 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 20 61  xecutables are a
2c20: 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 20 20 20  lways..         
2c30: 20 20 20 20 20 23 20 20 20 20 20 20 20 78 36 34       #       x64
2c40: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2c50: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2c60: 20 20 73 77 69 74 63 68 20 2d 65 78 61 63 74 20    switch -exact 
2c70: 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20 20 20 20  -- $pe32 {..    
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33 32              PE32
2c90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2ca0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2cb0: 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20 20 20 20  rm Win32..      
2cc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 33               PE3
2ce0: 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  2+ {..          
2cf0: 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74          set plat
2d00: 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20 20 20 20  form x64..      
2d10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66               def
2d30: 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20  ault {..        
2d40: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
2d50: 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20  atform ""..     
2d60: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2d90: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2da0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
2db0: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
2dc0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
2dd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2de0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2df0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 74 72   Attempt to extr
2e00: 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c  act the ILONLY l
2e10: 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70  ine from the cap
2e20: 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20  tured..         
2e30: 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74 2e   #       output.
2e40: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
2e50: 69 73 20 7a 65 72 6f 2c 20 74 68 65 20 73 70 65  is zero, the spe
2e60: 63 69 66 69 65 64 20 66 69 6c 65 20 6d 75 73 74  cified file must
2e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2e80: 20 20 20 20 62 65 20 61 20 6d 69 78 65 64 2d 6d      be a mixed-m
2e90: 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74  ode assembly; ot
2ea0: 68 65 72 77 69 73 65 2c 20 69 74 20 63 6f 6e 74  herwise, it cont
2eb0: 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20  ains only..     
2ec0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
2ed0: 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e  aged components.
2ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2ef0: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74           set pat
2f00: 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20  tern {^ILONLY   
2f10: 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d   : (0|1)\s+$}...
2f20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
2f30: 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d  [regexp -line --
2f40: 20 24 70 61 74 74 65 72 6e 20 24 65 78 65 63 20   $pattern $exec 
2f50: 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74  dummy ilOnly]} t
2f60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2f70: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
2f80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
2f90: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
2fa0: 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a  ilOnly} then {..
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2fc0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
2fd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
2fe0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
2ff0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
3000: 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 73  E: If the test s
3010: 75 69 74 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  uite cannot use 
3020: 5b 65 78 65 63 5d 20 6f 72 20 65 78 65 63 75 74  [exec] or execut
3030: 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d  ion of CorFlags.
3040: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
3050: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 66 61  ailed, return fa
3060: 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  lse...      #.. 
3070: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3080: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3090: 20 70 72 6f 63 20 69 73 42 75 69 6c 64 41 76 61   proc isBuildAva
30a0: 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69 76 65 20  ilable { native 
30b0: 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e 61  directory {varNa
30c0: 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  me ""} } {..    
30d0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
30e0: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
30f0: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
3100: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70  e name for the p
3110: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
3120: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
3130: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79  ontaining the Sy
3140: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
3150: 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65   managed compone
3160: 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20 20 20  nts.  It..      
3170: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
3180: 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74 68 69  e noted that thi
3190: 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20  s assembly file 
31a0: 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
31b0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
31c0: 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f      native compo
31d0: 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61 74 69  nents, if a nati
31e0: 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e 20 75  ve build is in u
31f0: 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  se...      #..  
3200: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
3210: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
3220: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3230: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3240: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
3250: 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d  .SQLite.dll]]...
3260: 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c  .      if {![fil
3270: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3280: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3290: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
32a0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
32b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
32c0: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
32d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
32e0: 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69 6d  tect if the prim
32f0: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
3300: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
3310: 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65 20  ains any native 
3320: 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e  components, if n
3330: 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20  ecessary...     
3340: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
3350: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61  tring length $na
3360: 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  tive] == 0} then
3370: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
3380: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
3390: 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  varName] > 0} th
33a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
33b0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
33c0: 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20   $varName..     
33d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
33e0: 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d 69  set native [isMi
33f0: 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20  xedModeAssembly 
3400: 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61  $fileName $varNa
3410: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
3420: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3430: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70 72   NOTE: If the pr
3440: 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20 61  imary assembly a
3450: 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  lso contains the
3460: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
3470: 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ts,..      #    
3480: 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72 79     we have every
3490: 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a  thing we need...
34a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
34b0: 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e  f {$native} then
34c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
34d0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
34e0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
34f0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
3500: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
3510: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
3520: 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  or the interop a
3530: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
3540: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e         containin
3550: 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  g the System.Dat
3560: 61 2e 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  a.SQLite native 
3570: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49 66 20  components.  If 
3580: 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
3590: 20 20 20 20 66 69 6c 65 20 65 78 69 73 74 73 2c      file exists,
35a0: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
35b0: 65 76 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65  everything we ne
35c0: 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
35d0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
35e0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
35f0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69  e [file join $di
3600: 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20  rectory \..     
3610: 20 20 20 20 20 53 51 4c 69 74 65 2e 49 6e 74 65       SQLite.Inte
3620: 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20  rop.dll]]....   
3630: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
3640: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
3650: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3660: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
3670: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
3680: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
3690: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
36a0: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
36b0: 6d 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74  me for the SQLit
36c0: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 23 20  e core..      # 
36d0: 20 20 20 20 20 20 6c 69 62 72 61 72 79 2e 20 20        library.  
36e0: 49 66 20 74 68 69 73 20 66 69 6c 65 20 65 78 69  If this file exi
36f0: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
3700: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
3710: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3720: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
3730: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
3740: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3750: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3760: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3770: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e          sqlite3.
3780: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  dll]]....      i
3790: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
37a0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
37b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
37c0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
37d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
37e0: 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20 6f     # NOTE: One o
37f0: 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63 6f  r more native co
3800: 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64 20  mponents needed 
3810: 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  by System.Data.S
3820: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20 20  QLite..      #  
3830: 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e 67       are missing
3840: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3850: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
3860: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3870: 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61 69  oc isReleaseAvai
3880: 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f 72  lable { director
3890: 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d  y {varName ""} }
38a0: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   {..      if {[s
38b0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61  tring length $va
38c0: 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  rName] > 0} then
38d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
38e0: 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76 61  r 1 $varName $va
38f0: 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rName..      }..
3900: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
3910: 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65  isBuildAvailable
3920: 20 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 24   "" $directory $
3930: 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 7d 0d  varName]..    }.
3940: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6a 6f 69  ....    proc joi
3950: 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20  nBuildDirectory 
3960: 7b 20 6e 61 74 69 76 65 20 70 61 74 68 20 79 65  { native path ye
3970: 61 72 20 70 6c 61 74 66 6f 72 6d 20 63 6f 6e 66  ar platform conf
3980: 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b 0d 0a 20  iguration } {.. 
3990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
39a0: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
39b0: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
39c0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
39d0: 66 69 65 64 20 70 61 74 68 20 74 6f 20 74 68 65  fied path to the
39e0: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 23 20   build..      # 
39f0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
3a00: 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65  based on all the
3a10: 20 61 72 67 75 6d 65 6e 74 73 20 70 72 6f 76 69   arguments provi
3a20: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
3a30: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
3a40: 20 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20     if {$native} 
3a50: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3a60: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69  return [file joi
3a70: 6e 20 24 70 61 74 68 20 62 69 6e 20 24 79 65 61  n $path bin $yea
3a80: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
3a90: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
3aa0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3ab0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
3ac0: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e  e join $path bin
3ad0: 20 24 79 65 61 72 20 24 63 6f 6e 66 69 67 75 72   $year $configur
3ae0: 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20 20 20 20  ation bin]..    
3af0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
3b00: 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64     proc getBuild
3b10: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
3b20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
3b30: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
3b40: 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69  e "native" runti
3b50: 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65  me option has be
3b60: 65 6e 20 73 65 74 2e 20 20 49 66 20 73 6f 2c 20  en set.  If so, 
3b70: 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 23  use the..      #
3b80: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
3b90: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
3ba0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 28 61 2e  ode assembly (a.
3bb0: 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69 76 65 20  k.a. the native 
3bc0: 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 23  interop..      #
3bd0: 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 29         assembly)
3be0: 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69  .  To enable thi
3bf0: 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65  s option via the
3c00: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
3c10: 6e 74 65 72 20 61 0d 0a 20 20 20 20 20 20 23 20  nter a..      # 
3c20: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 20 73 69        command si
3c30: 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 20  milar to one of 
3c40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
3c50: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
3c60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3c70: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
3c80: 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61 6c  ell.exe -initial
3c90: 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f 70 74 69  ize -runtimeOpti
3ca0: 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  on native..     
3cb0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
3cc0: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
3cd0: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
3ce0: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 6f 20       #       To 
3cf0: 65 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69  enable this opti
3d00: 6f 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  on via the comma
3d10: 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72 20 74 6f  nd line prior to
3d20: 20 74 68 65 20 22 62 65 74 61 20 31 36 22 0d 0a   the "beta 16"..
3d30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
3d40: 6c 65 61 73 65 20 6f 66 20 45 61 67 6c 65 2c 20  lease of Eagle, 
3d50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
3d60: 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65 20 75 73  mmand must be us
3d70: 65 64 20 69 6e 73 74 65 61 64 0d 0a 20 20 20 20  ed instead..    
3d80: 20 20 23 20 20 20 20 20 20 20 28 61 6c 73 6f 20    #       (also 
3d90: 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29  all on one line)
3da0: 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  :..      #..    
3db0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53    #       EagleS
3dc0: 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74 69 61  hell.exe -initia
3dd0: 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69 74 69 61  lize -postInitia
3de0: 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23 20 20 20  lize..      #   
3df0: 20 20 20 20 20 20 22 6f 62 6a 65 63 74 20 69 6e        "object in
3e00: 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72  voke Interpreter
3e10: 2e 47 65 74 41 63 74 69 76 65 20 41 64 64 52 75  .GetActive AddRu
3e20: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
3e30: 76 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ve"..      #    
3e40: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
3e50: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
3e60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
3e70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3e80: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3e90: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
3ea0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3eb0: 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  h $::build_direc
3ec0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
3ed0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3ee0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
3ef0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
3f00: 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
3f10: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
3f20: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
3f30: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
3f40: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
3f50: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
3f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
3f70: 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72  ::build_director
3f80: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
3f90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
3fa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
3fb0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3fc0: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  ntime option is 
3fd0: 73 65 74 2c 20 74 68 65 20 6d 69 78 65 64 2d 6d  set, the mixed-m
3fe0: 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ode assembly..  
3ff0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
4000: 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e 20 20   being tested.  
4010: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
4020: 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  e path to the bu
4030: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
4040: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
4050: 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ill contain the 
4060: 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 61 6e  platform name an
4070: 64 20 61 6c 6c 20 74 68 65 20 62 69 6e 61 72 69  d all the binari
4080: 65 73 20 75 6e 64 65 72 20 74 65 73 74 0d 0a 20  es under test.. 
4090: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
40a0: 68 6f 75 6c 64 20 62 65 20 70 72 65 73 65 6e 74  hould be present
40b0: 20 69 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f   in that directo
40c0: 72 79 2e 20 20 49 66 20 74 68 65 20 22 6e 61 74  ry.  If the "nat
40d0: 69 76 65 22 20 72 75 6e 74 69 6d 65 0d 0a 20 20  ive" runtime..  
40e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 70        #       op
40f0: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73 65 74 2c  tion is not set,
4100: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
4110: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 6f 6e  tory will be con
4120: 73 69 64 65 72 65 64 20 74 6f 20 62 65 0d 0a 20  sidered to be.. 
4130: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
4140: 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74 72 61 6c  platform-neutral
4150: 22 2c 20 77 69 74 68 20 74 68 65 20 6e 6f 74 61  ", with the nota
4160: 62 6c 65 20 65 78 63 65 70 74 69 6f 6e 20 6f 66  ble exception of
4170: 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a 20 20 20   any native..   
4180: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
4190: 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22 53 51 4c  embly (e.g. "SQL
41a0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 22  ite.Interop.dll"
41b0: 29 20 63 6f 70 69 65 64 20 74 68 65 72 65 20 64  ) copied there d
41c0: 75 72 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20  uring the..     
41d0: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
41e0: 20 70 72 6f 63 65 73 73 20 69 74 73 65 6c 66 2e   process itself.
41f0: 20 20 49 66 20 74 68 65 20 62 75 69 6c 64 20 70    If the build p
4200: 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f 77 20 64  rocess somehow d
4210: 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20  oes not..       
4220: 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 74 68   #       copy th
4230: 65 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c  e native assembl
4240: 79 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  y for this platf
4250: 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20 74 68 65  orm, most of the
4260: 20 74 65 73 74 73 0d 0a 20 20 20 20 20 20 20 20   tests..        
4270: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 73  #       in the s
4280: 75 69 74 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79  uite will simply
4290: 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 47 65   be skipped.  Ge
42a0: 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67  nerally speaking
42b0: 2c 20 74 68 65 72 65 0d 0a 20 20 20 20 20 20 20  , there..       
42c0: 20 23 20 20 20 20 20 20 20 61 72 65 20 74 77 6f   #       are two
42d0: 20 77 61 79 73 20 74 6f 20 62 75 69 6c 64 20 74   ways to build t
42e0: 68 65 20 62 69 6e 61 72 69 65 73 20 77 68 65 6e  he binaries when
42f0: 20 70 72 65 70 61 72 69 6e 67 20 74 6f 20 72 75   preparing to ru
4300: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  n the..        #
4310: 20 20 20 20 20 20 20 74 65 73 74 20 73 75 69 74         test suit
4320: 65 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e:..        #.. 
4330: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 31         #       1
4340: 2e 20 42 75 69 6c 64 20 74 68 65 20 73 65 70 61  . Build the sepa
4350: 72 61 74 65 20 6d 61 6e 61 67 65 64 20 61 6e 64  rate managed and
4360: 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 69   native assembli
4370: 65 73 20 75 73 69 6e 67 20 73 6f 6d 65 0d 0a 20  es using some.. 
4380: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4390: 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69 6d 69 6c    commands simil
43a0: 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20  ar to:..        
43b0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
43c0: 20 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20        build.bat 
43d0: 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d  ${Configuration}
43e0: 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 7b 50 6c  ManagedOnly ${Pl
43f0: 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20  atform}..       
4400: 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c   #          buil
4410: 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72  d.bat ${Configur
4420: 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f 6e 6c 79  ation}NativeOnly
4430: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
4440: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4450: 20 23 20 20 20 20 20 20 20 20 20 20 57 68 65 72   #          Wher
4460: 65 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f  e ${Configuratio
4470: 6e 7d 20 69 73 20 65 69 74 68 65 72 20 22 44 65  n} is either "De
4480: 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
4490: 22 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23  " and..        #
44a0: 20 20 20 20 20 20 20 20 20 20 24 7b 50 6c 61 74            ${Plat
44b0: 66 6f 72 6d 7d 20 69 73 20 65 69 74 68 65 72 20  form} is either 
44c0: 22 57 69 6e 33 32 22 20 6f 72 20 22 78 36 34 22  "Win32" or "x64"
44d0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
44e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 32 2e        #       2.
44f0: 20 42 75 69 6c 64 20 74 68 65 20 6d 69 78 65 64   Build the mixed
4500: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 75  -mode assembly u
4510: 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 73  sing a command s
4520: 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20  imilar to:..    
4530: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4540: 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e            build.
4550: 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74  bat ${Configurat
4560: 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  ion} ${Platform}
4570: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4580: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
4590: 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72  Where ${Configur
45a0: 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72  ation} is either
45b0: 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
45c0: 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20  ease" and..     
45d0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b     #          ${
45e0: 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74  Platform} is eit
45f0: 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22  her "Win32" or "
4600: 78 36 34 22 2e 20 20 49 66 20 74 68 69 73 20 63  x64".  If this c
4610: 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20  ommand is..     
4620: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 75 73     #          us
4630: 65 64 2c 20 76 61 72 69 6f 75 73 20 74 65 73 74  ed, various test
4640: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 73  s that require s
4650: 75 70 70 6c 65 6d 65 6e 74 61 72 79 20 6d 61 6e  upplementary man
4660: 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  aged..        # 
4670: 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c           assembl
4680: 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e 51 29 20  ies (e.g. LINQ) 
4690: 6d 61 79 20 62 65 20 73 6b 69 70 70 65 64 20 75  may be skipped u
46a0: 6e 6c 65 73 73 20 74 68 6f 73 65 20 62 69 6e 61  nless those bina
46b0: 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ries..        # 
46c0: 20 20 20 20 20 20 20 20 20 61 72 65 20 73 75 62           are sub
46d0: 73 65 71 75 65 6e 74 6c 79 20 63 6f 70 69 65 64  sequently copied
46e0: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
46f0: 74 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65  t directory (i.e
4700: 2e 20 62 79 0d 0a 20 20 20 20 20 20 20 20 23 20  . by..        # 
4710: 20 20 20 20 20 20 20 20 20 22 74 65 73 74 5f 61           "test_a
4720: 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20 20 20 20  ll.bat")...     
4730: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
4740: 20 20 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20        Note that 
4750: 61 6c 6c 20 6f 66 20 74 68 65 20 62 75 69 6c 64  all of the build
4760: 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65 20   commands above 
4770: 77 69 6c 6c 20 64 65 66 61 75 6c 74 20 74 6f 20  will default to 
4780: 75 73 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23  using..        #
4790: 20 20 20 20 20 20 20 74 68 65 20 6c 61 74 65 73         the lates
47a0: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 4d 53 42  t version of MSB
47b0: 75 69 6c 64 20 61 76 61 69 6c 61 62 6c 65 20 61  uild available a
47c0: 6e 64 20 74 68 65 20 22 74 65 73 74 5f 79 65 61  nd the "test_yea
47d0: 72 22 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  r" may..        
47e0: 23 20 20 20 20 20 20 20 6e 65 65 64 20 74 6f 20  #       need to 
47f0: 62 65 20 61 64 6a 75 73 74 65 64 20 61 63 63 6f  be adjusted acco
4800: 72 64 69 6e 67 6c 79 20 74 6f 20 61 63 74 75 61  rdingly to actua
4810: 6c 6c 79 20 72 75 6e 20 74 68 65 20 74 65 73 74  lly run the test
4820: 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20   suite...       
4830: 20 23 20 20 20 20 20 20 20 52 65 66 65 72 20 74   #       Refer t
4840: 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 69  o the comments i
4850: 6e 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d  n [getBuildYear]
4860: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   for more inform
4870: 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20 20 20 20  ation on..      
4880: 20 20 23 20 20 20 20 20 20 20 68 6f 77 20 74 6f    #       how to
4890: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
48a0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
48b0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69          set nati
48c0: 76 65 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  ve [hasRuntimeOp
48d0: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d 0a 0d 0a  tion native]....
48e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
48f0: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
4900: 72 79 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42  ry $native [getB
4910: 75 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72  uildBaseDirector
4920: 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  y] \..          
4930: 20 20 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d    [getBuildYear]
4940: 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f   [getBuildPlatfo
4950: 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b 67 65 74  rm $native] [get
4960: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
4970: 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  on]]..      }.. 
4980: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4990: 63 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73  c getReleaseVers
49a0: 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ion {} {..      
49b0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
49c0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
49d0: 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20  release version 
49e0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65  for use with the
49f0: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4a00: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4a10: 77 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f  when checking fo
4a20: 72 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65  r available rele
4a30: 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ases...      #..
4a40: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
4a50: 65 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65  exists ::release
4a60: 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a  _version] && \..
4a70: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
4a80: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65  g length $::rele
4a90: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30  ase_version] > 0
4aa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4ac0: 4f 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65  OTE: The release
4ad0: 20 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65   version has bee
4ae0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68  n overridden; th
4af0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d  erefore, use it.
4b00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4b10: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
4b20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
4b30: 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65  eturn $::release
4b40: 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  _version..      
4b50: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
4b60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
4b70: 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20  OTE: No release 
4b80: 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
4b90: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  able, return an 
4ba0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20  empty string... 
4bb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4bc0: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
4bd0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
4be0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
4bf0: 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  dFileName { file
4c00: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
4c10: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
4c20: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
4c30: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
4c40: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
4c50: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
4c60: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
4c70: 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
4c80: 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63   directory, disc
4c90: 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63  arding any direc
4ca0: 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tory information
4cb0: 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20   present..      
4cc0: 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66  #       in the f
4cd0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76  ile name as prov
4ce0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
4cf0: 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  er...      #..  
4d00: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
4d10: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
4d20: 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
4d30: 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69 72  oin [getBuildDir
4d40: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
4d50: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
4d60: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
4d70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
4d80: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
4d90: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
4da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4db0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
4dc0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
4dd0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
4de0: 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  t application.. 
4df0: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73       #       its
4e00: 65 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61  elf (i.e. the Ea
4e10: 67 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f  gle shell) is lo
4e20: 63 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c  cated.  This wil
4e30: 6c 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20  l be used as..  
4e40: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
4e50: 64 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  destination for 
4e60: 74 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65  the copied Syste
4e70: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61  m.Data.SQLite na
4e80: 74 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20  tive and..      
4e90: 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
4ea0: 61 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e  assemblies (i.e.
4eb0: 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
4ec0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20   one of the few 
4ed0: 70 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20  places..      # 
4ee0: 20 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20        where the 
4ef0: 43 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c  CLR will actuall
4f00: 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20  y find and load 
4f10: 74 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d  them properly)..
4f20: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
4f30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
4f40: 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74   ::binary_direct
4f50: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
4f60: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
4f70: 67 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69  gth $::binary_di
4f80: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
4f90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4fa0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4fb0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
4fc0: 20 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65   the binary dire
4fd0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
4fe0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
4ff0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
5000: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65  efore, use it ve
5010: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
5020: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5030: 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  rn $::binary_dir
5040: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
5050: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5060: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
5070: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
5080: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5090: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
50a0: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
50b0: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
50c0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
50d0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
50e0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
50f0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
5100: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
5110: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
5120: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
5130: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
5140: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
5150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
5160: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
5170: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
5180: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
5190: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
51a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
51b0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
51c0: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
51d0: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
51e0: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
51f0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66  ry] $platform [f
5200: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
5210: 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  me]]]..    }....
5220: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
5230: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  eBinaryFileName 
5240: 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  { {platform ""} 
5250: 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65 7d  {standard false}
5260: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
5270: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
5280: 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61  urns the full pa
5290: 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  th for the file 
52a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
52b0: 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20  QLite core..    
52c0: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
52d0: 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f   library code fo
52e0: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e  r this platform.
52f0: 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61    First, check a
5300: 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20  nd see if..     
5310: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
5320: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
5330: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
5340: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e  ady been loaded.
5350: 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23    Next,..      #
5360: 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20         fallback 
5370: 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c  to what the full
5380: 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c   path should be,
5390: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
53a0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
53b0: 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
53c0: 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e  assembly is bein
53d0: 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e  g used and the n
53e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
53f0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
5400: 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20    platform...   
5410: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
5420: 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
5430: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
5440: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
5450: 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
5460: 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
5470: 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
5480: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
5490: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
54a0: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 7d 20 66 69  duleFileName} fi
54b0: 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20  leName] == 0 && 
54c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
54d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c  ring length $fil
54e0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
54f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5500: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
5510: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
5520: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
5530: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
5540: 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20 20 20  oaded via..     
5550: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6e     #       the n
5560: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 70 72  ative library pr
5570: 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74 75 72  e-loader.  Retur
5580: 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61 6d 65  n that file name
5590: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23   now...        #
55a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
55b0: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
55c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
55d0: 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69  {[hasRuntimeOpti
55e0: 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e  on native]} then
55f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5600: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
5610: 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64 2d  eturn the mixed-
5620: 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66 69  mode assembly fi
5630: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
5640: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5650: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
5660: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
5670: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
5680: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
5690: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 79  ry] $platform Sy
56a0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
56b0: 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20  .dll]]..      } 
56c0: 65 6c 73 65 69 66 20 7b 24 73 74 61 6e 64 61 72  elseif {$standar
56d0: 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  d} then {..     
56e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
56f0: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
5700: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73 74 61   native-only sta
5710: 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c 69 62  ndard SQLite lib
5720: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  rary file name..
5730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5740: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
5750: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20   nativename \.. 
5760: 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
5770: 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79   join [getBinary
5780: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
5790: 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e 64 6c 6c  form sqlite3.dll
57a0: 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ]]..      } else
57b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
57c0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
57d0: 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65  eturn the native
57e0: 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73  -only interop as
57f0: 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65  sembly file name
5800: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
5810: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
5820: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
5840: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
5850: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
5860: 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49 6e  atform SQLite.In
5870: 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20 20 20  terop.dll]]..   
5880: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
5890: 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6d 6d      proc getComm
58a0: 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  onDirectory {} {
58b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
58c0: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
58d0: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
58e0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
58f0: 65 72 65 20 74 68 65 20 74 65 73 74 20 73 63 72  ere the test scr
5900: 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ipts..      #   
5910: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
5920: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
5930: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 72 65  lt, this just re
5940: 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c 65 0d  turns the Eagle.
5950: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
5960: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  inary directory.
5970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
5980: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
5990: 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63  s ::common_direc
59a0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
59b0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
59c0: 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64  ngth $::common_d
59d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
59e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
59f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5a00: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
5a10: 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64 69 72  f the common dir
5a20: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5a30: 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20 23 20  set;..        # 
5a40: 20 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c        therefore,
5a50: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5a60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5a70: 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  urn $::common_di
5a80: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
5a90: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
5aa0: 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72 5f 64  xists ::vendor_d
5ab0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
5ac0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5ad0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65 6e 64  g length $::vend
5ae0: 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  or_directory] > 
5af0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
5b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5b10: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
5b20: 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64 6f 72  on of the vendor
5b30: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
5b40: 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20  een set;..      
5b50: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
5b60: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
5b70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5b80: 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e 64 6f   return $::vendo
5b90: 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  r_directory..   
5ba0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
5bb0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f  fo exists ::tcl_
5bc0: 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d 0a 20  library] && \.. 
5bd0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5be0: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c 5f 6c   length $::tcl_l
5bf0: 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26 20 5c  ibrary] > 0 && \
5c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
5c10: 65 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 3a  e isdirectory $:
5c20: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d 20 74  :tcl_library]} t
5c30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
5c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5c50: 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 77  : The variable w
5c60: 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ith the location
5c70: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 6c   of the script l
5c80: 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20 20 20  ibrary is..     
5c90: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 20 61     #       set a
5ca0: 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  nd appears to be
5cb0: 20 61 20 72 65 61 6c 20 64 69 72 65 63 74 6f 72   a real director
5cc0: 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d 62 65  y (i.e. not embe
5cd0: 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  dded..        # 
5ce0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 61 20 66        within a f
5cf0: 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72 65 2c  ile); therefore,
5d00: 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20   use it...      
5d10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5d20: 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  urn $::tcl_libra
5d30: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
5d40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
5d50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
5d60: 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 64  allback to the d
5d70: 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
5d80: 69 6e 67 20 74 68 65 20 65 78 65 63 75 74 61 62  ing the executab
5d90: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
5da0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
5db0: 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20  info binary]..  
5dc0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
5dd0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74  .    proc getDat
5de0: 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b  abaseDirectory {
5df0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5e00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
5e10: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
5e20: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
5e30: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
5e40: 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20 20 20  databases..     
5e50: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
5e60: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
5e70: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
5e80: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
5e90: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
5ea0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
5eb0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
5ec0: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
5ed0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5ee0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
5ef0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5f00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
5f10: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
5f20: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
5f30: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
5f40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
5f50: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
5f60: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
5f70: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 69 72  the database dir
5f80: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
5f90: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
5fa0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5fb0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
5fc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5fd0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
5fe0: 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  tabase_directory
5ff0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
6000: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
6010: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
6020: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
6030: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
6040: 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  th $::scratch_di
6050: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
6060: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6070: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6080: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
6090: 20 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72   the scratch dir
60a0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
60b0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
60c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
60d0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
60e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
60f0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63      return $::sc
6100: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d  ratch_directory.
6110: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
6120: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6130: 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74  [getTemporaryPat
6140: 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  h]..      }..   
6150: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6160: 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69 72 65  getTemporaryDire
6170: 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  ctory {} {..    
6180: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6190: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
61a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69  e returns the di
61b0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
61c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
61d0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
61e0: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
61f0: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
6200: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
6210: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
6220: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6230: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
6240: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
6250: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
6260: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
6270: 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72 79 5f  sts ::temporary_
6280: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
6290: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
62a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 6d  ng length $::tem
62b0: 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
62c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
62d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
62e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
62f0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 65  cation of the te
6300: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
6310: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
6320: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
6330: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
6340: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
6350: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6360: 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f 72 61  eturn $::tempora
6370: 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ry_directory..  
6380: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6390: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73 63 72  nfo exists ::scr
63a0: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20  atch_directory] 
63b0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
63c0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
63d0: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
63e0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
63f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6400: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
6410: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
6420: 20 73 63 72 61 74 63 68 20 64 69 72 65 63 74 6f   scratch directo
6430: 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ry has been over
6440: 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20  ridden;..       
6450: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
6460: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
6470: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6480: 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61 74 63  return $::scratc
6490: 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  h_directory..   
64a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
64b0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74       return [get
64c0: 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d 0d 0a  TemporaryPath]..
64d0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
64e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54  ...    proc getT
64f0: 65 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61  estOverridesPrea
6500: 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72  mble { {extraVar
6510: 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20  Names ""} } {.. 
6520: 20 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65       set varName
6530: 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20  s [list]....    
6540: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
6550: 45 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c  E: If available,
6560: 20 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20   start with the 
6570: 6d 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74  master list of t
6580: 65 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20  est override..  
6590: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
65a0: 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ables...      #.
65b0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
65c0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f   exists ::test_o
65d0: 76 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a  verrides] && \..
65e0: 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67            [lleng
65f0: 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72  th $::test_overr
6600: 69 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ides] > 0} then 
6610: 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20  {..        eval 
6620: 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73  lappend varNames
6630: 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64   $::test_overrid
6640: 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  es..      }.... 
6650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6660: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
6670: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
6680: 2c 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69  , add any additi
6690: 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20  onal variable.. 
66a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
66b0: 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d  es to copy now..
66c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
66d0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78  if {[llength $ex
66e0: 74 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30  traVarNames] > 0
66f0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6700: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
6710: 61 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61  arNames $extraVa
6720: 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d  rNames..      }.
6730: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6740: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
6750: 74 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  the script fragm
6760: 65 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  ent to be return
6770: 65 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67  ed by processing
6780: 20 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20   each..      #  
6790: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
67a0: 6d 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68  me and adding th
67b0: 65 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63  e nececessary sc
67c0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66  ript fragments f
67d0: 6f 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  or..      #     
67e0: 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20    each one...   
67f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
6800: 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20  result ""....   
6810: 20 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61     foreach varNa
6820: 6d 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a  me $varNames {..
6830: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6840: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
6850: 20 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67   the qualified g
6860: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  lobal variable n
6870: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
6880: 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c  .        set ful
6890: 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64  lVarName [append
68a0: 41 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65  Args :: $varName
68b0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
68c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
68d0: 44 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  Does the variabl
68e0: 65 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20  e exist in this 
68f0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  interpreter cont
6900: 65 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d  ext?..        #.
6910: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
6920: 66 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56  fo exists $fullV
6930: 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  arName]} then {.
6940: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
6950: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
6960: 41 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20  Append a script 
6970: 66 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20  fragment to the 
6980: 72 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c  result that will
6990: 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20   correctly..    
69a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
69b0: 70 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64  py any contained
69c0: 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65   value to anothe
69d0: 72 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f  r interpreter co
69e0: 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20  ntext...        
69f0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
6a00: 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20  ppend result \n 
6a10: 22 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e  "set " $fullVarN
6a20: 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65 74 20 24  ame " \{" [set $
6a30: 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20 5c 7d 0d  fullVarName] \}.
6a40: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
6a50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
6a60: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
6a70: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6e 74   the result cont
6a80: 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
6a90: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
6aa0: 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a 20 20 20  s, append a..   
6ab0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 6c 69     #       newli
6ac0: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
6ad0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
6ae0: 6c 65 6e 67 74 68 20 24 72 65 73 75 6c 74 5d 20  length $result] 
6af0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6b00: 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73 75       append resu
6b10: 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  lt \n..      }..
6b20: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
6b30: 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
6b40: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 41 70  ..    proc getAp
6b50: 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62 6c 65 20  pDomainPreamble 
6b60: 7b 20 7b 70 72 65 66 69 78 20 22 22 7d 20 7b 73  { {prefix ""} {s
6b70: 75 66 66 69 78 20 22 22 7d 20 7d 20 7b 0d 0a 20  uffix ""} } {.. 
6b80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6b90: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
6ba0: 64 75 72 65 20 72 65 74 75 72 6e 73 20 61 20 74  dure returns a t
6bb0: 65 73 74 20 73 65 74 75 70 20 73 63 72 69 70 74  est setup script
6bc0: 20 66 72 61 67 6d 65 6e 74 20 73 75 69 74 61 62   fragment suitab
6bd0: 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  le for..      # 
6be0: 20 20 20 20 20 20 65 76 61 6c 75 61 74 69 6f 6e        evaluation
6bf0: 20 62 79 20 61 6e 20 69 6e 74 65 72 70 72 65 74   by an interpret
6c00: 65 72 20 63 72 65 61 74 65 64 20 69 6e 20 61 6e  er created in an
6c10: 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63   isolated applic
6c20: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ation..      #  
6c30: 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20 20 54 68       domain.  Th
6c40: 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  e script fragmen
6c50: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6c60: 20 77 69 6c 6c 20 62 65 20 73 75 72 72 6f 75 6e   will be surroun
6c70: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
6c80: 20 20 20 20 20 20 74 68 65 20 70 72 65 66 69 78        the prefix
6c90: 20 61 6e 64 20 73 75 66 66 69 78 20 22 73 63 72   and suffix "scr
6ca0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 22 20 73  ipt fragments" s
6cb0: 70 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20  pecified by our 
6cc0: 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20 20 20 23  caller,..      #
6cd0: 20 20 20 20 20 20 20 69 66 20 61 6e 79 2e 20 20         if any.  
6ce0: 54 68 65 20 65 6e 74 69 72 65 20 73 63 72 69 70  The entire scrip
6cf0: 74 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64  t being returned
6d00: 20 77 69 6c 6c 20 62 65 20 73 75 62 73 74 69 74   will be substit
6d10: 75 74 65 64 20 76 69 61 0d 0a 20 20 20 20 20 20  uted via..      
6d20: 23 20 20 20 20 20 20 20 5b 73 75 62 73 74 5d 2c  #       [subst],
6d30: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
6d40: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 62  of our caller, b
6d50: 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 74 75  efore being retu
6d60: 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20 23 20 20  rned...      #  
6d70: 20 20 20 20 20 54 68 69 73 20 73 74 65 70 20 69       This step i
6d80: 73 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  s necessary so t
6d90: 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69 74 65 64  hat some limited
6da0: 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f 72 6d 61   context informa
6db0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 23 20 20  tion,..      #  
6dc0: 20 20 20 20 20 70 72 69 6d 61 72 69 6c 79 20 72       primarily r
6dd0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 74 65  elated to the te
6de0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
6df0: 73 2c 20 63 61 6e 20 62 65 20 74 72 61 6e 73 66  s, can be transf
6e00: 65 72 72 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erred..      #  
6e10: 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
6e20: 72 70 72 65 74 65 72 20 69 6e 20 74 68 65 20 69  rpreter in the i
6e30: 73 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74  solated applicat
6e40: 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d 61 6b 69  ion domain, maki
6e50: 6e 67 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20  ng it..      #  
6e60: 20 20 20 20 20 61 62 6c 65 20 74 6f 20 73 75 63       able to suc
6e70: 63 65 73 73 66 75 6c 6c 79 20 72 75 6e 20 74 65  cessfully run te
6e80: 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72 65  sts that require
6e90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6ea0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
6eb0: 20 20 20 66 69 6c 65 73 20 69 6e 20 6f 6e 65 20     files in one 
6ec0: 6f 66 20 74 68 65 20 74 65 73 74 69 6e 67 20 64  of the testing d
6ed0: 69 72 65 63 74 6f 72 69 65 73 2e 20 20 43 61 6c  irectories.  Cal
6ee0: 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b 65 65 70  lers should keep
6ef0: 20 69 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   in..      #    
6f00: 20 20 20 6d 69 6e 64 20 74 68 61 74 20 74 68 65     mind that the
6f10: 20 74 65 73 74 20 73 63 72 69 70 74 20 66 72 61   test script fra
6f20: 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75  gment being retu
6f30: 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72 65 6c 79  rned cannot rely
6f40: 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20   on..      #    
6f50: 20 20 20 61 6e 79 20 73 63 72 69 70 74 20 6c 69     any script li
6f60: 62 72 61 72 79 20 70 72 6f 63 65 64 75 72 65 73  brary procedures
6f70: 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 70 72   that are not pr
6f80: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 45 61  ovided by the Ea
6f90: 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  gle..      #    
6fa0: 20 20 20 6c 69 62 72 61 72 79 20 70 61 63 6b 61     library packa
6fb0: 67 65 20 28 69 2e 65 2e 20 22 69 6e 69 74 2e 65  ge (i.e. "init.e
6fc0: 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75 64 69 6e  agle"), includin
6fd0: 67 20 74 68 6f 73 65 20 70 72 6f 76 69 64 65 64  g those provided
6fe0: 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20   by..      #    
6ff0: 20 20 20 74 68 65 20 45 61 67 6c 65 20 74 65 73     the Eagle tes
7000: 74 20 70 61 63 6b 61 67 65 2c 20 75 6e 6c 65 73  t package, unles
7010: 73 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  s the file conta
7020: 69 6e 69 6e 67 20 74 68 65 6d 20 69 73 20 6c 6f  ining them is lo
7030: 61 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20  aded..      #   
7040: 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20 76 69 61      manually via
7050: 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 63 68   some other mech
7060: 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62 79 20 69  anism (e.g. by i
7070: 6e 63 6c 75 64 69 6e 67 20 61 70 70 72 6f 70 72  ncluding appropr
7080: 69 61 74 65 0d 0a 20 20 20 20 20 20 23 20 20 20  iate..      #   
7090: 20 20 20 20 5b 70 61 63 6b 61 67 65 20 72 65 71      [package req
70a0: 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75 72 63 65  uire] or [source
70b0: 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68  ] commands in th
70c0: 65 20 70 72 65 66 69 78 20 6f 72 20 73 75 66 66  e prefix or suff
70d0: 69 78 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ix..      #     
70e0: 20 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e    script fragmen
70f0: 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61 6c 6c 20  ts).  Also, all 
7100: 76 61 72 69 61 62 6c 65 20 72 65 66 65 72 65 6e  variable referen
7110: 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e 65 73 74  ces and all nest
7120: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
7130: 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69 2e 65 2e    commands (i.e.
7140: 20 74 68 6f 73 65 20 69 6e 20 73 71 75 61 72 65   those in square
7150: 20 62 72 61 63 6b 65 74 73 29 20 63 6f 6e 74 61   brackets) conta
7160: 69 6e 65 64 20 69 6e 20 74 68 65 20 66 69 6e 61  ined in the fina
7170: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
7180: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
7190: 20 77 69 6c 6c 20 65 6e 64 20 75 70 20 62 65 69   will end up bei
71a0: 6e 67 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  ng evaluated in 
71b0: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  the context of t
71c0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
71d0: 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74 65 72 70    calling interp
71e0: 72 65 74 65 72 20 61 6e 64 20 6e 6f 74 20 74 68  reter and not th
71f0: 65 20 74 61 72 67 65 74 20 69 6e 74 65 72 70 72  e target interpr
7200: 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e 20  eter created in 
7210: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
7220: 20 20 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c     isolated appl
7230: 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 20 75  ication domain u
7240: 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c 6c 61 72  nless the dollar
7250: 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72 20 73 71   signs and/or sq
7260: 75 61 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20  uare..      #   
7270: 20 20 20 20 62 72 61 63 6b 65 74 73 20 61 72 65      brackets are
7280: 20 73 70 65 63 69 61 6c 6c 79 20 71 75 6f 74 65   specially quote
7290: 64 20 77 69 74 68 20 62 61 63 6b 73 6c 61 73 68  d with backslash
72a0: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
72b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70 6c 65      return [uple
72c0: 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 75 62 73  vel 1 [list subs
72d0: 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  t [appendArgs $p
72e0: 72 65 66 69 78 20 7b 0d 0a 20 20 20 20 20 20 20  refix {..       
72f0: 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
7300: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20  Option native]} 
7310: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7320: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
7330: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
7340: 63 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65  ctive AddRuntime
7350: 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20  Option native.. 
7360: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7370: 7d 20 5b 67 65 74 54 65 73 74 4f 76 65 72 72 69  } [getTestOverri
7380: 64 65 73 50 72 65 61 6d 62 6c 65 20 5b 6c 69 73  desPreamble [lis
7390: 74 20 70 61 74 68 20 74 65 73 74 5f 63 68 61 6e  t path test_chan
73a0: 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78 5d 5d 5d  nel]] $suffix]]]
73b0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
73c0: 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61  proc tryCopyBina
73d0: 72 79 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ryFile { fileNam
73e0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
73f0: 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d  {newFileName ""}
7400: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
7410: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b  sourceFileName [
7420: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
7430: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
7440: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
7450: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
7460: 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  s $sourceFileNam
7470: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
7480: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7490: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
74a0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
74b0: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
74c0: 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61 72  ed copying binar
74d0: 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72  y file \"" $sour
74e0: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
74f0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
7500: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
7510: 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
7520: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
7530: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
7540: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77  ring length $new
7550: 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  FileName] > 0} t
7560: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
7570: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
7580: 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e  e [getBuildFileN
7590: 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  ame $newFileName
75a0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
75b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
75c0: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46       set targetF
75d0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
75e0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
75f0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7600: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7610: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
7620: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
7630: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7640: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
7650: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
7660: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66           if {![f
7670: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
7680: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
7690: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
76a0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
76b0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
76c0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
76d0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
76e0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
76f0: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
7700: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
7710: 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  me}] == 0} then 
7720: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
7730: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
7740: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
7750: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
7760: 2d 20 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20  - copied binary 
7770: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
7780: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c  ourceFileName "\
7790: 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20  " to \"" \..    
77a0: 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74 46          $targetF
77b0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
77c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
77d0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
77e0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
77f0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7800: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
7810: 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e  iled to copy bin
7820: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
7830: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
7840: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
7850: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
7860: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
7870: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7880: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
7890: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
78a0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
78b0: 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c  form ""} {newFil
78c0: 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  eName ""} } {.. 
78d0: 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65 46       set sourceF
78e0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
78f0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
7900: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7910: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
7920: 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75 72 63  le exists $sourc
7930: 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  eFileName]} then
7940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7950: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7960: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7980: 2d 2d 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69  -- skipped copyi
7990: 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ng build file \"
79a0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
79b0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
79c0: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
79d0: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20  t exist\n"].... 
79e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20         return.. 
79f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7a00: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
7a10: 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d  th $newFileName]
7a20: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7a30: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
7a40: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
7a50: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  aryFileName $new
7a60: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
7a70: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
7a80: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
7a90: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
7aa0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
7ab0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
7ac0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
7ad0: 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61  ....      set ta
7ae0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66  rgetDirectory [f
7af0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72  ile dirname $tar
7b00: 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a  getFileName]....
7b10: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
7b20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7b30: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
7b40: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
7b50: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
7b70: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
7b80: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
7b90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7ba0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
7bb0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75  copy -force $sou
7bc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72  rceFileName $tar
7bd0: 67 65 74 46 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  getFileName}] ==
7be0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7bf0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7c00: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7c10: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7c20: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65       "---- copie
7c30: 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66 72 6f  d build file fro
7c40: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
7c50: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
7c60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7c70: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
7c80: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
7c90: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
7ca0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7cb0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7cc0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7cd0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
7ce0: 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c 65 20  copy build file 
7cf0: 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65  from \"" $source
7d00: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
7d10: 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20 5c          "\" to \
7d20: 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  "" $targetFileNa
7d30: 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  me \"\n]..      
7d40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7d50: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42   proc tryDeleteB
7d60: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
7d70: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
7d80: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  "} } {..      se
7d90: 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  t fileName [getB
7da0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
7db0: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
7dc0: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
7dd0: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  ![file exists $f
7de0: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
7df0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
7e00: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7e10: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
7e20: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
7e30: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
7e40: 67 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  g binary file \"
7e50: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
7e60: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
7e70: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
7e80: 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  t\n"]....       
7e90: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
7ea0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
7eb0: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
7ec0: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
7ed0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7ee0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
7ef0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
7f00: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
7f10: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
7f20: 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  ed binary file \
7f30: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
7f40: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
7f50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7f60: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7f70: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7f90: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
7fa0: 65 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20  ete binary file 
7fb0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22  \"" $fileName \"
7fc0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
7fd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
7fe0: 20 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46   tryDeleteBuildF
7ff0: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
8000: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
8010: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
8020: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
8030: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
8040: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
8050: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
8060: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
8070: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8080: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8090: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
80a0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
80b0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
80c0: 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c 64  d deleting build
80d0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
80e0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
80f0: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8100: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d  not exist\n"]...
8110: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
8120: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
8130: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
8140: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
8150: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
8160: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8170: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8180: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
81a0: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
81b0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
81c0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
81d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
81e0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
81f0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8200: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8210: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8220: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
8230: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
8240: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
8250: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8260: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
8270: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
8280: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8290: 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  {pdb true} } {..
82a0: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
82b0: 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
82c0: 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20   $platform....  
82d0: 20 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68      if {$pdb} th
82e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72  en {..        tr
82f0: 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 5b  yCopyBuildFile [
8300: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
8310: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
8320: 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61  rootname $fileNa
8330: 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61 74 66  me] .pdb] $platf
8340: 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  orm..      }..  
8350: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8360: 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62   tryDeleteAssemb
8370: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8380: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62  latform ""} {pdb
8390: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
83a0: 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72    tryDeleteBinar
83b0: 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  yFile $fileName 
83c0: 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20  $platform....   
83d0: 20 20 20 69 66 20 7b 24 70 64 62 7d 20 74 68 65     if {$pdb} the
83e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 72 79  n {..        try
83f0: 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65  DeleteBinaryFile
8400: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8410: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
8420: 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65  e rootname $file
8430: 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70 6c 61  Name] .pdb] $pla
8440: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d 0d 0a  tform..      }..
8450: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8460: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
8470: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
8480: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
8490: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
84a0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
84b0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
84c0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
84d0: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
84e0: 7b 73 65 74 20 61 73 73 65 6d 62 6c 79 20 5c 0d  {set assembly \.
84f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
8500: 6f 62 6a 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61  object load -loa
8510: 64 74 79 70 65 20 46 69 6c 65 20 2d 61 6c 69 61  dtype File -alia
8520: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 5d 20 3d  s $fileName]}] =
8530: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
8540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8550: 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64 64  # NOTE: Now, add
8560: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 74   the necessary t
8570: 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0d  est constraint..
8580: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8590: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
85a0: 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  t [file rootname
85b0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
85c0: 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eName]]....     
85d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
85e0: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 69  NOTE: Grab the i
85f0: 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72  mage runtime ver
8600: 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 73  sion from the as
8610: 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d 0a  sembly because..
8620: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8630: 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72 65  several tests re
8640: 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67 20  ly on it having 
8650: 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65 2e  a certain value.
8660: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
8670: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
8680: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  nt [appendArgs [
8690: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
86a0: 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20 20  ame] _ \..      
86b0: 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c 79        [$assembly
86c0: 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72   ImageRuntimeVer
86d0: 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  sion]]....      
86e0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
86f0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
8700: 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68 65  full path of the
8710: 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a 20   loaded file... 
8720: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
8730: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
8740: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
8750: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
8760: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8770: 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64 79  oc isSQLiteReady
8780: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
8790: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
87a0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  is procedure mus
87b0: 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  t return non-zer
87c0: 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53 51  o only if the SQ
87d0: 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20 20  Lite native..   
87e0: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
87f0: 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74 65  ry and the Syste
8800: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
8810: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 61  naged assembly a
8820: 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  re loaded..     
8830: 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
8840: 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
8850: 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20 43  e test suite.  C
8860: 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20 70  urrently, this p
8870: 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20 20  rocedure..      
8880: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
8890: 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61 66  e called only af
88a0: 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61 64  ter the [tryLoad
88b0: 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65 64  Assembly] proced
88c0: 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20 23  ure has..      #
88d0: 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c 6c         been call
88e0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 20  ed to probe for 
88f0: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
8900: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
8910: 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23  ssembly..      #
8920: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 5b         and the [
8930: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d 20  checkForSQLite] 
8940: 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62 65  procedure has be
8950: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  en called to pro
8960: 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20  be for..      # 
8970: 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74 65        the SQLite
8980: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 3b   native library;
8990: 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   otherwise, this
89a0: 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20   procedure will 
89b0: 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23 20  simply..      # 
89c0: 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65 74        always ret
89d0: 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20 20  urn zero...     
89e0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
89f0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
8a00: 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
8a10: 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
8a20: 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43 6f  Lite] && [haveCo
8a30: 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65 5d  nstraint SQLite]
8a40: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
8a50: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d  }.....    proc m
8a60: 61 74 63 68 4d 61 63 68 69 6e 65 20 7b 20 70 6c  atchMachine { pl
8a70: 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20 20  atform } {..    
8a80: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8a90: 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69  E: An empty stri
8aa0: 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74 66  ng for the platf
8ab0: 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 74  orm means that t
8ac0: 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74 0d  he build is not.
8ad0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
8ae0: 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61 74  primarily] a nat
8af0: 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72 65  ive build; there
8b00: 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73 20  fore, it always 
8b10: 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20 20  matches...      
8b20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
8b30: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
8b40: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
8b50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
8b60: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
8b70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
8b80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
8b90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
8ba0: 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75 70  latform match up
8bb0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
8bc0: 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20 20  process?..      
8bd0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 6c  #..      if {$pl
8be0: 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68 69  atform eq [machi
8bf0: 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a  neToPlatform $::
8c00: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63  tcl_platform(mac
8c10: 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  hine)]} then {..
8c20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
8c30: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
8c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8c50: 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63 69   NOTE: The speci
8c60: 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64 6f  fied platform do
8c70: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70 20  es not match up 
8c80: 77 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f 72  with the platfor
8c90: 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  m..      #      
8ca0: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
8cb0: 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20   process...     
8cc0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
8cd0: 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c   false..    }...
8ce0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
8cf0: 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
8d00: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
8d10: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
8d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8d30: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65  OTE: Check for e
8d40: 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61  very possible va
8d50: 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  lid combination 
8d60: 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20 77  of values used w
8d70: 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hen..      #    
8d80: 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20     locating out 
8d90: 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74  the build output
8da0: 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77   directory, show
8db0: 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61 62  ing each availab
8dc0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
8dd0: 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f    build variatio
8de0: 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  n along the way.
8df0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8e00: 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20   foreach native 
8e10: 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75 65  [list false true
8e20: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  ] {..        for
8e30: 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42 75  each year [getBu
8e40: 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20  ildYears] {..   
8e50: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63         foreach c
8e60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
8e70: 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
8e80: 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ions] {..       
8e90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8ea0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
8eb0: 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
8ec0: 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74 66  tive build platf
8ed0: 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a 20  orm.  This is.. 
8ee0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8ef0: 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74     based on whet
8f00: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70 72  her or not a [pr
8f10: 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65 20  imarily] native 
8f20: 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20 20  build..         
8f30: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62 65     #       is be
8f40: 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20 5b  ing used.  For [
8f50: 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e  primarily] non-n
8f60: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a 20  ative builds,.. 
8f70: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
8f80: 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
8f90: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
8fa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
8fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
8fc0: 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42 75   platform [getBu
8fd0: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
8fe0: 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ive]....        
8ff0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9000: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9020: 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67    "---- checking
9030: 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61   for System.Data
9040: 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c 22  .SQLite build \"
9050: 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20 20  " [expr \..     
9060: 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74             {$nat
9070: 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20  ive ? "native/" 
9080: 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73  : ""}] [expr {[s
9090: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a  tring length \..
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
90c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70 6c   [appendArgs $pl
90d0: 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d  atform /] : ""}]
90e0: 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20 20   $year \..      
90f0: 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f 6e            / $con
9100: 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e 2e  figuration "\"..
9110: 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
9120: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9130: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
9140: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
9150: 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
9160: 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61  here the necessa
9170: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
9180: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
9190: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
91a0: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
91b0: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
91c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
91d0: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
91e0: 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64 44  tory [joinBuildD
91f0: 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65  irectory $native
9200: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9210: 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61 73      [getBuildBas
9220: 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65 61  eDirectory] $yea
9230: 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e  r $platform $con
9240: 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20  figuration].... 
9250: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
9260: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
9270: 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73 61  : Do the necessa
9280: 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f 20  ry files exist? 
9290: 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f   Currently, no o
92a0: 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20 20  ther steps..    
92b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
92c0: 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65 72  are taken to ver
92d0: 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20 69  ify this build i
92e0: 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62 6c  s actually viabl
92f0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
9300: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
9310: 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69 6c  f {[isBuildAvail
9320: 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64 69  able $native $di
9330: 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
9340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9350: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
9360: 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e   # NOTE: When in
9370: 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20   "select" mode, 
9380: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
9390: 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d 0a  lect the first..
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
93b0: 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65 20        available 
93c0: 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e  build of System.
93d0: 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64 20  Data.SQLite and 
93e0: 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20 20  then return..   
93f0: 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
9400: 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0d     immediately..
9410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
9420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9430: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
9440: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
9450: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
9460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9470: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
9480: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e 75      # NOTE: Manu
9490: 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61 6c  ally override al
94a0: 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  l the build dire
94b0: 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e 0d  ctory selection.
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94d0: 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65 64   #       related
94e0: 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 69   test settings i
94f0: 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63 65  n order to force
9500: 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20 20   this build..   
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
9520: 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e 44       of System.D
9530: 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
9540: 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20   used...        
9550: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9560: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
9570: 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72  t invoke Interpr
9580: 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 5b  eter.GetActive [
9590: 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20  expr {$native ? 
95a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
95b0: 20 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69         "AddRunti
95c0: 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d  meOption" : "Rem
95d0: 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  oveRuntimeOption
95e0: 22 7d 5d 20 20 6e 61 74 69 76 65 0d 0a 0d 0a 20  "}]  native.... 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9600: 65 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24  et ::test_year $
9610: 79 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  year..          
9620: 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74        set ::test
9630: 5f 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66  _platform $platf
9640: 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
9650: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
9660: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63  configuration $c
9670: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a  onfiguration....
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
96a0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96c0: 20 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64    "yes, selected
96d0: 20 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69   (" [expr {$nati
96e0: 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
96f0: 20 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20   ""}] \..       
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
9710: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
9720: 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
9730: 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
9740: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9750: 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d         $platform
9760: 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72   /] : ""}] $year
9770: 20 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f   / $configuratio
9780: 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  n ")\n"]....    
9790: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
97a0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20  rn true..       
97b0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
97c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
97d0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
97e0: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  yes\n..         
97f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9800: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9810: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
9820: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
9830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9840: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
9850: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
9860: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
9870: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
9880: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
9890: 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
98a0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
98b0: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
98c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
98d0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
98e0: 70 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66  past releases of
98f0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
9900: 69 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63  ite in the direc
9910: 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  tory..      #   
9920: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e      contained in
9930: 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74   the "System.Dat
9940: 61 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f  a.SQLite" enviro
9950: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20  nment variable, 
9960: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
9970: 20 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20    present...    
9980: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
9990: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
99a0: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
99b0: 4c 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20  Lite)] && \..   
99c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
99d0: 65 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73  ength $::env(Sys
99e0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29  tem.Data.SQLite)
99f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
9a00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9a10: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
9a20: 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
9a30: 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68  ied directory wh
9a40: 65 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ere the necessar
9a50: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
9a60: 20 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f     components fo
9a70: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
9a80: 4c 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66  Lite should be f
9a90: 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ound...        #
9aa0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69  ..        set di
9ab0: 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61  rectory [file na
9ac0: 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
9ad0: 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
9ae0: 20 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d     $::env(System
9af0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67  .Data.SQLite) [g
9b00: 65 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e  etReleaseVersion
9b10: 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ]]]....        t
9b20: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
9b30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9b40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
9b50: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
9b60: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72  em.Data.SQLite r
9b70: 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  elease \"" \..  
9b80: 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63            $direc
9b90: 74 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  tory "\"... "]..
9ba0: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
9bb0: 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c  sReleaseAvailabl
9bc0: 65 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61  e $directory pla
9bd0: 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  tform]} then {..
9be0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
9bf0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
9c00: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
9c10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9c20: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9c30: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9c40: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
9c50: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
9c60: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
9c70: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
9c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
9c90: 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74  t ::build_direct
9ca0: 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a  ory $directory..
9cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
9cc0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
9cd0: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
9ce0: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
9cf0: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
9d00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9d10: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
9d20: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
9d40: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9d50: 67 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74  gs "yes (" $plat
9d60: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  form ")\n"]..   
9d70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9d80: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
9d90: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
9da0: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
9db0: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70         foreach p
9dc0: 61 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72  ath [lsort -decr
9dd0: 65 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73  easing [file lis
9de0: 74 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d  t $directory *]]
9df0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9e00: 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
9e10: 20 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65   $path] && [file
9e20: 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61   isdirectory $pa
9e30: 74 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  th]} then {..   
9e40: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
9e50: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
9e60: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
9e70: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9e80: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79   checking for Sy
9e90: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9ea0: 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a   release \"" \..
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22    $path "\"... "
9ed0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
9ee0: 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73     if {[isReleas
9ef0: 65 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68  eAvailable $path
9f00: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
9f10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9f20: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
9f30: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
9f40: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f60: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75    set platform u
9f70: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
9f80: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9fa0: 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74  {$select && [mat
9fb0: 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74 66  chMachine $platf
9fc0: 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  orm]} then {..  
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65  set ::build_dire
9ff0: 63 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20  ctory $path.... 
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a020: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
a030: 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70  , selected (" $p
a040: 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a  latform ")\n"]..
a050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a060: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
a070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a080: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a0a0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a0b0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
a0c0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
a0d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a0e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a0f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
a110: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
a120: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a130: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
a140: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
a150: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
a160: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
a170: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
a180: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
a190: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
a1a0: 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  - environment va
a1b0: 72 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e  riable \"System.
a1c0: 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73  Data.SQLite\" is
a1d0: 20 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20   not " \..      
a1e0: 20 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70        "set, skip
a1f0: 70 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72  ping check for r
a200: 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a  eleases...\n"]..
a210: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a220: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
a230: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a240: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
a250: 4c 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65  Library { channe
a260: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
a270: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
a280: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
a290: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a2a0: 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ry... "....     
a2b0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
a2d0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
a2e0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73  s +NonPublic Sys
a2f0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
a300: 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20 20  SQLite3 \..     
a310: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 56           SQLiteV
a320: 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d  ersion} version]
a330: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
a340: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a350: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
a360: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
a370: 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c  version was null
a380: 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69  .  If so, make i
a390: 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20  t easy..        
a3a0: 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e  #       to spot.
a3b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a3c0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a3d0: 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e   length $version
a3e0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a3f0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65            set ve
a400: 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20  rsion null..    
a410: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a420: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
a430: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71  TE: Attempt to q
a440: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a450: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a460: 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65  r for the SQLite
a470: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
a480: 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d    core library..
a490: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a4a0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
a4b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a4c0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
a4d0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
a4e0: 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  c System.Data.SQ
a4f0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a  Lite.SQLite3 \..
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64 7d 20  SQLiteSourceId} 
a520: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
a530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
a540: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
a550: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
a560: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
a570: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
a580: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
a590: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a5a0: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
a5b0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
a5c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a5d0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
a5e0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
a5f0: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
a600: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
a610: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
a620: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
a630: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
a640: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a650: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
a660: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
a670: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
a680: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
a690: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
a6a0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a6b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a6c0: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
a6d0: 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
a6e0: 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ry appears to be
a6f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20   available...   
a700: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a710: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
a720: 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Lite....        
a730: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a740: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20  appendArgs "yes 
a750: 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20  (" $version " " 
a760: 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d  $sourceId ")\n"]
a770: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
a780: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
a790: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
a7a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
a7b0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
a7c0: 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70  ForSQLiteInterop
a7d0: 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a   { channel } {..
a7e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a7f0: 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b  nnel "---- check
a800: 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69  ing for SQLite i
a810: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
a820: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
a830: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
a840: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
a850: 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
a860: 4e 6f 6e 50 75 62 6c 69 63 20 53 79 73 74 65 6d  NonPublic System
a870: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
a880: 69 74 65 33 20 5c 0d 0a 20 20 20 20 20 20 20 20  ite3 \..        
a890: 20 20 20 20 20 20 49 6e 74 65 72 6f 70 56 65 72        InteropVer
a8a0: 73 69 6f 6e 7d 20 76 65 72 73 69 6f 6e 5d 20 3d  sion} version] =
a8b0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
a8c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a8d0: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
a8e0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65   the returned ve
a8f0: 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20  rsion was null. 
a900: 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20   If so, make it 
a910: 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20  easy..        # 
a920: 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a        to spot...
a930: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a940: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
a950: 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20  ength $version] 
a960: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a970: 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73          set vers
a980: 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  ion null..      
a990: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
a9a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
a9b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65  : Attempt to que
a9c0: 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f  ry the Fossil so
a9d0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
a9e0: 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a  for the SQLite..
a9f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
aa00: 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20  core library... 
aa10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aa20: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
aa50: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
aa60: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
aa70: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
aa90: 74 65 72 6f 70 53 6f 75 72 63 65 49 64 7d 20 73  teropSourceId} s
aaa0: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
aab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
aac0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
aad0: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
aae0: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
aaf0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
ab00: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
ab10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ab20: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
ab30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ab40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ab50: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
ab60: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
ab70: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
ab80: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
ab90: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
aba0: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
abb0: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
abc0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
abd0: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
abe0: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
abf0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ac00: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
ac10: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
ac20: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ac30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
ac40: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
ac50: 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
ac60: 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74 6f  embly appears to
ac70: 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a   be available...
ac80: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ac90: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
aca0: 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a   SQLiteInterop..
acb0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
acc0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
acd0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76 65  Args "yes (" $ve
ace0: 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72 63  rsion " " $sourc
acf0: 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  eId ")\n"]..    
ad00: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ad10: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ad20: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
ad30: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
ad40: 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
ad50: 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
ad60: 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  t { channel name
ad70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
ad80: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ad90: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
ada0: 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
adb0: 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
adc0: 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e 65  ta.SQLite define
add0: 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24 6e   constant \"" $n
ade0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
adf0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
ae00: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
ae10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ae20: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
ae30: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
ae40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ae50: 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20  te.SQLite3 \..  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 44 65 66 69              Defi
ae70: 6e 65 43 6f 6e 73 74 61 6e 74 73 7d 20 64 65 66  neConstants} def
ae80: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d  ineConstants] ==
ae90: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
aea0: 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63 68      if {[lsearch
aeb0: 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65 20   -exact -nocase 
aec0: 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73  $defineConstants
aed0: 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74   $name] != -1} t
aee0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
aef0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
af00: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20  NOTE: Yes, this 
af10: 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20  define constant 
af20: 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e  was enabled when
af30: 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20 20   the managed..  
af40: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
af50: 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d  assembly was com
af60: 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  piled...        
af70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
af80: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
af90: 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65 43  pendArgs defineC
afa0: 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44  onstant.System.D
afb0: 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61 6d  ata.SQLite. $nam
afc0: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
afd0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
afe0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
aff0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
b000: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
b010: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
b020: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
b030: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
b040: 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
b050: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b060: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
b070: 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  tDateTimeFormat 
b080: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
b090: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
b0a0: 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d 70  s procedure simp
b0b0: 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20 22  ly returns the "
b0c0: 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69 6d  default" DateTim
b0d0: 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a 20  e format used.. 
b0e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79 20       #       by 
b0f0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
b100: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b110: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
b120: 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72 6d   ::datetime_form
b130: 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  at] && \..      
b140: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
b150: 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66  th $::datetime_f
b160: 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e  ormat] > 0} then
b170: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b180: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
b190: 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61 6c  eturn the manual
b1a0: 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76 61  ly overridden va
b1b0: 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74 65  lue for the Date
b1c0: 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20 20  Time format...  
b1d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b1e0: 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65 74   return $::datet
b1f0: 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20 20  ime_format..    
b200: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
b210: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
b220: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61 6e   NOTE: Return an
b230: 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69 6d   ISO8601 DateTim
b240: 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74 69  e format compati
b250: 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65 2c  ble with SQLite,
b260: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
b270: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b280: 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61 62  Lite, and suitab
b290: 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72 69  le for round-tri
b2a0: 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d 0a  pping with the..
b2b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b2c0: 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20 6f  DateTime class o
b2d0: 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 2e  f the framework.
b2e0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b2f0: 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20 20  is changed,..   
b300: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
b310: 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20 66  ious tests may f
b320: 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ail...        #.
b330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b340: 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d  "yyyy-MM-dd HH:m
b350: 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d 0a  m:ss.FFFFFFFK"..
b360: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
b370: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75 6d  ...    proc enum
b380: 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65  erableToList { e
b390: 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20  numerable } {.. 
b3a0: 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20       set result 
b3b0: 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  [list]....      
b3c0: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
b3d0: 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20  th $enumerable] 
b3e0: 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61  == 0 || $enumera
b3f0: 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74  ble eq "null"} t
b400: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
b410: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
b420: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b430: 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d  object foreach -
b440: 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75 6d  alias item $enum
b450: 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20  erable {..      
b460: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
b470: 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d  ngth $item] > 0}
b480: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b490: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
b4a0: 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69 6e  t [$item ToStrin
b4b0: 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  g]..        }.. 
b4c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
b4d0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
b4e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b4f0: 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75 72  oc catchAndRetur
b500: 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61 63  n { script {stac
b510: 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b 73  kTrace false} {s
b520: 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d  trict true} } {.
b530: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
b540: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
b550: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
b560: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
b570: 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e 74  er in their cont
b580: 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  ext,..      #   
b590: 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62 6f      capturing bo
b5a0: 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e  th the result an
b5b0: 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  d the return cod
b5c0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
b5d0: 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74     set code [cat
b5e0: 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73  ch {uplevel 1 $s
b5f0: 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a  cript} result]..
b600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
b610: 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68 65   # NOTE: Did the
b620: 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65 64   script provided
b630: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e   by our caller N
b640: 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f  OT raise an erro
b650: 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r?..      #..   
b660: 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20 26     if {$strict &
b670: 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20  & $code == 0 || 
b680: 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64  !$strict && $cod
b690: 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a  e != 1} then {..
b6a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b6b0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
b6c0: 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c 69  ss.  Return a li
b6d0: 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74 75  st with the retu
b6e0: 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  rn code and the 
b6f0: 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20  result...       
b700: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
b710: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
b720: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
b730: 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b 54   elseif {$stackT
b740: 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  race} then {..  
b750: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b760: 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65   # NOTE: Failure
b770: 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77 61  .  Our caller wa
b780: 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  nts a full stack
b790: 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c 69   trace (if appli
b7a0: 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20  cable),..       
b7b0: 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
b7c0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b7d0: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
b7e0: 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62 61  the result verba
b7f0: 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  tim...        #.
b800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b810: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
b820: 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
b830: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
b840: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b850: 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20 63   Failure.  Our c
b860: 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20 77  aller does not w
b870: 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63 6b  ant a full stack
b880: 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20 20   trace (if..    
b890: 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c      #       appl
b8a0: 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e 20  icable), return 
b8b0: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b8c0: 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68 65  return code, the
b8d0: 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
b8e0: 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f 72  #       code for
b8f0: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b900: 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  , and the error 
b910: 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74 68  message up to th
b920: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
b930: 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74     point where t
b940: 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20 73  he stack trace s
b950: 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20  hould start...  
b960: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b970: 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74 72 69   set index [stri
b980: 6e 67 20 66 69 72 73 74 20 22 20 20 20 61 74 20  ng first "   at 
b990: 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20 48 41  " $result]; # HA
b9a0: 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a 0d  CK: Reliable?...
b9b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b9c0: 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a 65  [list $code $::e
b9d0: 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72 20 7b  rrorCode [expr {
b9e0: 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20 5c  $index != -1 ? \
b9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 73  ..            [s
ba00: 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72 69  tring trim [stri
ba10: 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75 6c 74  ng range $result
ba20: 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24 72   0 $index]] : $r
ba30: 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20 20  esult}]]..      
ba40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
ba50: 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53 68   proc compileCSh
ba60: 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20 20  arpWith {..     
ba70: 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d 6f         text memo
ba80: 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69 63  ry symbols stric
ba90: 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65  t resultsVarName
baa0: 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20 66   errorsVarName f
bab0: 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20  ileNames..      
bac0: 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d 0a        args } {..
bad0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bae0: 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65 20   NOTE: Since we 
baf0: 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73 65  are going to use
bb00: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61 6d   this method nam
bb10: 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e 20  e a lot, assign 
bb20: 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20 23  it to a..      #
bb30: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20         variable 
bb40: 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d  first...      #.
bb50: 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20 52  .      set add R
bb60: 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62 6c  eferencedAssembl
bb70: 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20 20  ies.Add....     
bb80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bb90: 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73  : Create the bas
bba0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
bbb0: 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68  luate and add th
bbc0: 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74 69  e property setti
bbd0: 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ngs..      #    
bbe0: 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d 6f     that are almo
bbf0: 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65 64  st always needed
bc00: 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65 73   by our unit tes
bc10: 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79 73  ts (i.e. the Sys
bc20: 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tem..      #    
bc30: 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61     and System.Da
bc40: 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  ta assembly refe
bc50: 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20 20  rences)...      
bc60: 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 6d  #..      set com
bc70: 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  mand [list \..  
bc80: 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65 43          compileC
bc90: 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65 6d  Sharp $text $mem
bca0: 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73 74  ory $symbols $st
bcb0: 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72 72  rict results err
bcc0: 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ors \..         
bcd0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c 6c   $add System.dll
bce0: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61 74   $add System.Dat
bcf0: 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65  a.dll $add Syste
bd00: 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e 64  m.Transactions.d
bd10: 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ll \..          
bd20: 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e  $add System.Xml.
bd30: 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  dll]....      #.
bd40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
bd50: 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76 69  dd all the provi
bd60: 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20 61  ded file names a
bd70: 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65 72  s assembly refer
bd80: 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ences...      #.
bd90: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66  .      foreach f
bda0: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
bdb0: 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c 61  es {..        la
bdc0: 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24 61  ppend command $a
bdd0: 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  dd [getBinaryFil
bde0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  eName $fileName]
bdf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
be00: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
be10: 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74 72  TE: Add the extr
be20: 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66 20  a arguments, if 
be30: 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d 6d  any, to the comm
be40: 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 2e  and to evaluate.
be50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
be60: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f   eval lappend co
be70: 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20  mmand $args.... 
be80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
be90: 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65 20  NOTE: Alias the 
bea0: 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20 72  compiler local r
beb0: 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f 72  esults and error
bec0: 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 74  s variables to t
bed0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
bee0: 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73    variable names
bef0: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
bf00: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
bf10: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
bf20: 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65   $resultsVarName
bf30: 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20 20 20   results..      
bf40: 75 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56  upvar 1 $errorsV
bf50: 61 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 0d  arName errors...
bf60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bf70: 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74 65  # NOTE: Evaluate
bf80: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
bf90: 20 5b 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 5d   [compileCSharp]
bfa0: 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65 74   command and ret
bfb0: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
bfc0: 20 20 20 20 20 20 20 72 65 73 75 6c 74 2e 0d 0a         result...
bfd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 65        #..      e
bfe0: 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20  val $command..  
bff0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
c000: 20 69 73 4d 65 6d 6f 72 79 44 62 20 7b 20 66 69   isMemoryDb { fi
c010: 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20  leName } {..    
c020: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c030: 45 3a 20 49 73 20 74 68 65 20 73 70 65 63 69 66  E: Is the specif
c040: 69 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ied database fil
c050: 65 20 6e 61 6d 65 20 72 65 61 6c 6c 79 20 61 6e  e name really an
c060: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
c070: 61 73 65 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase?..      #.. 
c080: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
c090: 72 20 7b 24 66 69 6c 65 4e 61 6d 65 20 65 71 20  r {$fileName eq 
c0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d  ":memory:" || \.
c0b0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
c0c0: 6e 67 20 72 61 6e 67 65 20 24 66 69 6c 65 4e 61  ng range $fileNa
c0d0: 6d 65 20 30 20 31 32 5d 20 65 71 20 22 66 69 6c  me 0 12] eq "fil
c0e0: 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20  e::memory:"}].. 
c0f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c100: 63 20 69 73 54 61 62 6c 65 49 6e 44 62 20 7b 20  c isTableInDb { 
c110: 6e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64 62  name {varName db
c120: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
c130: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
c140: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
c150: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
c160: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
c170: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
c180: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
c190: 61 6c 6c 65 72 2e 20 20 49 74 20 63 6f 6e 74 61  aller.  It conta
c1a0: 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
c1b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
c1c0: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 0d  le that will be.
c1d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
c1e0: 73 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  sed to execute t
c1f0: 68 65 20 71 75 65 72 79 20 75 73 65 64 20 74 6f  he query used to
c200: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
c210: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c220: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c230: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20  present in that 
c240: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
c250: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
c260: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
c270: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c280: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
c290: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
c2a0: 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
c2b0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
c2c0: 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
c2d0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
c2e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0d 0a   the database...
c2f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
c300: 65 74 20 73 71 6c 20 7b 0d 0a 20 20 20 20 20 20  et sql {..      
c310: 20 20 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 2a    SELECT COUNT(*
c320: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
c330: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 20  ster WHERE type 
c340: 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61  = 'table' AND na
c350: 6d 65 20 3d 20 3f 3b 0d 0a 20 20 20 20 20 20 7d  me = ?;..      }
c360: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c370: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
c380: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  n non-zero if th
c390: 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73  e named table is
c3a0: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
c3b0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
c3c0: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
c3d0: 20 20 5b 73 71 6c 20 65 78 65 63 75 74 65 20 2d    [sql execute -
c3e0: 65 78 65 63 75 74 65 20 73 63 61 6c 61 72 20 24  execute scalar $
c3f0: 64 62 20 24 73 71 6c 20 5b 6c 69 73 74 20 70 61  db $sql [list pa
c400: 72 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d  ram1 String $nam
c410: 65 5d 5d 20 3e 20 30 0d 0a 20 20 20 20 20 20 7d  e]] > 0..      }
c420: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
c430: 20 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20   proc trimSql { 
c440: 73 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72  sql } {..      r
c450: 65 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61  eturn [regsub -a
c460: 6c 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72  ll -- {\s+} [str
c470: 69 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22  ing trim $sql] "
c480: 20 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   "]..    }..... 
c490: 20 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53     proc executeS
c4a0: 71 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74  ql { sql {execut
c4b0: 65 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20  e none} {format 
c4c0: 6e 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20  none} {fileName 
c4d0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
c4e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
c4f0: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20  h $fileName] == 
c500: 30 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c  0} then {set fil
c510: 65 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d  eName :memory:}.
c520: 0a 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24  .      setupDb $
c530: 66 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22  fileName "" "" "
c540: 22 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61  " "" "" false fa
c550: 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
c560: 64 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  db true....     
c570: 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20   try {..        
c580: 72 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20  return [uplevel 
c590: 31 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  1 [list \..     
c5a0: 20 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75         sql execu
c5b0: 74 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65  te -execute $exe
c5c0: 63 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f  cute -format $fo
c5d0: 72 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d  rmat $db $sql]].
c5e0: 0a 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79  .      } finally
c5f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6c 65 61   {..        clea
c600: 6e 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20  nupDb $fileName 
c610: 64 62 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66  db false false f
c620: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  alse..      }.. 
c630: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
c640: 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  c getConnectionF
c650: 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20  lags { fileName 
c660: 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c  flags {quiet fal
c670: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
c680: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c690: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
c6a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
c6b0: 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ame or connectio
c6c0: 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a  n string these..
c6d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
c6e0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
c6f0: 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70  ill actually app
c700: 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  ly to.  This is 
c710: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  not necessary.. 
c720: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
c730: 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75  quiet mode becau
c740: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
c750: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
c760: 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20   for logging..  
c770: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
c780: 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  reporting purpos
c790: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
c7a0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
c7b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c7c0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
c7d0: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
c7e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c7f0: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
c800: 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
c810: 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66  file name \"" $f
c820: 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20  ileName \"]..   
c830: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
c840: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
c850: 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a  taSource] && \..
c860: 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72              ![ar
c870: 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74  ray exists ::dat
c880: 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b  aSource]} then {
c890: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
c8a0: 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
c8b0: 41 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63  Args "data sourc
c8c0: 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75  e \"" $::dataSou
c8d0: 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  rce \"]..       
c8e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c8f0: 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
c900: 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20  e <unknown>..   
c910: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c920: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c930: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
c940: 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63  and log) the loc
c950: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
c960: 61 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f  ags and the asso
c970: 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20  ciated..      # 
c980: 20 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63        data sourc
c990: 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  e or file name..
c9a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c9b0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
c9c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
c9d0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
c9e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
c9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
ca00: 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63  --- local connec
ca10: 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22  tion flags for "
ca20: 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20   $database \..  
ca30: 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65 3a            " are:
ca40: 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e   " [expr {[strin
ca50: 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d  g length $flags]
ca60: 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20 20   > 0 ? \..      
ca70: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
ca80: 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
ca90: 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
caa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cab0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
cac0: 54 45 3a 20 49 66 20 74 68 65 72 65 20 61 72 65  TE: If there are
cad0: 20 61 6e 79 20 67 6c 6f 62 61 6c 20 28 70 65 72   any global (per
cae0: 20 74 65 73 74 20 72 75 6e 29 20 63 6f 6e 6e 65   test run) conne
caf0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 75 72 72  ction flags curr
cb00: 65 6e 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  ently..      #  
cb10: 20 20 20 20 20 73 65 74 2c 20 75 73 65 20 74 68       set, use th
cb20: 65 6d 20 6e 6f 77 20 28 69 2e 65 2e 20 62 79 20  em now (i.e. by 
cb30: 63 6f 6d 62 69 6e 69 6e 67 20 74 68 65 6d 20 77  combining them w
cb40: 69 74 68 20 74 68 65 20 6f 6e 65 73 20 66 6f 72  ith the ones for
cb50: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
cb60: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 29       connection)
cb70: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cb80: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
cb90: 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  ts ::connection_
cba0: 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a 20 20 20  flags] && \..   
cbb0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
cbc0: 65 6e 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74  ength $::connect
cbd0: 69 6f 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 7d 20  ion_flags] > 0} 
cbe0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
cbf0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
cc00: 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
cc10: 29 20 74 68 65 20 64 65 74 65 63 74 65 64 20 67  ) the detected g
cc20: 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  lobal connection
cc30: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20   flags...       
cc40: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
cc50: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
cc60: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
cc70: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
cc80: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
cca0: 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65  --- global conne
ccb0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65  ction flags dete
ccc0: 63 74 65 64 3a 20 22 20 5c 0d 0a 20 20 20 20 20  cted: " \..     
ccd0: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
cce0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
ccf0: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
cd00: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
cd10: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
cd20: 67 74 68 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  gth $::connectio
cd30: 6e 5f 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20 5c  n_flags] > 0 ? \
cd40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cd50: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
cd60: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
cd70: 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e  gs \"] : "<none>
cd80: 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  "}] \n]..       
cd90: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
cda0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
cdb0: 20 43 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20   Combine and/or 
cdc0: 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e  replace the conn
cdd0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64  ection flags and
cde0: 20 74 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a   then show the..
cdf0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
ce00: 6e 65 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20  new value...    
ce10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
ce20: 65 74 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e  et flags [combin
ce30: 65 46 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a  eFlags $flags $:
ce40: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
ce50: 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  s]....        #.
ce60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
ce70: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
ce80: 74 68 65 20 6e 65 77 20 65 66 66 65 63 74 69 76  the new effectiv
ce90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
cea0: 67 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  gs...        #..
ceb0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
cec0: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
ced0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
cee0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
cef0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
cf00: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
cf10: 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63 74  combined connect
cf20: 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
cf30: 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
cf40: 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
cf50: 3a 20 22 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  : " [expr {[stri
cf60: 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
cf70: 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20  ] > 0 ? \..     
cf80: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
cf90: 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73 20 5c  Args \" $flags \
cfa0: 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20  "] : "<none>"}] 
cfb0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
cfc0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
cfd0: 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73 0d 0a   return $flags..
cfe0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
cff0: 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f 70 65  oc getFlagsPrope
d000: 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22 22 7d  rty { {flags ""}
d010: 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
d020: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
d030: 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
d040: 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20 63 6f  mine what the co
d050: 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c 20 61  mbined (global a
d060: 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e 65 63  nd local) connec
d070: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
d080: 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75 6c 64      flags should
d090: 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20 71 75   be, possibly qu
d0a0: 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ietly...      #.
d0b0: 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73  .      set flags
d0c0: 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46   [getConnectionF
d0d0: 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73 20 24  lags "" $flags $
d0e0: 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20  quiet]....      
d0f0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d100: 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20 6f 72   If no global or
d110: 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
d120: 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73 70 65  n flags were spe
d130: 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20 20 20  cified, the..   
d140: 20 20 20 23 20 20 20 20 20 20 20 64 65 66 61 75     #       defau
d150: 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  lt connection fl
d160: 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ags should be us
d170: 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 72  ed; therefore, r
d180: 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23 20 20  eturn..      #  
d190: 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74       an empty st
d1a0: 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73  ring in that cas
d1b0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
d1c0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d1d0: 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3d 3d  ength $flags] ==
d1e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d1f0: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
d200: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
d210: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d220: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63 68 65   In order to che
d230: 63 6b 20 69 66 20 74 68 65 20 64 65 66 61 75 6c  ck if the defaul
d240: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  t connection fla
d250: 67 73 20 61 72 65 20 62 65 69 6e 67 20 75 73 65  gs are being use
d260: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
d270: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
d280: 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20 63 6f   to attempt a co
d290: 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68 65 20  nversion to the 
d2a0: 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61 74 65  actual enumerate
d2b0: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
d2c0: 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e 67 20   type.  Failing 
d2d0: 74 68 61 74 2c 20 74 68 65 20 63 68 65 63 6b 20  that, the check 
d2e0: 61 67 61 69 6e 73 74 20 74 68 65 20 64 65 66 61  against the defa
d2f0: 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  ult value will b
d300: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
d310: 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
d320: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 65 72   #..      set er
d330: 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
d340: 52 45 44 0d 0a 20 20 20 20 20 20 73 65 74 20 76  RED..      set v
d350: 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e 76  alue [object inv
d360: 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79 50  oke Utility TryP
d370: 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22 22  arseFlagsEnum ""
d380: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
d390: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
d3a0: 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f  .SQLiteConnectio
d3b0: 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
d3c0: 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d 0a 20 20   null true \..  
d3d0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 5d 0d 0a          error]..
d3e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d3f0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
d400: 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67 73 20 73  combined flags s
d410: 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e 6f 74 20  tring could not 
d420: 61 63 74 75 61 6c 6c 79 20 62 65 20 63 6f 6e 76  actually be conv
d430: 65 72 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  erted..      #  
d440: 20 20 20 20 20 74 6f 20 74 68 65 20 65 6e 75 6d       to the enum
d450: 65 72 61 74 65 64 20 74 79 70 65 20 69 74 20 69  erated type it i
d460: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
d470: 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73 74 20 75  lue, then just u
d480: 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
d490: 20 20 69 74 20 76 65 72 62 61 74 69 6d 3b 20 6f    it verbatim; o
d4a0: 74 68 65 72 77 69 73 65 2c 20 6a 75 73 74 20 72  therwise, just r
d4b0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
d4c0: 74 72 69 6e 67 2e 20 20 49 6e 20 74 68 61 74 0d  tring.  In that.
d4d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
d4e0: 61 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74  ase, the default
d4f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
d500: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0d  s will be used..
d510: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
d520: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
d530: 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20 30 20  th $value] == 0 
d540: 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20 22 44 65  || $value ne "De
d550: 66 61 75 6c 74 22 7d 20 74 68 65 6e 20 7b 0d 0a  fault"} then {..
d560: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d570: 20 20 20 23 20 57 41 52 4e 49 4e 47 3a 20 54 68     # WARNING: Th
d580: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
d590: 74 72 69 6e 67 20 76 61 6c 75 65 20 6f 66 20 74  tring value of t
d5a0: 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67  he combined flag
d5b0: 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  s, not..        
d5c0: 23 20 20 20 20 20 20 20 20 20 20 74 68 65 20 65  #          the e
d5d0: 6e 75 6d 65 72 61 74 65 64 20 76 61 6c 75 65 2e  numerated value.
d5e0: 20 20 54 68 69 73 20 69 73 20 62 79 20 64 65 73    This is by des
d5f0: 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 6e  ign and should n
d600: 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ot..        #   
d610: 20 20 20 20 20 20 20 62 65 20 63 68 61 6e 67 65         be change
d620: 64 20 77 69 74 68 6f 75 74 20 63 61 72 65 66 75  d without carefu
d630: 6c 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20  l consideration 
d640: 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c 64 0d 0a  (e.g. it would..
d650: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
d660: 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 53     prevent the S
d670: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
d680: 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c 6c 6f 77  class from allow
d690: 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a 20 20 20  ing invalid..   
d6a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
d6b0: 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d 65 74 61  ["magical"] meta
d6c0: 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20 20 20 20  -flags)...      
d6d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
d6e0: 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
d6f0: 22 46 6c 61 67 73 3d 22 20 24 66 6c 61 67 73 20  "Flags=" $flags 
d700: 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  \;]..      }....
d710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
d720: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
d730: 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20  roc setupDb {.. 
d740: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
d750: 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64  ame {mode ""} {d
d760: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22  ateTimeFormat ""
d770: 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20  } {dateTimeKind 
d780: 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a  ""} {flags ""}..
d790: 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74              {ext
d7a0: 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20  ra ""} {qualify 
d7b0: 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72  true} {delete tr
d7c0: 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d  ue} {uri false}.
d7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65  .            {te
d7e0: 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76  mporary true} {v
d7f0: 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65  arName db} {quie
d800: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
d810: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
d820: 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
d830: 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
d840: 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
d850: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d860: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
d870: 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
d880: 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
d890: 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
d8a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
d8b0: 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
d8c0: 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65  st databases use
d8d0: 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  d by the test su
d8e0: 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a  ite are placed..
d8f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
d900: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d910: 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68  directory.  Each
d920: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
d930: 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20  lated files..   
d940: 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
d950: 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64  by a test should
d960: 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62   be cleaned up b
d970: 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
d980: 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  g the..      #  
d990: 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22       "cleanupDb"
d9a0: 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f   procedure, belo
d9b0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
d9c0: 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
d9d0: 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
d9e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
d9f0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
da00: 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
da10: 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
da20: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
da30: 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
da40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
da50: 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
da60: 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70  lt, delete any p
da70: 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61  re-existing data
da80: 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
da90: 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23  me file..      #
daa0: 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69         name if i
dab0: 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  t currently exis
dac0: 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
dad0: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
dae0: 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
daf0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
db00: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
db10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
db20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
db30: 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61  empt to delete a
db40: 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
db50: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
db60: 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
db70: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
db80: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
db90: 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
dba0: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
dbb0: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
dbc0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dbd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
dbe0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
dbf0: 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
dc00: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
dc10: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
dc20: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
dc30: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
dc40: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
dc50: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
dc60: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
dc70: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
dc80: 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
dc90: 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
dca0: 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
dcb0: 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
dcc0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
dcd0: 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
dce0: 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a  ng setup, error:
dcf0: 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
dd00: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
dd10: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
dd20: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
dd30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
dd40: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
dd50: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
dd60: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
dd70: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
dd80: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
dd90: 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
dda0: 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  le to the opened
ddb0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
ddc0: 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
ddd0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
dde0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
ddf0: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
de00: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
de10: 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65  art building the
de20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
de30: 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ng.  The only re
de40: 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a  quired portion..
de50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
de60: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
de70: 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61  string is the da
de80: 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68  ta source, which
de90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20   contains the.. 
dea0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
deb0: 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
dec0: 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20  itself.  If our 
ded0: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20  caller wants to 
dee0: 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20  use a URI as..  
def0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
df00: 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65  data source, use
df10: 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e   the FullUri con
df20: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
df30: 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20  roperty to..    
df40: 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e    #       preven
df50: 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  t the data sourc
df60: 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65  e string from be
df70: 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20  ing mangled...  
df80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
df90: 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$uri} then {.. 
dfa0: 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
dfb0: 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24  ction {FullUri=$
dfc0: 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
dfd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
dfe0: 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
dff0: 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65  ion {Data Source
e000: 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
e010: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e020: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e030: 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63   Since this proc
e040: 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65  edure has no spe
e050: 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  cial knowledge o
e060: 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75  f what the defau
e070: 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  lt..      #     
e080: 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72    setting is for
e090: 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20   the ToFullPath 
e0a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
e0b0: 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79  g propery, alway
e0c0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
e0d0: 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77   add the value w
e0e0: 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20  e know about to 
e0f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
e100: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  tring...      #.
e110: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f  .      append co
e120: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c  nnection {;ToFul
e130: 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d  lPath=${qualify}
e140: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
e150: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
e160: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
e170: 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f  ied a journal mo
e180: 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  de, add the nece
e190: 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
e1a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
e1b0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
e1c0: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
e1d0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
e1e0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
e1f0: 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ode] > 0} then {
e200: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
e210: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f   connection {;Jo
e220: 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64  urnal Mode=${mod
e230: 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
e240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e250: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
e260: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
e270: 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
e280: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
e290: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
e2a0: 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68     portion of th
e2b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
e2c0: 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
e2d0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
e2e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
e2f0: 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30  eTimeFormat] > 0
e300: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e310: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
e320: 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f  ion {;DateTimeFo
e330: 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46  rmat=${dateTimeF
e340: 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d  ormat}}..      }
e350: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
e360: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
e370: 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
e380: 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e  ed a DateTimeKin
e390: 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  d, add the neces
e3a0: 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
e3b0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
e3c0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
e3d0: 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
e3e0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
e3f0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
e400: 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d  teTimeKind] > 0}
e410: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e420: 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
e430: 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e  on {;DateTimeKin
e440: 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  d=${dateTimeKind
e450: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
e460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e470: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
e480: 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20   what the final 
e490: 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 63  flags for this c
e4a0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74  onnection need t
e4b0: 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  o be...      #..
e4c0: 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
e4d0: 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
e4e0: 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66  ags $fileName $f
e4f0: 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
e500: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e510: 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
e520: 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
e530: 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
e540: 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
e550: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
e560: 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
e570: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
e580: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
e590: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e5a0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e5b0: 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
e5c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e5d0: 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
e5e0: 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
e5f0: 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
e600: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e610: 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
e620: 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
e630: 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
e640: 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
e650: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
e660: 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
e670: 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
e680: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
e690: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
e6a0: 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
e6b0: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
e6c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
e6d0: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
e6e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e6f0: 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
e700: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e710: 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
e720: 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
e730: 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
e740: 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
e750: 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
e760: 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
e770: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
e780: 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
e790: 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
e7a0: 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
e7b0: 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
e7c0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e7d0: 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
e7e0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
e7f0: 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
e800: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
e810: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
e820: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
e830: 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
e840: 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
e850: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
e860: 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
e870: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
e880: 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
e890: 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
e8a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
e8b0: 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
e8c0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e8d0: 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
e8e0: 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
e8f0: 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
e900: 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
e910: 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
e920: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
e930: 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79     # NOTE: Alway
e940: 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  s return the con
e950: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75  nection handle u
e960: 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20  pon success...  
e970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
e980: 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a  urn $db..    }..
e990: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
e9a0: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
e9b0: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
e9c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e9d0: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
e9e0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
e9f0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
ea00: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
ea10: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
ea20: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
ea30: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
ea40: 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
ea50: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
ea60: 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
ea70: 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
ea80: 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
ea90: 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
eaa0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
eab0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
eac0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
ead0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
eae0: 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20  his returns the 
eaf0: 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65  ADO.NET IDbConne
eb00: 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73  ction object ins
eb10: 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20  tance for the.. 
eb20: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65       #       spe
eb30: 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68  cified databse h
eb40: 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65  andle.  Since ge
eb50: 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63  tting this objec
eb60: 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20  t relies upon.. 
eb70: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
eb80: 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72  le internals, gr
eb90: 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20  eat care should 
eba0: 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69  be taken to avoi
ebb0: 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a  d disposing of..
ebc0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
ebd0: 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68  is object or oth
ebe0: 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69  erwise putting i
ebf0: 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69  t into an invali
ec00: 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20  d state...      
ec10: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
ec20: 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74  fo exists db]} t
ec30: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
ec40: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
ec60: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
ec70: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
ec80: 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
ec90: 70 6f 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  pose \..        
eca0: 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20 49          -alias I
ecb0: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
ecc0: 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
ecd0: 20 49 74 65 6d 20 24 64 62 7d 20 5c 0d 0a 20 20   Item $db} \..  
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ecf0: 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
ed00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ed10: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ed20: 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
ed30: 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
ed40: 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
ed50: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ed60: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
ed70: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
ed80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
ed90: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
eda0: 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
edb0: 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
edc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
edd0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
ede0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
edf0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
ee00: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
ee10: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
ee20: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
ee30: 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
ee40: 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
ee50: 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
ee60: 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
ee70: 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
ee80: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
ee90: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
eea0: 63 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69  c freeDbConnecti
eeb0: 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f  on { {varName co
eec0: 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20  nnection} } {.. 
eed0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
eee0: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
eef0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
ef00: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e  iable (e.g. "con
ef10: 6e 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65  nection") in the
ef20: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ef30: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
ef40: 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71  aller.  The opaq
ef50: 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
ef60: 20 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d   for an ADO.NET.
ef70: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
ef80: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f  onnection previo
ef90: 75 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79  usly returned by
efa0: 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f   [getDbConnectio
efb0: 6e 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20  n] should be..  
efc0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72      #       stor
efd0: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
efe0: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
eff0: 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  1 $varName conne
f000: 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23  ction....      #
f010: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f020: 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76  Attempt to remov
f030: 65 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  e the opaque obj
f040: 65 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ect handle from 
f050: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d  the interpreter.
f060: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e  .      #       n
f070: 6f 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63  ow.  This [objec
f080: 74 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20  t dispose] call 
f090: 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
f0a0: 79 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  y dispose of the
f0b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f0c0: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63  underlying objec
f0d0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e  t because the +N
f0e0: 6f 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61  oDispose flag wa
f0f0: 73 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20  s set on it..   
f100: 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e     #       durin
f110: 67 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  g creation of th
f120: 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  e opaque object 
f130: 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
f140: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
f150: 6f 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74  o exists connect
f160: 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ion] && \..     
f170: 20 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a       [catch {obj
f180: 65 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e  ect dispose $con
f190: 6e 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d  nection} error]}
f1a0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f1b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
f1c0: 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
f1d0: 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  ailed to remove 
f1e0: 74 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f  the handle, repo
f1f0: 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20  rt why...       
f200: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
f210: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
f220: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d  .            "==
f240: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
f250: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e  ed to remove con
f260: 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c  nection handle \
f270: 22 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  "" $connection \
f280: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
f290: 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
f2a0: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
f2b0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
f2c0: 20 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f      proc addDbCo
f2d0: 6e 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65  nnection { conne
f2e0: 63 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64  ction {varName d
f2f0: 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  b} } {..      #.
f300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
f310: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
f320: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
f330: 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68  e.g. "db") in th
f340: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72  e context of our
f350: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f360: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
f370: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
f380: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
f390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
f3a0: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63  NOTE: Create a c
f3b0: 6f 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74  orrectly formatt
f3c0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ed name for the 
f3d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f3e0: 69 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  ion to..      # 
f3f0: 20 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74        be added t
f400: 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67  o the list manag
f410: 65 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20  ed by the Eagle 
f420: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
f430: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
f440: 20 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f   db [object invo
f450: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
f460: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
f470: 20 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65    Eagle._Compone
f480: 6e 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d  nts.Private.Form
f490: 61 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62  atOps DatabaseOb
f4a0: 6a 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63  jectName $connec
f4b0: 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  tion \..        
f4c0: 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69    SQLiteConnecti
f4d0: 6f 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  on [object invok
f4e0: 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  e Interpreter.Ge
f4f0: 74 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d  tActive NextId]]
f500: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f510: 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74     # NOTE: Add t
f520: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
f530: 65 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20  ection provided 
f540: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f  by our caller to
f550: 20 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20   the list..     
f560: 20 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73   #       of thos
f570: 65 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45  e known to the E
f580: 61 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72  agle interpreter
f590: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f5a0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
f5b0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
f5c0: 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
f5d0: 74 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69  tActive.connecti
f5e0: 6f 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20  ons Add \..     
f5f0: 20 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63       $db $connec
f600: 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  tion..    }.....
f610: 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
f620: 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
f630: 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
f640: 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
f650: 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
f670: 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
f680: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
f690: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
f6a0: 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
f6b0: 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
f6c0: 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
f6d0: 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
f6e0: 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
f6f0: 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
f700: 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
f710: 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
f720: 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
f730: 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
f740: 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
f750: 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
f760: 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
f770: 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
f780: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
f790: 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
f7a0: 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
f7b0: 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
f7c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
f7d0: 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
f7e0: 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
f7f0: 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
f800: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
f810: 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
f820: 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
f830: 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
f840: 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
f850: 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
f860: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
f870: 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
f880: 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
f890: 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
f8a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
f8b0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
f8c0: 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
f8d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
f8e0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
f8f0: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
f900: 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
f910: 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
f920: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
f930: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
f940: 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
f950: 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
f960: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
f970: 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
f980: 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
f990: 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
f9a0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
f9b0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
f9c0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
f9d0: 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
f9e0: 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
f9f0: 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
fa00: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
fa10: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
fa20: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fa30: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
fa40: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
fa50: 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
fa60: 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
fa70: 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
fa80: 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
fa90: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
faa0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fab0: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
fac0: 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
fad0: 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
fae0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
faf0: 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
fb00: 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
fb10: 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
fb20: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
fb30: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
fb40: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
fb50: 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
fb60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
fb70: 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
fb80: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
fb90: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
fba0: 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
fbb0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
fbc0: 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
fbd0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
fbe0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
fbf0: 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
fc00: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
fc10: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
fc20: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
fc30: 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
fc40: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
fc50: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
fc60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fc70: 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
fc80: 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
fc90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fca0: 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
fcb0: 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
fcc0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
fcd0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
fce0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fcf0: 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
fd00: 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
fd10: 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
fd20: 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
fd30: 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
fd40: 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
fd50: 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
fd60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
fd70: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
fd80: 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
fd90: 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
fda0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
fdb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
fdc0: 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
fdd0: 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
fde0: 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
fdf0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
fe00: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
fe10: 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
fe20: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
fe30: 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
fe40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
fe50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
fe60: 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
fe70: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
fe80: 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
fe90: 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
fea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
feb0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
fec0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
fed0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
fee0: 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
fef0: 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
ff00: 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
ff10: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
ff20: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
ff30: 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
ff40: 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
ff50: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
ff60: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
ff70: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
ff80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
ff90: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
ffa0: 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
ffb0: 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
ffc0: 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
ffd0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ffe0: 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
fff0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
10000 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
10010 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
10030 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
10040 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
10050 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
10060 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
10070 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
10080 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
10090 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
100a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
100b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
100c0 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
100d0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
100e0 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
100f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
10100 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
10110 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
10120 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
10130 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
10140 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
10150 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
10160 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
10170 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
10180 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
10190 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
101a0 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
101b0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
101c0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  tch {..        #
101d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
101e0 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
101f0 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20  script debugger 
10200 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64  and the isolated
10210 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72 65   interpreter are
10220 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
10230 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64    setup and read
10240 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
10250 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
10260 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
10270 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
10280 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
10290 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
102a0 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
102b0 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
102c0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
102d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
102e0 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a    debug eval {..
102f0 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
10300 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d  e require Eagle.
10310 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
10320 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
10330 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
10340 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
10350 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
10360 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10370 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10380 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
10390 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
103a0 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
103b0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
103c0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
103d0 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
103e0 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
103f0 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e  t_channel $chann
10400 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  el; # NOTE: For 
10410 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20  [tputs]...      
10420 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
10430 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
10440 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  $log; # NOTE: Fo
10450 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20  r [tlog].....   
10460 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10470 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
10480 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
10490 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
104a0 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
104b0 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
104c0 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
104d0 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
104e0 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
104f0 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
10500 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10510 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
10520 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  tc...        #..
10530 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
10540 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
10550 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
10560 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10570 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
10580 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63   if this callbac
10590 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
105a0 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
105b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
105c0 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c       if {"Cancel
105d0 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24  ed" in [split [$
105e0 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d  e InterruptType]
105f0 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a   ", "]} then {..
10600 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
10610 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
10620 45 3a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  E: Iterate throu
10630 67 68 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  gh all database 
10640 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77  connections know
10650 6e 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20  n to the..      
10660 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
10670 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
10680 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
10690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
106a0 6a 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c  ject foreach -al
106b0 69 61 73 20 70 61 69 72 20 5c 0d 0a 20 20 20 20  ias pair \..    
106c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a              [obj
106d0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
106e0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 24 65 20  s +NonPublic $e 
106f0 49 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e  Interpreter.conn
10700 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20  ections] {..    
10710 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
10720 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
10730 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61  E: Attempt to ca
10740 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65  ncel any SQL que
10750 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73  ries in progress
10760 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   on this..      
10770 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
10780 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10790 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
107a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
107b0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
107c0 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43 61 6e  {$pair Value.Can
107d0 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  cel} error]} the
107e0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
107f0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
10800 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
10810 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20  ndArgs \n \..   
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10830 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
10840 66 61 69 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c  failed to cancel
10850 20 71 75 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65   query for conne
10860 63 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ction \"" \..   
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22   [$pair Key] "\"
10890 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
108a0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
108b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
108c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
108d0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
108e0 20 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72   }}..      } err
108f0 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  or] == 0} then {
10900 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
10910 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70  straint interrup
10920 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65  tCallback.sqlite
10930 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  3....        tpu
10940 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
10950 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
10960 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
10970 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10980 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72  dArgs "no, error
10990 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
109a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
109b0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
109c0 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66   cleanupFile { f
109d0 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74  ileName {collect
109e0 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61   true} {force fa
109f0 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
10a00 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10a10 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
10a20 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
10a30 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
10a40 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
10a50 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10a60 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
10a70 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
10a80 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
10a90 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
10aa0 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
10ab0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
10ac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
10ad0 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
10ae0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10af0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
10b00 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
10b10 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
10b20 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
10b30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
10b40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
10b50 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ck if the file s
10b60 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20  till exists...  
10b70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10b80 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66  {[file exists $f
10b90 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
10ba0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10bb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
10bc0 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20  p deleting test 
10bd0 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
10be0 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
10bf0 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20  l variable..    
10c00 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70      #       to p
10c10 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
10c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
10c30 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69  f {$force || ![i
10c40 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
10c50 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74  cleanupFile)]} t
10c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10c70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10c80 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
10c90 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
10ca0 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   file now...    
10cb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10cc0 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65     if {[set code
10cd0 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65   [catch {file de
10ce0 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20  lete $fileName} 
10cf0 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d  error]]} then {.
10d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
10d10 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
10d20 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66  TE: We somehow f
10d30 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
10d40 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74  the file, report
10d50 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20   why...         
10d60 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
10d70 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
10d80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
10d90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10da0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
10db0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
10dc0 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65  delete test file
10dd0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
10de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10df0 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
10e00 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c  anup, error: " \
10e10 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
10e20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10e30 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
10e40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10e50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
10e60 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70  ow that we skipp
10e70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ed deleting the 
10e80 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
10e90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
10ea0 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20  t code 0....    
10eb0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
10ec0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
10ed0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
10ee0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
10ef0 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20  ARNING: skipped 
10f00 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69  deleting test fi
10f10 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
10f20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10f30 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65    "\" during cle
10f40 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  anup\n"]..      
10f50 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
10f60 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
10f70 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10f80 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  The file does no
10f90 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73  t exist, success
10fa0 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  !..        #..  
10fb0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
10fc0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
10fd0 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d     return $code.
10fe0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10ff0 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61  roc collectGarba
11000 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69  ge { channel {mi
11010 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d  lliseconds 1000}
11020 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20   {quiet true} } 
11030 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
11040 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
11050 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
11060 6d 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75  mory false} resu
11070 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
11080 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
11090 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
110a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
110b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
110c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
110d0 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72       "---- memor
110e0 79 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20  y in use by the 
110f0 43 4c 52 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65  CLR before colle
11100 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20  ction... " \..  
11110 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
11120 75 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ult " bytes\n"].
11130 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
11140 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
11150 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
11160 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3d  ..            "=
11180 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
11190 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
111a0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
111b0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
111c0 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c       \n\t $resul
111d0 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  t \n]..      }..
111e0 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23 23  ..      ########
111f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11200 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11210 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11220 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11230 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  #....      #..  
11240 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65      # NOTE: Repe
11250 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74  atedly attempt t
11260 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67  o collect garbag
11270 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f  e until the allo
11280 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20  tted number..   
11290 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69     #       of mi
112a0 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65  lliseconds has e
112b0 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20  lapsed.  Always 
112c0 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
112d0 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20  ct garbage..    
112e0 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65 61    #       at lea
112f0 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20  st once...      
11300 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74 61  #..      set sta
11310 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
11320 73 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 73 74  s]..      set st
11330 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  op [expr {$start
11340 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64   + ($millisecond
11350 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20  s / 1000)}].... 
11360 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20 20       do {..     
11370 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
11380 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
11390 20 66 6f 72 63 65 20 61 20 66 75 6c 6c 20 67 61   force a full ga
113a0 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e  rbage collection
113b0 20 6e 6f 77 2e 20 20 52 65 70 6f 72 74 20 61 6e   now.  Report an
113c0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
113d0 20 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73     error that is
113e0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20   encountered if 
113f0 77 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  we fail...      
11400 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
11410 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
11420 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
11430 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 7d 20 65  alMemory true} e
11440 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
11450 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11460 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11470 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11480 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
11490 4e 47 3a 20 66 61 69 6c 65 64 20 66 75 6c 6c 20  NG: failed full 
114a0 67 61 72 62 61 67 65 20 63 6f 6c 6c 65 63 74 69  garbage collecti
114b0 6f 6e 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  on, error: " \..
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
114d0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
114e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
114f0 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f      set now [clo
11500 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
11510 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61     } while {$sta
11520 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e  rt <= $now && $n
11530 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 0d 0a 20  ow < $stop}.... 
11540 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
11550 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11560 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11570 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11580 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
11590 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
115a0 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
115b0 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d  e GC GetTotalMem
115c0 6f 72 79 20 66 61 6c 73 65 7d 20 72 65 73 75 6c  ory false} resul
115d0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
115e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
115f0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
11600 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11610 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
11620 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
11630 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79      "---- memory
11640 20 69 6e 20 75 73 65 20 62 79 20 74 68 65 20 43   in use by the C
11650 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c 65 63 74  LR after collect
11660 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  ion... " \..    
11670 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c            $resul
11680 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  t " bytes\n"].. 
11690 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
116a0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
116b0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
116c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
116d0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
116e0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
116f0 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
11700 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
11710 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
11720 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
11730 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
11740 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
11750 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65   getSQLiteHandle
11760 43 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c  Counts { channel
11770 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d   {quiet false} }
11780 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65   {..      set re
11790 73 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  sult [list].... 
117a0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f       if {[haveCo
117b0 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20  nstraint \..    
117c0 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
117d0 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
117e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 43 4f 55 4e  Data.SQLite.COUN
117f0 54 5f 48 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20  T_HANDLE]} then 
11800 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
11810 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
11820 64 20 65 61 63 68 20 63 72 69 74 69 63 61 6c 20  d each critical 
11830 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20  handle count to 
11840 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 6c 69  the resulting li
11850 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
11860 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
11870 6e 61 6d 65 20 5b 6c 69 73 74 20 63 6f 6e 6e 65  name [list conne
11880 63 74 69 6f 6e 43 6f 75 6e 74 20 73 74 61 74 65  ctionCount state
11890 6d 65 6e 74 43 6f 75 6e 74 20 62 61 63 6b 75 70  mentCount backup
118a0 43 6f 75 6e 74 5d 20 7b 0d 0a 20 20 20 20 20 20  Count] {..      
118b0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f      set value [o
118c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
118d0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
118e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
118f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11900 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
11910 65 74 68 6f 64 73 20 24 6e 61 6d 65 5d 0d 0a 0d  ethods $name]...
11920 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
11930 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
11940 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
11950 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11960 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11970 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
11980 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
11990 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20  count \"" $name 
119a0 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65 20  "\" is " $value 
119b0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
119c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61  ....          la
119d0 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24 76 61  ppend result $va
119e0 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  lue..        }..
119f0 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
11a00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11a10 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11a20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
11a30 61 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f  actual handle co
11a40 75 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61  unts are not ava
11a50 69 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72  ilable; therefor
11a60 65 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20  e, just..       
11a70 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20   #       return 
11a80 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a  an empty list...
11a90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11aa0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11ab0 6c 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c  l "---- critical
11ac0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75   handle counts u
11ad0 6e 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20  navailable\n".. 
11ae0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11af0 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
11b00 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
11b10 6f 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74  oc shutdownSQLit
11b20 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72  e { channel {for
11b30 63 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74  ce false} {quiet
11b40 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
11b50 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11b60 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  TE: Make sure th
11b70 61 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  at SQLite core l
11b80 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65  ibrary is comple
11b90 74 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20  tely shutdown.  
11ba0 54 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  This..      #   
11bb0 20 20 20 20 69 73 20 75 73 65 64 20 62 79 20 74      is used by t
11bc0 65 73 74 73 20 74 68 61 74 20 63 68 61 6e 67 65  ests that change
11bd0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
11be0 70 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68  ptions and/or th
11bf0 6f 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ose..      #    
11c00 20 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20     that need to 
11c10 6d 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e  make sure loggin
11c20 67 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  g is initialized
11c30 20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63   (i.e. just in c
11c40 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
11c50 20 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f     the SQLite co
11c60 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 69  re library was i
11c70 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68  nitialized in th
11c80 65 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20  e process prior 
11c90 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
11ca0 20 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20    the SQLiteLog 
11cb0 63 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65  class being able
11cc0 20 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f   to setup its lo
11cd0 67 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e  gging callback).
11ce0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11cf0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73  Normally, this s
11d00 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65  hould only be pe
11d10 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74  rformed if SQLit
11d20 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d  e is loaded and.
11d30 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
11d40 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20  eady for use by 
11d50 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
11d60 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11d70 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69  if {$force || [i
11d80 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74  sSQLiteReady]} t
11d90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
11da0 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46  ..        # BUGF
11db0 49 58 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69  IX: Before calli
11dc0 6e 67 20 74 68 65 20 6e 61 74 69 76 65 20 73 68  ng the native sh
11dd0 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c  utdown function,
11de0 20 6d 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d   make sure both.
11df0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
11e00 20 20 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41     of the PRAGMA
11e10 20 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f   related directo
11e20 72 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65  ry names are fre
11e30 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
11e40 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
11e50 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65  SQLiteDirectorie
11e60 73 20 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d  s $channel true.
11e70 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
11e80 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
11e90 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
11ea0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
11eb0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11ec0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
11ed0 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
11ee0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11ef0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74      sqlite3_shut
11f00 64 6f 77 6e 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  down} result] ==
11f10 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11f20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
11f30 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11f40 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
11f50 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
11f60 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
11f70 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20       "---- call 
11f80 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
11f90 28 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73  ()... ok: " $res
11fa0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
11fb0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
11fc0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
11fd0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11fe0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11ff0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12000 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12020 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
12030 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e  te3_shutdown()..
12040 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
12050 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12060 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12070 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
12080 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12090 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73   reportSQLiteRes
120a0 6f 75 72 63 65 73 20 7b 20 63 68 61 6e 6e 65 6c  ources { channel
120b0 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7b   {quiet false} {
120c0 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
120d0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
120e0 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61    # NOTE: Skip a
120f0 6c 6c 20 6f 75 74 70 75 74 20 69 66 20 77 65 20  ll output if we 
12100 61 72 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 22  are running in "
12110 71 75 69 65 74 22 20 6d 6f 64 65 2e 0d 0a 20 20  quiet" mode...  
12120 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12130 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
12140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12150 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
12160 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
12170 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56 49 52 54  ite.INTEROP_VIRT
12180 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26 20 5c 0d  UAL_TABLE] && \.
12190 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65  .          [have
121a0 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20  Constraint \..  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69              defi
121c0 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
121d0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 52  m.Data.SQLite.TR
121e0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
121f0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12200 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12210 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12220 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12230 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d   "---- current m
12240 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
12250 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
12260 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
12270 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
12280 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ch {object invok
12290 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
122a0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
122b0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
122c0 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
122d0 4d 65 6d 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  Memory \..      
122e0 20 20 20 20 20 20 20 20 20 20 62 79 74 65 73 41            bytesA
122f0 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d 6f 72 79  llocated} memory
12300 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
12310 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
12320 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12330 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12340 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
12350 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
12360 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
12370 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12380 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
12390 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
123a0 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
123b0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
123c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
123d0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
123e0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
123f0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
12400 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12410 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
12420 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
12430 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
12440 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
12450 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
12460 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
12470 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20  teMemory... ".. 
12480 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12490 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
124a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
124b0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
124c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
124d0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
124e0 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f  QLite.SQLiteMemo
124f0 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
12500 20 20 20 20 20 20 6d 61 78 69 6d 75 6d 42 79 74        maximumByt
12510 65 73 41 6c 6c 6f 63 61 74 65 64 7d 20 6d 65 6d  esAllocated} mem
12520 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
12530 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
12540 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
12550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
12560 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12570 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
12580 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20   " bytes\n"]..  
12590 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
125a0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
125b0 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72         set memor
125c0 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20  y unknown....   
125d0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
125e0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
125f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12600 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12610 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
12620 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
12630 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
12640 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
12650 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12660 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
12670 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
12680 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
12690 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20 22 0d   by SQLite... ".
126a0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
126b0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
126c0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
126d0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
126e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
126f0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
12700 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
12710 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
12720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
12730 65 6d 6f 72 79 5f 75 73 65 64 7d 20 6d 65 6d 6f  emory_used} memo
12740 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
12750 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
12760 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12770 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12780 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12790 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
127a0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
127b0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
127c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
127d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
127e0 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
127f0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
12800 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
12810 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12820 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
12830 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  own....        i
12840 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
12850 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
12860 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12870 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
12880 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
12890 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
128a0 20 20 73 65 74 20 72 65 73 75 6c 74 20 24 6d 65    set result $me
128b0 6d 6f 72 79 3b 20 23 20 4e 4f 54 45 3a 20 52 65  mory; # NOTE: Re
128c0 74 75 72 6e 20 6d 65 6d 6f 72 79 20 69 6e 2d 75  turn memory in-u
128d0 73 65 20 74 6f 20 6f 75 72 20 63 61 6c 6c 65 72  se to our caller
128e0 2e 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  .....      if {!
128f0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12900 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12910 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
12920 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
12930 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e 20  se by SQLite... 
12940 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  "..      }....  
12950 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
12960 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
12970 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
12980 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12990 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
129a0 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
129b0 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20  Methods \..     
129c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
129d0 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65  _memory_highwate
129e0 72 20 30 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  r 0} memory] == 
129f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
12a00 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12a10 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12a20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12a30 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
12a40 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
12a50 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12a60 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
12a70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12a80 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
12a90 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
12aa0 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
12ab0 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23  able?..        #
12ac0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
12ad0 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
12ae0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
12af0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
12b00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12b10 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12b20 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
12b30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
12b40 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
12b50 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d  collect} then {.
12b60 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74  .        collect
12b70 47 61 72 62 61 67 65 20 24 63 68 61 6e 6e 65 6c  Garbage $channel
12b80 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
12b90 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12ba0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12bb0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
12bc0 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d  ---- current mem
12bd0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
12be0 65 20 43 4c 52 2e 2e 2e 20 22 0d 0a 20 20 20 20  e CLR... "..    
12bf0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
12c00 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
12c10 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
12c20 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 7d 20  alMemory false} 
12c30 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
12c40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
12c50 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74   {[string is int
12c60 65 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65  eger -strict $me
12c70 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mory]} then {.. 
12c80 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
12c90 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12ca0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
12cb0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12cc0 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62  Args $memory " b
12cd0 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
12ce0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
12cf0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
12d00 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 69 6e     set memory in
12d10 76 61 6c 69 64 0d 0a 0d 0a 20 20 20 20 20 20 20  valid....       
12d20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12d30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12d40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
12d50 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
12d60 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
12d70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
12d80 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
12d90 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
12da0 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
12db0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
12dc0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
12dd0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
12de0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12df0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
12e00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
12e10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
12e20 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
12e30 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
12e40 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
12e50 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e  rectories { chan
12e60 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65  nel {reset false
12e70 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
12e80 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
12e90 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74  eck if the sqlit
12ea0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
12eb0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
12ec0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  is available... 
12ed0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70       #..      tp
12ee0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a  uts $channel \..
12ef0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12f00 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e  checking for fun
12f10 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69  ction sqlite3_wi
12f20 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
12f30 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
12f40 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
12f50 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68   This call to th
12f60 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  e sqlite3_win32_
12f70 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75  set_directory fu
12f80 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d  nction uses the.
12f90 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
12fa0 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66  nvalid value 0 f
12fb0 6f 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67  or the first arg
12fc0 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64  ument.  This cod
12fd0 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20  e is designed.. 
12fe0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
12ff0 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67  check if calling
13000 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
13010 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65  ll raise an exce
13020 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20  ption (i.e...   
13030 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61     #       the a
13040 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20  ctual result of 
13050 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
13060 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20  s not matter as 
13070 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20  long as no..    
13080 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
13090 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e  ory is changed).
130a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
130b0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
130d0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
130e0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
13100 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
13110 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
13120 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
13130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
13140 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
13150 79 20 30 20 6e 75 6c 6c 7d 5d 20 3d 3d 20 30 7d  y 0 null}] == 0}
13160 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13170 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13180 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20  TE: Calling the 
13190 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
131a0 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
131b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
131c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
131d0 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  ause an exceptio
131e0 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  n; therefore, it
131f0 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
13200 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  le (i.e...      
13210 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74    #       even t
13220 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
13230 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65  return a failure
13240 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20   return code in 
13250 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
13260 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20        case)...  
13270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13280 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
13290 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
132a0 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  _directory....  
132b0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
132c0 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
132d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
132e0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
132f0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
13300 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
13310 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20  tories?..       
13320 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
13330 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
13340 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13350 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
13360 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
13370 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
13380 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
13390 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
133a0 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
133b0 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
133c0 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
133d0 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
133e0 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
133f0 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
13400 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
13410 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
13420 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
13430 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  able,..         
13440 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e   #       use it.
13450 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
13460 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
13470 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
13480 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e  ex < 3} {incr in
13490 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
134a0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
134b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
134c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
134d0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
134e0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
13500 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
13510 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
13520 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ods \..         
13530 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13540 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
13550 65 63 74 6f 72 79 20 24 69 6e 64 65 78 20 6e 75  ectory $index nu
13560 6c 6c 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ll} \..         
13570 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
13580 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
13590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
135a0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
135b0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
135d0 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
135e0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
135f0 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
13600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13610 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
13620 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
13630 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
13640 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
13650 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13660 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
13670 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
13680 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
13690 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
136a0 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
136b0 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
136c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
136d0 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
136e0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
136f0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
13700 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
13710 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13720 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
13730 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13740 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
13750 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
13760 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
13770 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
13780 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
13790 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
137a0 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
137b0 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
137c0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
137d0 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
137e0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
137f0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
13800 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
13810 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
13820 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
13830 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
13840 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
13850 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
13860 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
13870 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
13880 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
13890 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
138a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
138b0 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
138c0 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
138d0 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
138e0 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
138f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
13900 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
13910 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
13920 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
13930 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
13940 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
13950 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
13960 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
13970 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
13980 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
13990 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
139a0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
139b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
139c0 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
139d0 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
139e0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
139f0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
13a00 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
13a10 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
13a20 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
13a30 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
13a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
13a50 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
13a60 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
13a70 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
13a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
13a90 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13aa0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13ac0 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
13ad0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
13ae0 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
13af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b00 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
13b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
13b20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13b30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13b40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13b50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
13b60 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
13b70 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
13b80 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
13b90 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
13ba0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
13bb0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
13bc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13bd0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
13be0 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
13bf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
13c00 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
13c10 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
13c20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
13c30 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
13c40 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
13c50 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
13c60 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
13c70 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
13c80 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
13c90 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
13ca0 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
13cb0 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
13cc0 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
13cd0 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
13ce0 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
13cf0 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
13d00 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
13d10 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
13d20 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
13d30 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
13d40 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13d50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13d60 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
13d70 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
13d80 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
13d90 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
13da0 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
13db0 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
13dc0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
13dd0 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
13de0 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
13df0 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
13e00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
13e10 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13e20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
13e30 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
13e40 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
13e50 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
13e60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
13e70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
13e80 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
13e90 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
13ea0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
13eb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
13ec0 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
13ed0 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
13ee0 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
13ef0 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
13f00 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
13f10 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
13f20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
13f30 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
13f40 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
13f50 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
13f60 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
13f70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
13f80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
13f90 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
13fa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13fb0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13fc0 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
13fd0 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
13fe0 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
13ff0 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
14000 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14010 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
14020 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
14030 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
14040 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
14050 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
14060 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
14070 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
14080 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
14090 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
140a0 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
140b0 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
140c0 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
140d0 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
140e0 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
140f0 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
14100 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
14110 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
14120 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
14130 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14140 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14150 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
14180 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
14190 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
141a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
141b0 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
141c0 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
141d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
141e0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
141f0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c   if {[catch {upl
14200 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
14210 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
14220 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20  sFileName]} \.. 
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20     error]} then 
14250 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14260 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
14270 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14280 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14290 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
142a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
142b0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
142c0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
142d0 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20 73   load per-user s
142e0 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
142f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14300 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
14310 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
14320 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
14330 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
14340 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14350 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14360 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
14370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
14380 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
14390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
143a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
143b0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143d0 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f  "---- skipped lo
143e0 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20 74  ading per-user t
143f0 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c  est settings fil
14400 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
14410 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65 72             $user
14420 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
14430 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
14440 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
14450 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14460 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14470 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 23   }....        ##
14480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
144a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
144b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
144c0 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20  #####....       
144d0 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
144e0 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
144f0 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b 0d  (host)]} then {.
14500 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 68  .          set h
14510 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
14520 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
14530 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f  getCommonDirecto
14540 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ry] \..         
14550 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73       [appendArgs
14560 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66 69   settings $suffi
14570 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66  x . $::tcl_platf
14580 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c 65  orm(host) .eagle
14590 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ]]....          
145a0 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73  if {[file exists
145b0 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69   $hostSettingsFi
145c0 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
145d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
145e0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
145f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14600 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
14610 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65  "---- loading pe
14640 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
14650 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
14660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14670 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
14680 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e  FileName \"...\n
14690 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
146a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
146b0 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
146c0 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72  vel 1 [list sour
146d0 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73  ce $hostSettings
146e0 46 69 6c 65 4e 61 6d 65 5d 7d 20 5c 0d 0a 20 20  FileName]} \..  
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b    error]} then {
14710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14720 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14730 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14740 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
14750 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14760 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14770 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
14780 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
14790 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65  load per-host se
147a0 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
147b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
147c0 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
147d0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22  ingsFileName "\"
147e0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
147f0 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
14800 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14810 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14820 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14830 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14840 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
14850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
14860 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
14870 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14890 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61  ---- skipped loa
148a0 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
148b0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
148c0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
148d0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
148e0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
148f0 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
14900 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
14910 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14920 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14930 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
14940 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72  }.....    proc r
14950 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c  unSQLiteTestProl
14960 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ogue {} {..     
14970 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
14980 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f  : Skip running o
14990 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67  ur custom prolog
149a0 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f  ue if the main o
149b0 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ne has been..   
149c0 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
149d0 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
149e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
149f0 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f  xists ::no(prolo
14a00 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65  gue.eagle)]} the
14a10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
14a20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14a30 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72 65  Load the "before
14a40 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75  -constraints" cu
14a50 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e  stom per-user an
14a60 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20  d/or per-host.. 
14a70 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
14a80 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
14a90 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14aa0 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20        uplevel 1 
14ab0 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65  [list loadSQLite
14ac0 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a  TestSettings $::
14ad0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65  test_channel .be
14ae0 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  fore]....       
14af0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
14b00 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  TE: Determine th
14b10 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 6e  e names of the n
14b20 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 20 61  ative platform a
14b30 6e 64 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nd architecture.
14b40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14b50 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
14b60 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
14b70 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20 20 20  orm true]..     
14b80 20 20 20 73 65 74 20 61 72 63 68 69 74 65 63 74     set architect
14b90 75 72 65 20 5b 61 72 63 68 69 74 65 63 74 75 72  ure [architectur
14ba0 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24 70 6c  eForPlatform $pl
14bb0 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
14bc0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
14bd0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65 20 70  NOTE: Show the p
14be0 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72 63 68  latform and arch
14bf0 69 74 65 63 74 75 72 65 20 75 73 65 64 20 74 6f  itecture used to
14c00 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74 68 65   help locate the
14c10 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
14c20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66    native build f
14c30 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  iles...        #
14c40 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
14c50 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
14c60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14c70 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
14c80 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 6c 6f   platform for lo
14c90 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20 62 75  cating native bu
14ca0 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c 22 22  ild files is \""
14cb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14cc0 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d  $platform \"\n].
14cd0 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
14ce0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14cf0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
14d00 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
14d10 2d 20 61 72 63 68 69 74 65 63 74 75 72 65 20 66  - architecture f
14d20 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69  or locating nati
14d30 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69  ve build files i
14d40 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  s \"" \..       
14d50 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
14d60 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  re \"\n]....    
14d70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
14d80 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
14d90 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
14da0 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20  tion files that 
14db0 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  we handle...    
14dc0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
14dd0 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  et configFileNam
14de0 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  es [list \..    
14df0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
14e00 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
14e10 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20  onfig]....      
14e20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
14e30 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c 69 73  OTE: Build a lis
14e40 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 4d  t of auxiliary M
14e50 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
14e60 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
14e70 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  )..        #    
14e80 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
14e90 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
14ea0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  andle...        
14eb0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
14ec0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
14ed0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
14ee0 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 65 72         Installer
14ef0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
14f00 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
14f10 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  fig \..         
14f20 20 20 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e     testlinq.exe.
14f30 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 65  mda.config teste
14f40 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  f6.exe.mda.confi
14f50 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  g]....        #.
14f60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
14f70 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20   Build the list 
14f80 6f 66 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62  of native assemb
14f90 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
14fa0 20 68 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20   handle.  The.. 
14fb0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
14fc0 65 61 73 6f 6e 20 74 68 65 20 22 53 79 73 74 65  eason the "Syste
14fd0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
14fe0 6c 22 20 66 69 6c 65 20 69 73 20 69 6e 63 6c 75  l" file is inclu
14ff0 64 65 64 20 68 65 72 65 20 69 73 0d 0a 20 20 20  ded here is..   
15000 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 63       #       bec
15010 61 75 73 65 20 69 74 20 63 6f 75 6c 64 20 62 65  ause it could be
15020 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20   the mixed-mode 
15030 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
15040 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
15050 74 20 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65  t nativeFileName
15060 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
15070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64         sqlite3.d
15080 6c 6c 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  ll SQLite.Intero
15090 70 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  p.dll System.Dat
150a0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d  a.SQLite.dll]...
150b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
150c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
150d0 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61  d the list of ma
150e0 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66  naged assembly f
150f0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
15100 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  dle...        #.
15110 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e  .        set man
15120 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  agedFileNames [l
15130 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
15140 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
15150 51 4c 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d  QLite.dll System
15160 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
15170 71 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  q.dll \..       
15180 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
15190 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d  .SQLite.EF6.dll]
151a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
151b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
151c0 65 6d 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63  emove any test c
151d0 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
151e0 72 65 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74  refer to the nat
151f0 69 76 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20  ive and/or..    
15200 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61      #       mana
15210 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
15220 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
15230 65 20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64  e unless forbidd
15240 65 6e 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20  en from..       
15250 20 23 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73   #       doing s
15260 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
15270 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15280 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71  o exists ::no(sq
15290 6c 69 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72  liteRemoveConstr
152a0 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  aints)]} then {.
152b0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
152c0 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
152d0 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
152e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
152f0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
15300 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24  pendArgs file_ $
15310 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
15320 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15330 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15340 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46  Name $mdaConfigF
15350 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
15360 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
15370 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
15380 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
15390 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
153a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
153b0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
153c0 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
153d0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
153e0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
153f0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
15400 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
15410 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
15420 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
15430 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
15440 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
15450 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
15460 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
15470 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
15480 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
15490 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
154a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
154b0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
154c0 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44  kip all System.D
154d0 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
154e0 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67  ed file handling
154f0 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20   (deleting,..   
15500 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
15510 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e  ying, and loadin
15520 67 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  g) if instructed
15530 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15540 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15550 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
15560 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
15570 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
15580 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
15590 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
155a0 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
155b0 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
155c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
155d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
155e0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
155f0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c  (deleteSqliteFil
15600 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
15610 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
15620 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
15630 28 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e  (deleteSqliteCon
15640 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
15650 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15660 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
15670 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
15680 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
15690 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
156a0 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
156b0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
156c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
156d0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
156e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
156f0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
15700 65 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c  eSqliteNativeFil
15710 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
15720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
15730 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
15740 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 49  no(deleteSqliteI
15750 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
15760 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15770 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
15780 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
15790 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
157a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
157b0 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
157c0 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
157d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
157e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
157f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15800 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
15810 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
15820 69 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69  iteNonImplicitFi
15830 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15850 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15860 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
15870 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29  tePlatformFiles)
15880 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
15890 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
158a0 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
158b0 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  form] > 0} then 
158c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
158d0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
158e0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
158f0 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
15910 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
15920 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
15930 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
15940 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15950 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15970 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
15980 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
15990 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46 69  teArchitectureFi
159a0 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
159d0 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
159e0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
15a00 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
15a10 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
15a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15a30 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
15a40 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
15a50 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
15a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15a70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
15a80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15a90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15aa0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15ab0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
15ac0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
15ad0 6c 65 74 65 53 71 6c 69 74 65 4d 61 6e 61 67 65  leteSqliteManage
15ae0 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  dFiles)]} then {
15af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15b00 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
15b10 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d   $managedFileNam
15b20 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
15b30 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
15b40 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
15b50 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
15b60 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15b70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
15b80 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
15b90 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
15ba0 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22   Check for the "
15bb0 61 75 74 6f 53 65 6c 65 63 74 22 20 72 75 6e 74  autoSelect" runt
15bc0 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20  ime option.  If 
15bd0 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20 20 20 20  present,..      
15be0 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74 65      #       atte
15bf0 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  mpt to automatic
15c00 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20  ally select the 
15c10 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65 0d  first available.
15c20 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
15c30 20 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65     build (or "re
15c40 6c 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74  lease") of SQLit
15c50 65 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74  e and System.Dat
15c60 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
15c70 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20      #       for 
15c80 75 73 65 20 77 69 74 68 20 74 68 65 20 74 65 73  use with the tes
15c90 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
15ca0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
15cb0 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65   if {[hasRuntime
15cc0 4f 70 74 69 6f 6e 20 61 75 74 6f 53 65 6c 65 63  Option autoSelec
15cd0 74 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  t]} then {..    
15ce0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 63 68          if {![ch
15cf0 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
15d00 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ds $::test_chann
15d10 65 6c 20 74 72 75 65 5d 7d 20 74 68 65 6e 20 7b  el true]} then {
15d20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15d30 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65  checkForSQLiteRe
15d40 6c 65 61 73 65 73 20 24 3a 3a 74 65 73 74 5f 63  leases $::test_c
15d50 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20  hannel true..   
15d60 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15d70 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15d80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15d90 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
15da0 72 79 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  rying to verify 
15db0 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
15dc0 6f 72 79 20 69 66 20 69 6e 73 74 72 75 63 74 65  ory if instructe
15dd0 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  d;..          # 
15de0 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
15df0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63   make sure it ac
15e00 74 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72  tually exists or
15e10 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69 72 65   halt the entire
15e20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
15e30 20 20 20 20 74 65 73 74 69 6e 67 20 70 72 6f 63      testing proc
15e40 65 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e  ess if it does n
15e50 6f 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20  ot exist...     
15e60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15e70 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
15e80 73 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42  sts ::no(verifyB
15e90 75 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d  uildDirectory)]}
15ea0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15eb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15ec0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74      # NOTE: At t
15ed0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62  his point, the b
15ee0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d  uild directory M
15ef0 55 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a  UST exist as a..
15f00 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
15f10 20 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74      valid direct
15f20 6f 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74  ory for the test
15f30 69 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63  ing process to c
15f40 6f 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20  ontinue...      
15f50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15f60 20 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f       set directo
15f70 72 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65  ry [getBuildDire
15f80 63 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20  ctory]....      
15f90 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
15fa0 20 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f   exists $directo
15fb0 72 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  ry] || \..      
15fc0 20 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65            ![file
15fd0 20 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69   isdirectory $di
15fe0 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b  rectory]} then {
15ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16000 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
16010 20 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72   # NOTE: Just pr
16020 69 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ior to actually 
16030 68 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74  halting the test
16040 69 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20  ing process,..  
16050 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
16060 20 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72      add an error
16070 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67   to the test log
16080 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
16090 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
160a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
160b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
160c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
160e0 2d 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65  --- could not ve
160f0 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63  rify build direc
16100 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74  tory \"" $direct
16110 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
16120 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c           "\", al
16130 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
16140 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  \n"]....        
16150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16160 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
16170 61 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20  aising a script 
16180 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20  error from this 
16190 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c  point should hal
161a0 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
161b0 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
161c0 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20  ting process... 
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
161f0 72 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ror [appendArgs 
16200 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16210 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
16220 76 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72  verify build dir
16230 65 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65  ectory \"" $dire
16240 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20  ctory \..       
16250 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
16260 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74  all testing halt
16270 65 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ed"]..          
16280 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
16290 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
162a0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
162b0 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
162c0 6f 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73  o copy any files
162d0 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d   if instructed..
162e0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
162f0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
16300 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
16310 6f 70 79 53 71 6c 69 74 65 46 69 6c 65 73 29 5d  opySqliteFiles)]
16320 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16330 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
16340 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
16350 79 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c  ySqliteConfigFil
16360 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16370 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
16380 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f  ach fileName $co
16390 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
163a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
163b0 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c   tryCopyBuildFil
163c0 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
163d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
163e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
163f0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16400 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16410 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69  o(copySqliteNati
16420 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
16430 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16440 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16450 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
16460 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  teImplicitFiles)
16470 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16480 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
16490 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
164a0 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
164d0 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
16500 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16510 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16520 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
16530 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
16540 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16560 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
16570 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50  ::no(copySqliteP
16580 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
16590 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
165a0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
165b0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
165c0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
165f0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
16600 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16610 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
16620 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
16630 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
16660 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16670 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
16680 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16690 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
166a0 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
166b0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
166c0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
166d0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
166e0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
166f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16700 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
16710 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
16720 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16740 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
16750 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74  fileName $archit
16760 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
16770 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
167a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
167b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
167c0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
167d0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d  ::no(copySqliteM
167e0 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
167f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16800 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16810 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
16820 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
16830 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
16840 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
16850 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
16860 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16870 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16880 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
16890 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
168a0 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
168b0 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65  to load any file
168c0 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
168d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
168e0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
168f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16900 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29  loadSqliteFiles)
16910 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
16920 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
16930 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
16940 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  adSqliteImplicit
16950 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
16960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
16970 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
16980 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
16990 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  e.dll..         
169a0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
169b0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
169c0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
169d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
169e0 23 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c  # tryLoadAssembl
169f0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
16a00 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
16a10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
16a20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16a30 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
16a40 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
16a50 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
16a60 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16a70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
16a80 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
16a90 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
16aa0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
16ac0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
16ad0 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
16ae0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16af0 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
16b00 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
16b10 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
16b20 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
16b30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16b40 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16b50 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16b60 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
16b70 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
16b80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16b90 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
16ba0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
16bb0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
16bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16bd0 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
16be0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
16bf0 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
16c00 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
16c10 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16c20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16c30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
16c40 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
16c50 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67  OTE: Skip trying
16c60 20 74 6f 20 64 65 6c 65 74 65 20 65 78 74 65 72   to delete exter
16c70 6e 61 6c 20 66 69 6c 65 73 20 69 66 20 69 6e 73  nal files if ins
16c80 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
16c90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
16ca0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16cb0 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
16cc0 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65  liteExternalFile
16cd0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
16ce0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
16cf0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f   fileName $mdaCo
16d00 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  nfigFileNames {.
16d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
16d20 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
16d30 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  e $fileName..   
16d40 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16d50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16d60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16d70 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74    # NOTE: Skip t
16d80 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 65 78  rying to copy ex
16d90 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 69 66 20  ternal files if 
16da0 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20  instructed...   
16db0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16dc0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
16dd0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
16de0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
16df0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
16e00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16e10 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16e20 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65   Copy the Manage
16e30 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
16e40 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e  stants (MDA) con
16e50 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
16e60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16e70 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67  file for the Eag
16e80 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20  le shell to the 
16e90 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
16ea0 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
16eb0 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 69       #       whi
16ec0 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20 6f 66  le using each of
16ed0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
16ee0 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61 63 79  e various legacy
16ef0 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 20   test..         
16f00 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
16f10 74 61 62 6c 65 73 2e 20 20 54 68 69 73 20 77 69  tables.  This wi
16f20 6c 6c 20 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20  ll help to make 
16f30 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
16f40 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
16f50 20 20 20 20 20 20 20 6c 65 67 61 63 79 20 74 65         legacy te
16f60 73 74 73 20 72 75 6e 20 77 69 74 68 20 65 78 61  sts run with exa
16f70 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 73 65  ctly the same se
16f80 74 20 6f 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20  t of Managed..  
16f90 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
16fa0 20 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69    Debugging Assi
16fb0 73 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65  stants configure
16fc0 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d...            
16fd0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  #..            f
16fe0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
16ff0 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61  $mdaConfigFileNa
17000 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
17010 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
17020 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
17030 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
17040 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20   "" $fileName.. 
17050 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17060 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17070 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17080 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17090 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
170a0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
170b0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
170c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
170d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71   version of \"sq
170e0 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  lite3.dll\"... "
170f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17100 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20    [file version 
17110 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
17120 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d  me sqlite3.dll]]
17130 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
17140 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
17150 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
17160 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
17170 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17180 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17190 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
171a0 69 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e  ion of \"SQLite.
171b0 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e  Interop.dll\"...
171c0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
171d0 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f      [file versio
171e0 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
171f0 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65  Name SQLite.Inte
17200 72 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  rop.dll]] \n].. 
17210 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17220 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
17230 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
17240 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
17250 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17260 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
17270 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
17280 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
17290 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
172a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
172b0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
172c0 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
172d0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
172e0 4c 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  Lite.dll]] \n]..
172f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17300 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
17310 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17320 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17330 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17340 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17350 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
17360 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
17370 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22  QLite.Linq.dll\"
17380 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
17390 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
173a0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
173b0 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
173c0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
173d0 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
173e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
173f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17400 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17410 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17420 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17430 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
17440 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
17450 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17460 2e 45 46 36 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  .EF6.dll\"... " 
17470 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17480 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
17490 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
174a0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
174b0 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c  Lite.EF6.dll]] \
174c0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
174d0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
174e0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
174f0 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e  tform] > 0} then
17500 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
17510 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17520 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17530 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17540 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17550 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
17560 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
17570 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17590 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e  /sqlite3.dll\"..
175a0 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
175b0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
175c0 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
175d0 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e  ileName sqlite3.
175e0 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  dll $platform]] 
175f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
17600 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
17610 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17620 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
17630 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
17640 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
17650 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
17660 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
17670 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20  " $platform \.. 
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17690 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e  /SQLite.Interop.
176a0 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65  dll\"... " [file
176b0 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20   version \..    
176c0 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
176d0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
176e0 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
176f0 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e  l $platform]] \n
17700 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17710 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
17720 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
17730 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
17740 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
17750 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
17760 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
17770 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
17780 24 70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20  $platform \..   
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53               "/S
177a0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
177b0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  e.dll\"... " [fi
177c0 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
177e0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
177f0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
17800 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  ite.dll $platfor
17810 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  m]] \n]..       
17820 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
17830 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
17840 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 61  string length $a
17850 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20 30  rchitecture] > 0
17860 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17870 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
17880 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17890 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
178a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
178c0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
178d0 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74 65   of \"" $archite
178e0 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20  cture \..       
178f0 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74           "/sqlit
17900 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  e3.dll\"... " [f
17910 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
17930 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
17940 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 61  e sqlite3.dll $a
17950 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e  rchitecture]] \n
17960 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17970 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
17980 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
17990 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
179a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
179b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
179c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
179d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
179e0 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d  $architecture \.
179f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a00 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   "/SQLite.Intero
17a10 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  p.dll\"... " [fi
17a20 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
17a40 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
17a50 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
17a60 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
17a70 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e]] \n]..       
17a80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17a90 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
17aa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
17ab0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
17ac0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
17ae0 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
17af0 66 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74  f \"" $architect
17b00 75 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ure \..         
17b10 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e         "/System.
17b20 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
17b30 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
17b40 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
17b50 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
17b60 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
17b70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
17b80 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d  l $architecture]
17b90 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
17ba0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
17bb0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
17bc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
17bd0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e   the list of man
17be0 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
17bf0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
17c00 70 72 6f 63 65 73 73 0d 0a 20 20 20 20 20 20 20  process..       
17c10 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 70   #       and rep
17c20 6f 72 74 20 6f 6e 20 74 68 65 20 53 79 73 74 65  ort on the Syste
17c30 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
17c40 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20  lated ones...   
17c50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17c60 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20 5b  set assemblies [
17c70 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41 70  object invoke Ap
17c80 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44  pDomain.CurrentD
17c90 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62 6c  omain GetAssembl
17ca0 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ies]....        
17cb0 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61  object foreach a
17cc0 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c  ssembly $assembl
17cd0 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ies {..         
17ce0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
17cf0 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61  ch \{System.Data
17d00 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62  .SQLite* $assemb
17d10 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ly]} then {..   
17d20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17d30 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
17d40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
17d60 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64  --- found loaded
17d70 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24 61 73   assembly: " $as
17d80 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20 20 20  sembly \n]..    
17d90 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17da0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
17db0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17dc0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
17dd0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
17de0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
17df0 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 66  fine constants f
17e00 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  or \"System.Data
17e10 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d 0a  .SQLite\"... "..
17e20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
17e30 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
17e40 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
17e50 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
17e70 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17e80 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f  SQLite3 DefineCo
17e90 6e 73 74 61 6e 74 73 7d 20 5c 0d 0a 20 20 20 20  nstants} \..    
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
17eb0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
17ec0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
17ed0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17ee0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
17ef0 61 70 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d  appendArgs [form
17f00 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d  atList [lsort \.
17f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17f20 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
17f30 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a  s] <none>] \n]..
17f40 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
17f50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17f60 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
17f70 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
17f80 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17f90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17fa0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
17fb0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17fc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
17fe0 2d 2d 20 73 6f 75 72 63 65 20 76 65 72 73 69 6f  -- source versio
17ff0 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
18000 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
18010 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
18020 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
18030 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
18040 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
18050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18060 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
18070 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
18080 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56  ection ProviderV
18090 65 72 73 69 6f 6e 7d 20 5c 0d 0a 20 20 20 20 20  ersion} \..     
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
180b0 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
180c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
180d0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
180e0 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
180f0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
18100 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
18110 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
18120 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18130 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18140 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18150 65 6e 64 41 72 67 73 20 24 76 65 72 73 69 6f 6e  endArgs $version
18160 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18170 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18180 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18190 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
181a0 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
181b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
181c0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
181d0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
181e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
181f0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
18200 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
18210 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79  checkout of \"Sy
18220 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18230 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
18240 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
18250 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f  tch {object invo
18260 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
18270 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
18280 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
18290 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
182a0 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72  iteConnection Pr
182b0 6f 76 69 64 65 72 53 6f 75 72 63 65 49 64 7d 20  oviderSourceId} 
182c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
182d0 20 20 20 20 20 73 6f 75 72 63 65 49 64 5d 20 3d       sourceId] =
182e0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
182f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
18300 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
18310 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
18320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18330 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
18340 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
18350 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
18360 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18370 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18380 67 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d  gs $sourceId \n]
18390 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
183a0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
183b0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
183c0 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
183d0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
183e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
183f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18400 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
18410 65 20 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c  e available buil
18420 64 73 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65  ds (and "release
18430 73 22 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e  s") of SQLite an
18440 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
18450 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
18460 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  QLite...        
18470 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
18480 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20  ForSQLiteBuilds 
18490 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
184a0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
184b0 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
184c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
184d0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
184e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
184f0 77 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  w, we need to kn
18500 6f 77 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ow if the SQLite
18510 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73   core library is
18520 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20   available..    
18530 20 20 20 20 23 20 20 20 20 20 20 20 28 69 2e 65      #       (i.e
18540 2e 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 61  . because the ma
18550 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65  naged-only Syste
18560 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73  m.Data.SQLite as
18570 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20  sembly can..    
18580 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64      #       load
18590 20 77 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77   without it; how
185a0 65 76 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20  ever, it cannot 
185b0 64 6f 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66  do anything usef
185c0 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20  ul without..    
185d0 20 20 20 20 23 20 20 20 20 20 20 20 69 74 29 2e      #       it).
185e0 20 20 49 66 20 77 65 20 61 72 65 20 75 73 69 6e    If we are usin
185f0 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65  g the mixed-mode
18600 20 61 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65   assembly and we
18610 20 61 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20   already..      
18620 20 20 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20    #       found 
18630 69 74 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73  it (above), this
18640 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73   should always s
18650 75 63 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20  ucceed...       
18660 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
18670 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72  kForSQLiteLibrar
18680 79 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  y $::test_channe
18690 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
186a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
186b0 43 68 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c  Check if the SQL
186c0 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
186d0 6d 62 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c  mbly is availabl
186e0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
186f0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
18700 51 4c 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a  QLiteInterop $::
18710 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
18720 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18730 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
18740 20 74 68 65 20 53 51 4c 69 74 65 20 64 61 74 61   the SQLite data
18750 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61  base and tempora
18760 72 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d  ry directories..
18770 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18780 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
18790 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a  teDirectories $:
187a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
187b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
187c0 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
187d0 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
187e0 20 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70   if various comp
187f0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
18800 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20   needed for..   
18810 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
18820 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65  t constraints we
18830 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  re enabled for t
18840 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
18850 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20  bly.  There..   
18860 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65       #       are
18870 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69   some compile-ti
18880 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20  me options that 
18890 6d 75 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62  must also have b
188a0 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20  een enabled..   
188b0 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 72       #       for
188c0 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73   the interop ass
188d0 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  embly in order t
188e0 6f 20 62 65 20 65 66 66 65 63 74 69 76 65 2e 20  o be effective. 
188f0 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20   For those..    
18900 20 20 20 20 23 20 20 20 20 20 20 20 6f 70 74 69      #       opti
18910 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ons, it will be 
18920 61 73 73 75 6d 65 64 20 74 68 61 74 20 69 74 20  assumed that it 
18930 77 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  was enabled for 
18940 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
18950 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
18960 65 6d 62 6c 79 20 69 66 20 69 74 20 77 61 73 20  embly if it was 
18970 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
18980 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
18990 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
189a0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 65        foreach de
189b0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69  fineConstant [li
189c0 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
189d0 20 20 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f    CHECK_STATE CO
189e0 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47  UNT_HANDLE DEBUG
189f0 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49   INTEROP_CODEC I
18a00 4e 54 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a  NTEROP_DEBUG \..
18a10 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
18a20 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55  ROP_EXTENSION_FU
18a30 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f  NCTIONS INTEROP_
18a40 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
18a50 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20  EROP_LOG \..    
18a60 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
18a70 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 49  TEST_EXTENSION I
18a80 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
18a90 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f  ABLE NET_20 NET_
18aa0 33 35 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  35 \..          
18ab0 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20    NET_40 NET_45 
18ac0 4e 45 54 5f 34 35 31 20 4e 45 54 5f 43 4f 4d 50  NET_451 NET_COMP
18ad0 41 43 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f  ACT_20 PLATFORM_
18ae0 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b  COMPACTFRAMEWORK
18af0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18b00 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c  PRELOAD_NATIVE_L
18b10 49 42 52 41 52 59 20 52 45 54 41 52 47 45 54 41  IBRARY RETARGETA
18b20 42 4c 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44  BLE SQLITE_STAND
18b30 41 52 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ARD \..         
18b40 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50     THROW_ON_DISP
18b50 4f 53 45 44 20 54 52 41 43 45 20 54 52 41 43 45  OSED TRACE TRACE
18b60 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43  _CONNECTION TRAC
18b70 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a 20 20 20 20  E_HANDLE \..    
18b80 20 20 20 20 20 20 20 20 54 52 41 43 45 5f 50 52          TRACE_PR
18b90 45 4c 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52  ELOAD TRACE_SHAR
18ba0 45 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45  ED TRACE_STATEME
18bb0 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47  NT TRACE_WARNING
18bc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18bd0 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
18be0 45 53 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52  ES USE_ENTITY_FR
18bf0 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e  AMEWORK_6 USE_IN
18c00 54 45 52 4f 50 5f 44 4c 4c 20 5c 0d 0a 20 20 20  TEROP_DLL \..   
18c10 20 20 20 20 20 20 20 20 20 55 53 45 5f 50 52 45           USE_PRE
18c20 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d  PARE_V2 WINDOWS]
18c30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
18c40 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
18c50 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
18c60 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
18c70 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e  ion is listed in
18c80 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20   the list of..  
18c90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18ca0 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74  "define constant
18cb0 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66  s" kept track of
18cc0 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20   by the managed 
18cd0 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
18ce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18cf0 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
18d00 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24  DefineConstant $
18d10 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
18d20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a  defineConstant..
18d30 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18d40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18d50 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
18d60 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20  e current build 
18d70 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79  year.  Basically
18d80 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
18d90 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18da0 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20    which version 
18db0 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f  of MSBuild and/o
18dc0 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  r Visual Studio 
18dd0 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20  was used to..   
18de0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
18df0 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c  pile the assembl
18e00 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  y binaries under
18e10 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   test...        
18e20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
18e30 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18e40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18e50 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
18e60 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
18e70 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72  QLite build year
18e80 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
18e90 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42 75   set year [getBu
18ea0 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20  ildYear]..      
18eb0 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
18ec0 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c  [appendArgs buil
18ed0 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20  dYear. $year].. 
18ee0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
18ef0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
18f00 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61  pendArgs \" $yea
18f10 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  r \"\n]....     
18f20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18f30 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
18f40 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f  current build co
18f50 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
18f60 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
18f70 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ly..        #   
18f80 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44      be either "D
18f90 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73  ebug" or "Releas
18fa0 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e"...        #..
18fb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18fc0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
18fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
18fe0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
18ff0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
19000 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  te build configu
19010 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20  ration... ".... 
19020 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69         set confi
19030 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69  guration [getBui
19040 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d  ldConfiguration]
19050 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
19060 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
19070 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75  rgs buildConfigu
19080 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75  ration. $configu
19090 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20  ration]..       
190a0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
190b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
190c0 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61  gs \" $configura
190d0 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  tion \"\n]....  
190e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
190f0 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20   # NOTE: Try to 
19100 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75  setup an interru
19110 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e  pt callback usin
19120 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  g the script deb
19130 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23  ugger..        #
19140 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
19150 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20   cancel all SQL 
19160 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
19170 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  ess for all data
19180 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  base..        # 
19190 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
191a0 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20  s known to this 
191b0 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
191c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
191d0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
191e0 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e  ts ::no(sqliteIn
191f0 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29  terruptCallback)
19200 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
19210 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65       setupDbInte
19220 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a  rruptCallback $:
19230 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a  :test_channel $:
19240 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20  :test_log..     
19250 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19260 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19270 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  E: Check for the
19280 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20   native runtime 
19290 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f  option, which wo
192a0 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d  uld mean we are.
192b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
192c0 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64   using the mixed
192d0 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d  -mode assembly..
192e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
192f0 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74      checkForRunt
19300 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73  imeOption $::tes
19310 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65  t_channel native
19320 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
19330 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
19340 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74  heck if the test
19350 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f   suite should co
19360 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
19370 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20  f connections.. 
19380 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22         #       "
19390 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f  opened" and "clo
193a0 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f  sed" from the po
193b0 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e  ol when determin
193c0 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20  ing if a test.. 
193d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
193e0 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e  assed.  Disablin
193f0 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20  g this behavior 
19400 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63  is sometimes nec
19410 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20  essary (e.g...  
19420 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75        #       du
19430 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65  ring the release
19440 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
19450 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  ) because there 
19460 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20  are several..   
19470 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
19480 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20  ts that rely on 
19490 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d  the "opened from
194a0 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69   pool" count bei
194b0 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20  ng greater..    
194c0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e      #       than
194d0 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65   zero.  These te
194e0 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65  sts may fail due
194f0 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65   to the non-dete
19500 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20  rministic..     
19510 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76     #       behav
19520 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47  ior of the CLR G
19530 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  C, even when the
19540 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20  re is no bug in 
19550 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20  the code..      
19560 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20    #       being 
19570 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  tested...       
19580 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
19590 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f  kForRuntimeOptio
195a0 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  n $::test_channe
195b0 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a  l noPoolCounts..
195c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
195d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
195e0 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65  ort the resource
195f0 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f 20   usage prior to 
19600 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73 74  running any test
19610 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
19620 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
19630 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
19640 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
19650 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19660 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
19670 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
19680 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74  ve modules for t
19690 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
196a0 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  ss and..        
196b0 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20 6f  #       report o
196c0 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74  n the System.Dat
196d0 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
196e0 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20   ones...        
196f0 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
19700 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69  odules [object i
19710 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20  nvoke \..       
19720 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
19730 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73 2e  nostics.Process.
19740 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
19750 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20  s Modules]....  
19760 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
19770 65 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75  each -alias modu
19780 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20  le $modules {.. 
19790 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
197a0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d  eName [file norm
197b0 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46  alize [$module F
197c0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20  ileName]]....   
197d0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
197e0 6e 67 20 6d 61 74 63 68 20 2d 6e 6f 63 61 73 65  ng match -nocase
197f0 20 2a 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24   */sqlite3.dll $
19800 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
19810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
19820 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19830 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19840 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19850 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
19860 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61  loaded SQLite na
19870 74 69 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64  tive library mod
19880 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ule: " \..      
19890 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
198a0 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
198b0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74     } elseif {[st
198c0 72 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20  ring match \..  
198d0 20 20 20 20 20 20 20 20 20 20 20 20 2d 6e 6f 63              -noc
198e0 61 73 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74  ase */SQLite.Int
198f0 65 72 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61  erop.dll $fileNa
19900 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
19910 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19920 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
19930 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
19950 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64  --- found loaded
19960 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
19970 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a  assembly module:
19980 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
19990 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
199a0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
199b0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
199c0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
199d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
199e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
199f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19a00 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74   "---- compile-t
19a10 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ime options for 
19a20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
19a30 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ary... "....    
19a40 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
19a50 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
19a60 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
19a70 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
19a80 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
19a90 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
19aa0 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f  3 SQLiteCompileO
19ab0 70 74 69 6f 6e 73 7d 20 5c 0d 0a 20 20 20 20 20  ptions} \..     
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
19ad0 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20  pileOptions] == 
19ae0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
19af0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
19b00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
19b10 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74  pendArgs [format
19b20 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20  List [lsort \.. 
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
19b40 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
19b50 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
19b60 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
19b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
19b80 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
19b90 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
19ba0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19bb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19bc0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
19bd0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
19be0 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
19bf0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19c00 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
19c10 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20  ions for SQLite 
19c20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
19c30 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
19c40 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
19c50 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
19c60 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
19c70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19c80 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
19c90 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
19ca0 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70 74  nteropCompileOpt
19cb0 69 6f 6e 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20  ions} \..       
19cc0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69             compi
19cd0 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d  leOptions] == 0}
19ce0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19cf0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19d00 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
19d10 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69  ndArgs [formatLi
19d20 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20  st [lsort \..   
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f               $co
19d40 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e  mpileOptions] <n
19d50 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  one>] \n]..     
19d60 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
19d70 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
19d80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19d90 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20   unknown\n..    
19da0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19db0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
19dc0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
19dd0 20 53 68 6f 77 20 74 68 65 20 61 63 74 69 76 65   Show the active
19de0 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
19df0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
19e00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
19e10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
19e20 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63  pendArgs "---- c
19e30 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d  onstraints: " \.
19e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f  .            [fo
19e50 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20  rmatList [lsort 
19e60 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d  [getConstraints]
19e70 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d  ] <none>] \n]...
19e80 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19e90 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65      # NOTE: Save
19ea0 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72   the test constr
19eb0 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79  aints for use by
19ec0 20 74 68 72 65 61 64 73 20 63 72 65 61 74 65 64   threads created
19ed0 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20   in this..      
19ee0 20 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63    #       applic
19ef0 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54  ation domain.  T
19f00 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
19f10 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65   because all the
19f20 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20   Eagle..        
19f30 23 20 20 20 20 20 20 20 22 74 65 73 74 20 63 6f  #       "test co
19f40 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69  ntext" informati
19f50 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65 61 64  on is per-thread
19f60 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19f70 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
19f80 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63   exists ::test_c
19f90 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65  onstraints]} the
19fa0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
19fb0 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  et ::test_constr
19fc0 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74  aints $::eagle_t
19fd0 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73  ests(constraints
19fe0 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  )..        }....
19ff0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a000 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
1a010 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74  the "after-const
1a020 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70  raints" custom p
1a030 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
1a040 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20  er-host..       
1a050 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65   #       test se
1a060 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20  ttings now...   
1a070 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a080 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1a090 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
1a0a0 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63  ttings $::test_c
1a0b0 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a  hannel .after]..
1a0c0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a0d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
1a0e0 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73  w when our tests
1a0f0 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20   actually began 
1a100 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20  (now)...        
1a110 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1a120 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1a130 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1a140 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1a150 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  - System.Data.SQ
1a160 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61 6e  Lite tests began
1a170 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20   at " \..       
1a180 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d       [clock form
1a190 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  at [clock second
1a1a0 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  s]] \n]..      }
1a1b0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1a1c0 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65  proc runSQLiteTe
1a1d0 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  stEpilogue {} {.
1a1e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
1a1f0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e  # NOTE: Skip run
1a200 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20  ning our custom 
1a210 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20  epilogue if the 
1a220 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65  main one has bee
1a230 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
1a240 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20   skipped...     
1a250 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
1a260 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1a270 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29  (epilogue.eagle)
1a280 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a290 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1a2a0 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20  NOTE: Show when 
1a2b0 6f 75 72 20 74 65 73 74 73 20 61 63 74 75 61 6c  our tests actual
1a2c0 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d  ly ended (now)..
1a2d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a2e0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a2f0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1a300 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1a310 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65       "---- Syste
1a320 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65  m.Data.SQLite te
1a330 73 74 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c  sts ended at " \
1a340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 63  ..            [c
1a350 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f  lock format [clo
1a360 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d  ck seconds]] \n]
1a370 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1a380 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
1a390 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   Before checking
1a3a0 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75   the final resou
1a3b0 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53  rces in use by S
1a3c0 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20  QLite, make..   
1a3d0 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73       #         s
1a3e0 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20  ure both of the 
1a3f0 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
1a400 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
1a410 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
1a420 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1a430 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
1a440 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
1a450 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
1a460 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a470 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20     # NOTE: Also 
1a480 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  report the resou
1a490 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20  rce usage after 
1a4a0 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74  running the test
1a4b0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1a4c0 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
1a4d0 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
1a4e0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1a4f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a500 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
1a510 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68  t the critical h
1a520 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74  andle counts aft
1a530 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74  er running the t
1a540 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
1a550 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c  ..        getSQL
1a560 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
1a570 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
1a580 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1a590 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ....    ########
1a5a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a5b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a5c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a5d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a5e0 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23  ###..    #######
1a5f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a600 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65  ###### END Eagle
1a610 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23   ONLY ##########
1a620 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a630 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
1a640 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a650 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a660 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a670 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1a680 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  #####..  }....  
1a690 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76  #..  # NOTE: Sav
1a6a0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1a6b0 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1a6c0 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65  aining this file
1a6d0 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b  ...  #..  if {![
1a6e0 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d  info exists comm
1a6f0 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  on_directory]} t
1a700 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63  hen {..    set c
1a710 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20  ommon_directory 
1a720 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69  [file dirname [i
1a730 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20  nfo script]]..  
1a740 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f  }....  #..  # NO
1a750 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20  TE: Provide the 
1a760 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1a770 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 20  te test package 
1a780 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  to the interpret
1a790 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b  er...  #..  pack
1a7a0 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73 74  age provide Syst
1a7b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54  em.Data.SQLite.T
1a7c0 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a              est 1.0..}..