System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 0e5c5722176301fad83ee84541369787ae74e64a:


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 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0fd0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
0fe0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
0ff0: 6e 20 61 64 64 69 6e 67 20 73 68 69 6d 6d 65 64  n adding shimmed
1000: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
1010: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70  s...    #..    p
1020: 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6c 72 56  roc getBuildClrV
1030: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
1040: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1050: 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5d 20  sts ::test_clr] 
1060: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
1070: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5d 20 3e  h $::test_clr] >
1080: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1090: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10a0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
10b0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76 65  pecified test ve
10c0: 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c  rsion for the CL
10d0: 52 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  R.  If this vari
10e0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
10f0: 20 20 20 20 20 20 69 73 20 6e 6f 74 20 73 65 74        is not set
1100: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  , the default va
1110: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
1120: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
1130: 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
1140: 20 20 20 20 20 45 61 67 6c 65 20 68 61 73 20 62       Eagle has b
1150: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61  een compiled aga
1160: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
1170: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
1180: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1190: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
11a0: 74 5f 63 6c 72 0d 0a 20 20 20 20 20 20 7d 20 65  t_clr..      } e
11b0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
11c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11d0: 3a 20 43 68 65 63 6b 20 69 66 20 45 61 67 6c 65  : Check if Eagle
11e0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c   has been compil
11f0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43  ed against the C
1200: 4c 52 20 76 34 2e 30 2e 20 20 49 66 20 73 6f 2c  LR v4.0.  If so,
1210: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1220: 20 20 6a 75 73 74 20 75 73 65 20 74 68 61 74 20    just use that 
1230: 43 4c 52 20 76 65 72 73 69 6f 6e 2e 20 20 4f 74  CLR version.  Ot
1240: 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
1250: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1260: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1270: 20 20 43 4c 52 20 76 32 2e 30 2e 20 20 49 66 20    CLR v2.0.  If 
1280: 61 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69  another major [i
1290: 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72  ncompatible] ver
12a0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52 0d  sion of the CLR.
12b0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12c0: 20 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68   is released, th
12d0: 69 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61  is check will ha
12e0: 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ve to be changed
12f0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 0d 0a  .  The default..
1300: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1310: 76 65 72 73 69 6f 6e 20 76 61 6c 75 65 20 66 6f  version value fo
1320: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 43  r a particular C
1330: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
1340: 65 20 6f 76 65 72 72 69 64 64 65 6e 0d 0a 20 20  e overridden..  
1350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
1360: 20 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f   setting the glo
1370: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22 74 65  bal variable "te
1380: 73 74 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65  st_clr_v$X", whe
1390: 72 65 20 22 24 58 22 20 6d 61 79 0d 0a 20 20 20  re "$X" may..   
13a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 63 75       #       [cu
13b0: 72 72 65 6e 74 6c 79 5d 20 62 65 20 65 69 74 68  rrently] be eith
13c0: 65 72 20 22 32 22 20 6f 72 20 22 34 22 2e 0d 0a  er "2" or "4"...
13d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e0: 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
13f0: 74 72 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74  traint imageRunt
1400: 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ime40]} then {..
1410: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
1420: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1430: 74 5f 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a  t_clr_v4] && \..
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1450: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
1460: 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 3e 20 30  test_clr_v4] > 0
1470: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1480: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1490: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
14a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
14b0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
14c0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
14d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14f0: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 0d   $::test_clr_v4.
1500: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1510: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1520: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1530: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1540: 64 65 66 61 75 6c 74 20 74 65 73 74 20 76 65 72  default test ver
1550: 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52  sion for the CLR
1560: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
1570: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1580: 20 20 20 72 65 74 75 72 6e 20 34 2e 30 2e 33 30     return 4.0.30
1590: 33 31 39 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f  319; # TODO: Goo
15a0: 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66  d "fallback" def
15b0: 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20  ault?..         
15c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
15d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
15e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
15f0: 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32 5d 20   ::test_clr_v2] 
1600: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1610: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1620: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76  th $::test_clr_v
1630: 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  2] > 0} then {..
1640: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1650: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1660: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1670: 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f  fied test versio
1680: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1690: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
16a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16b0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63  return $::test_c
16c0: 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20  lr_v2..         
16d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1700: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65  e the default te
1710: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1720: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
1730: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1740: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1750: 32 2e 30 2e 35 30 37 32 37 3b 20 23 20 54 4f 44  2.0.50727; # TOD
1760: 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63  O: Good "fallbac
1770: 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  k" default?..   
1780: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1790: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
17a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17b0: 20 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b   getBuildYears {
17c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
17d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
17e0: 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  if the list of t
17f0: 65 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65  est years has be
1800: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
1810: 20 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20   the user..     
1820: 20 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f   #       (e.g. o
1830: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1840: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
1850: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1860: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61  xists ::test_yea
1870: 72 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20  rs] && [llength 
1880: 24 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e  $::test_years] >
1890: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
18c0: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
18d0: 20 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20   test years...  
18e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18f0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1900: 79 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65  years..      } e
1910: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1920: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1930: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
1940: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79  t list of test y
1950: 65 61 72 73 20 28 69 2e 65 2e 20 61 6c 6c 29 2e  ears (i.e. all).
1960: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1970: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1980: 74 20 32 30 30 35 20 32 30 30 38 20 32 30 31 30  t 2005 2008 2010
1990: 20 32 30 31 32 20 32 30 31 33 5d 0d 0a 20 20 20   2012 2013]..   
19a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
19b0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
19c0: 64 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20  dNetFx {} {..   
19d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19e0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74  TE: See if the t
19f0: 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  est .NET Framewo
1a00: 72 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20 62  rk setting has b
1a10: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
1a20: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1a30: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
1a40: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1a50: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
1a60: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1a70: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65  exists ::test_ne
1a80: 74 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20  t_fx] && \..    
1a90: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1aa0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74  ngth $::test_net
1ab0: 5f 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _fx] > 0} then {
1ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1ae0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
1af0: 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  est .NET Framewo
1b00: 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rk...        #..
1b10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1b20: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20  ::test_net_fx.. 
1b30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1b40: 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
1b50: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
1b60: 0d 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ..        switch
1b70: 20 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61 72   -exact -- $year
1b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 32 30   {..          20
1b90: 30 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  05 {..          
1ba0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
1bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1bc0: 20 20 20 20 20 20 20 20 20 32 30 30 38 20 7b 0d           2008 {.
1bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1be0: 75 72 6e 20 6e 65 74 46 78 33 35 0d 0a 20 20 20  urn netFx35..   
1bf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c00: 20 20 20 20 32 30 31 30 20 7b 0d 0a 20 20 20 20      2010 {..    
1c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
1c20: 65 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20 20  etFx40..        
1c30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
1c40: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
1c50: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1c60: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1c70: 20 20 20 20 20 20 20 20 20 20 32 30 31 33 20 7b            2013 {
1c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1c90: 74 75 72 6e 20 6e 65 74 46 78 34 35 31 0d 0a 20  turn netFx451.. 
1ca0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1cb0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1cd0: 75 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54  urn netFx35; # T
1ce0: 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62  ODO: Good "fallb
1cf0: 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20  ack" default?.. 
1d00: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1d20: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d      }.....    #.
1d30: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  .    # NOTE: Thi
1d40: 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  s procedure shou
1d50: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ld return non-ze
1d60: 72 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67  ro if the config
1d70: 75 72 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23  ured test..    #
1d80: 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20         platform 
1d90: 69 73 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74  is most likely t
1da0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74  he default for t
1db0: 68 69 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20  his machine...  
1dc0: 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73    #..    proc is
1dd0: 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74  DefaultBuildPlat
1de0: 66 6f 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20  form { {verbose 
1df0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
1e00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1e10: 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f  E: Running on Wo
1e20: 57 36 34 20 69 73 20 6e 65 76 65 72 20 74 68 65  W64 is never the
1e30: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
1e40: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
1e50: 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e     if {[isRunnin
1e60: 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d  gWoW64]} then {.
1e70: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
1e80: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
1e90: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ea0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec0: 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e  "---- detected n
1ed0: 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66  on-default platf
1ee0: 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a  orm (WoW64)\n"..
1ef0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f00: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
1f10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1f30: 45 3a 20 54 68 69 73 20 68 61 73 20 61 20 67 6f  E: This has a go
1f40: 6f 64 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69  od chance of bei
1f50: 6e 67 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ng the default p
1f60: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
1f70: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65  #..      if {$ve
1f80: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
1f90: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1fa0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d  test_channel "--
1fb0: 2d 2d 20 64 65 74 65 63 74 65 64 20 64 65 66 61  -- detected defa
1fc0: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d  ult platform\n".
1fd0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
1fe0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
1ff0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2000: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
2010: 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20   { native } {.. 
2020: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2030: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61  xists ::test_pla
2040: 74 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20  tform] && \..   
2050: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2060: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c  ength $::test_pl
2070: 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
2080: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2090: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20a0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
20b0: 64 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e  d test platform.
20c0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
20d0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a  le is not set,..
20e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20f0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
2100: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
2110: 6f 6e 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61  on the machine a
2120: 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
2130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2140: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
2150: 6e 61 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74  native ? $::test
2160: 5f 70 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d  _platform : ""}]
2170: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2180: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2190: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26  :test_machine] &
21a0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
21b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
21c0: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e  :test_machine] >
21d0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
21e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
21f0: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
2200: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
2210: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
2220: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
2230: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2240: 20 20 20 20 20 74 68 65 20 74 65 73 74 20 6d 61       the test ma
2250: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2260: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2270: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a  eturn an empty..
2280: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2290: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
22a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
22b0: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
22c0: 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20        $native ? 
22d0: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
22e0: 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69  rm $::test_machi
22f0: 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  ne] : ""..      
2300: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
2310: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
2320: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
2330: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
2340: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2350: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2360: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
2370: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
2380: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
2390: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
23a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
23b0: 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  e machine archit
23c0: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
23d0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
23e0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
23f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2400: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
2410: 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65           $native
2420: 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61   ? [machineToPla
2430: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
2440: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
2450: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2460: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2470: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20       # NOTE: No 
2490: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
24a0: 74 75 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ture is availabl
24b0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
24c0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
24d0: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2500: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
2510: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
2520: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
2530: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
2540: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
2550: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
2560: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2570: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
2580: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2590: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
25a0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
25b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
25c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
25d0: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
25e0: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
25f0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
2600: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
2610: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
2620: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
2630: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
2640: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
2650: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
2660: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
2670: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
2680: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
2690: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
26a0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
26b0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
26c0: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
26d0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
26e0: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
26f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2700: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
2710: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
2720: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
2730: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
2740: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2750: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
2760: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
2770: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2780: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2790: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
27a0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
27b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
27c0: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
27d0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
27e0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
27f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2800: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2810: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2820: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2830: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
2840: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
2850: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
2860: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
2870: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2880: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
2890: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
28a0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
28b0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
28c0: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
28d0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
28e0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
28f0: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
2900: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2910: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
2920: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
2930: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2940: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
2950: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
2960: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2980: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2990: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
29a0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
29b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
29c0: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
29d0: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
29e0: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
29f0: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
2a00: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
2a10: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
2a20: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
2a30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
2a50: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
2a60: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
2a70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2a80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2a90: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
2aa0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
2ab0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
2ac0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
2ad0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2ae0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
2af0: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
2b00: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
2b10: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
2b20: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
2b30: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
2b40: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
2b50: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
2b60: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
2b70: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
2b80: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
2b90: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
2ba0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
2bb0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2bc0: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
2bd0: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
2be0: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
2bf0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2c00: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
2c10: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
2c20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2c30: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
2c40: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
2c50: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
2c60: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
2c70: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
2c80: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
2c90: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
2ca0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
2cb0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2cc0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
2cd0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
2ce0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
2cf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
2d00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
2d10: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2d30: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2d40: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
2d50: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
2d60: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
2d70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2d80: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
2d90: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
2da0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2db0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2dc0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
2dd0: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
2de0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
2df0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2e00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
2e10: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
2e20: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2e30: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2e40: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
2e50: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
2e60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2e70: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2e80: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
2e90: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
2ea0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
2eb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
2ec0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
2ed0: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
2ee0: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2ef0: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
2f00: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2f10: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
2f20: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
2f30: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
2f40: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2f50: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
2f60: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
2f70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2f80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2f90: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
2fa0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
2fb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2fc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2fd0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2fe0: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
2ff0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
3000: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
3010: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3020: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
3030: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
3040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3050: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
3060: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
3070: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
3080: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3090: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
30a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
30b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
30c0: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
30d0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
30e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
30f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
3100: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
3110: 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
3120: 74 6f 72 79 20 6f 66 20 74 68 65 20 6f 6e 65 20  tory of the one 
3130: 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20 20 20 20  containing..    
3140: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69 73      #       this
3150: 20 66 69 6c 65 20 28 69 2e 65 2e 20 22 63 6f 6d   file (i.e. "com
3160: 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20 69 66 20  mon.eagle"), if 
3170: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
3180: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
3190: 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e  eturn [file dirn
31a0: 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ame $::common_di
31b0: 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20 20 20 20  rectory]..      
31c0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
31d0: 65 78 69 73 74 73 20 3a 3a 70 61 74 68 5d 20 26  exists ::path] &
31e0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
31f0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
3200: 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74 68 65 6e  :path] > 0} then
3210: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
3220: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
3230: 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62 61 63 6b  inally, fallback
3240: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64   to the parent d
3250: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
3260: 45 61 67 6c 65 54 65 73 74 0d 0a 20 20 20 20 20  EagleTest..     
3270: 20 20 20 23 20 20 20 20 20 20 20 70 61 74 68 2e     #       path.
3280: 20 20 54 68 65 20 45 61 67 6c 65 54 65 73 74 20    The EagleTest 
3290: 70 61 63 6b 61 67 65 20 67 75 61 72 61 6e 74 65  package guarante
32a0: 65 73 20 74 68 61 74 20 74 68 69 73 20 76 61 72  es that this var
32b0: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23  iable..        #
32c0: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 73         will be s
32d0: 65 74 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  et to the direct
32e0: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
32f0: 68 65 20 66 69 72 73 74 20 66 69 6c 65 20 74 6f  he first file to
3300: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
3310: 20 20 65 78 65 63 75 74 65 20 74 68 65 20 5b 72    execute the [r
3320: 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75 65 5d 20  unTestPrologue] 
3330: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70  script library p
3340: 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20  rocedure...     
3350: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3360: 74 75 72 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61  turn [file dirna
3370: 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a 20 20 20  me $::path]..   
3380: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
3390: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
33a0: 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61 74 68 20  # NOTE: No path 
33b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
33c0: 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74  turn an empty st
33d0: 72 69 6e 67 2e 20 20 54 68 69 73 20 70 6f 69 6e  ring.  This poin
33e0: 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
33f0: 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65     should not be
3400: 20 72 65 61 63 68 65 64 2e 0d 0a 20 20 20 20 20   reached...     
3410: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
3420: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
3430: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3440: 70 72 6f 63 20 67 65 74 53 51 4c 69 74 65 54 65  proc getSQLiteTe
3450: 73 74 44 61 74 61 50 61 74 68 20 7b 7d 20 7b 0d  stDataPath {} {.
3460: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3470: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
3480: 75 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ut the directory
3490: 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20 74   where all the t
34a0: 65 73 74 20 64 61 74 61 20 66 69 6c 65 73 20 73  est data files s
34b0: 68 6f 75 6c 64 0d 0a 20 20 20 20 20 20 23 20 20  hould..      #  
34c0: 20 20 20 20 20 62 65 20 6c 6f 63 61 74 65 64 2e       be located.
34d0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
34e0: 20 74 68 65 20 22 64 61 74 61 22 20 64 69 72 65   the "data" dire
34f0: 63 74 6f 72 79 20 62 65 6e 65 61 74 68 20 74 68  ctory beneath th
3500: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
3510: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
3520: 69 6e 69 6e 67 20 74 68 65 20 61 63 74 75 61 6c  ining the actual
3530: 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0d 0a   test scripts...
3540: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
3550: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e  eturn [file join
3560: 20 24 3a 3a 70 61 74 68 20 64 61 74 61 5d 0d 0a   $::path data]..
3570: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
3580: 6f 63 20 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36  oc isRunningWoW6
3590: 34 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  4 {} {..      #.
35a0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
35b0: 6f 72 20 6e 6f 77 2c 20 6a 75 73 74 20 75 73 65  or now, just use
35c0: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 74 65   the existing te
35d0: 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f  st constraint fo
35e0: 72 20 64 65 74 65 63 74 69 6e 67 0d 0a 20 20 20  r detecting..   
35f0: 20 20 20 23 20 20 20 20 20 20 20 61 20 57 6f 57     #       a WoW
3600: 36 34 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  64 process...   
3610: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
3620: 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  rn [haveConstrai
3630: 6e 74 20 77 6f 77 36 34 5d 0d 0a 20 20 20 20 7d  nt wow64]..    }
3640: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
3650: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
3660: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
3670: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
3680: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3690: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
36a0: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
36b0: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
36c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
36d0: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
36e0: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
36f0: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
3700: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
3710: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
3720: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
3730: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
3740: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
3750: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
3760: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
3770: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
3780: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
3790: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
37a0: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
37b0: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
37c0: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
37d0: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
37e0: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
37f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
3800: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
3810: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
3820: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
3830: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
3840: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
3850: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
3860: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
3870: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3880: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
3890: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
38a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
38b0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
38c0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
38d0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
38e0: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
38f0: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
3900: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
3910: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
3920: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3930: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3940: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
3950: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
3960: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
3970: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
3980: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
3990: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
39a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
39b0: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
39c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
39d0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
39e0: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
39f0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
3a00: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3a10: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
3a20: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
3a30: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
3a40: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
3a50: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
3a60: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
3a70: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
3a80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3a90: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
3aa0: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
3ab0: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
3ac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
3ad0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3ae0: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3af0: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
3b00: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
3b10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3b20: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
3b30: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
3b40: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
3b50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3b60: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
3b70: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
3b80: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
3b90: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
3ba0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
3bb0: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
3bc0: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
3bd0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3be0: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
3bf0: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
3c00: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
3c10: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
3c20: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
3c30: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
3c40: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
3c50: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
3c60: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
3c80: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
3c90: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
3ca0: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
3cb0: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
3cc0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
3cd0: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
3ce0: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
3cf0: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
3d10: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
3d20: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
3d30: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
3d40: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
3d50: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
3d60: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3d80: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
3d90: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
3da0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3db0: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
3de0: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
3df0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3e00: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
3e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3e20: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
3e30: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
3e40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3e50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3e60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3e80: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
3e90: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3ea0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3ec0: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3ed0: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3ee0: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
3ef0: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
3f00: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
3f10: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
3f20: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
3f30: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
3f40: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
3f50: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
3f60: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
3f70: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
3f80: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
3f90: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
3fa0: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
3fb0: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
3fc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3fd0: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
3fe0: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
3ff0: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
4000: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
4010: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
4020: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
4030: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
4040: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4050: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
4060: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4070: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
4080: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4090: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
40a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
40b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
40c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
40d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
40e0: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
40f0: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
4100: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
4110: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
4120: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
4130: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
4140: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
4150: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
4160: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
4170: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
4180: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
4190: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
41a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
41b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
41c0: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
41d0: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
41e0: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
41f0: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
4200: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
4210: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
4220: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
4230: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
4240: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
4250: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
4260: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
4270: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
4280: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
4290: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
42a0: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
42b0: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
42c0: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
42d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
42e0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
42f0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
4300: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
4310: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
4320: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
4330: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
4340: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
4350: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
4360: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
4370: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
4380: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
4390: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
43a0: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
43b0: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
43c0: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
43d0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
43e0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
43f0: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
4400: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
4410: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
4420: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4430: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
4440: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
4450: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
4460: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
4470: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
4480: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
4490: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
44a0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
44b0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
44c0: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
44d0: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
44e0: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
44f0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4500: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4510: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
4520: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
4530: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
4540: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
4550: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
4560: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
4570: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
4580: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
4590: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
45a0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
45b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
45c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
45d0: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
45e0: 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 69  platform for thi
45f0: 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20  s machine?..    
4600: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
4610: 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68 69 6e 65  latform [machine
4620: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
4630: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
4640: 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ne)]....      #.
4650: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
4660: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
4670: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
4680: 6d 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  me for the inter
4690: 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  op assembly..   
46a0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
46b0: 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d  ining the System
46c0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
46d0: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20  ive components. 
46e0: 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20   If this..      
46f0: 23 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69  #       file exi
4700: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
4710: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
4720: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
4730: 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65  ..      set file
4740: 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  Name [file nativ
4750: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
4760: 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
4770: 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
4780: 72 6d 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  rm SQLite.Intero
4790: 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  p.dll]]....     
47a0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
47b0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
47c0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
47d0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
47e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
47f0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
4800: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
4810: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
4820: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  \..          SQL
4830: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
4840: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
4850: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
4860: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
4870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
4880: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
4890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
48a0: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
48b0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
48c0: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
48d0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
48e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
48f0: 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20  brary.  If this 
4900: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
4910: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
4920: 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20  ything we..     
4930: 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a   #       need...
4940: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4950: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
4960: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
4970: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
4980: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
4990: 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74 65  $platform sqlite
49a0: 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.dll]]....     
49b0: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
49c0: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
49d0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
49e0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
49f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
4a00: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
4a10: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
4a20: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
4a30: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  \..          sql
4a40: 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  ite3.dll]]....  
4a50: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
4a60: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
4a70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4a80: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
4a90: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
4aa0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4ab0: 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69  One or more nati
4ac0: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65  ve components ne
4ad0: 65 64 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44  eded by System.D
4ae0: 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20  ata.SQLite..    
4af0: 20 20 23 20 20 20 20 20 20 20 61 72 65 20 6d 69    #       are mi
4b00: 73 73 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  ssing...      #.
4b10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
4b20: 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  lse..    }..... 
4b30: 20 20 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73     proc isReleas
4b40: 65 41 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72  eAvailable { dir
4b50: 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20  ectory {varName 
4b60: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ""} } {..      i
4b70: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
4b80: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
4b90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4ba0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
4bb0: 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20  e $varName..    
4bc0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
4bd0: 75 72 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69  urn [isBuildAvai
4be0: 6c 61 62 6c 65 20 22 22 20 24 64 69 72 65 63 74  lable "" $direct
4bf0: 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20  ory $varName].. 
4c00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
4c10: 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63  c joinBuildDirec
4c20: 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61  tory { native pa
4c30: 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d  th year platform
4c40: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d   configuration }
4c50: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
4c60: 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
4c70: 65 20 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72  e out and then r
4c80: 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20  eturn the fully 
4c90: 71 75 61 6c 69 66 69 65 64 20 70 61 74 68 20 74  qualified path t
4ca0: 6f 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20  o the build..   
4cb0: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
4cc0: 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c  tory based on al
4cd0: 6c 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  l the arguments 
4ce0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
4cf0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23  caller...      #
4d00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
4d10: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
4d20: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
4d30: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e  e join $path bin
4d40: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
4d50: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
4d60: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
4d70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
4d80: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74   [file join $pat
4d90: 68 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e  h bin $year $con
4da0: 66 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d  figuration bin].
4db0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
4dc0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
4dd0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b  BuildDirectory {
4de0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
4df0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
4e00: 69 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  if the "native" 
4e10: 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68  runtime option h
4e20: 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66  as been set.  If
4e30: 20 73 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20   so, use the..  
4e40: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
4e50: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69  ctory for the mi
4e60: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
4e70: 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61  y (a.k.a. the na
4e80: 74 69 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20  tive interop..  
4e90: 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65      #       asse
4ea0: 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c  mbly).  To enabl
4eb0: 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69  e this option vi
4ec0: 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  a the command li
4ed0: 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20  ne, enter a..   
4ee0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61     #       comma
4ef0: 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e  nd similar to on
4f00: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
4f10: 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c  ng (all on one l
4f20: 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a  ine):..      #..
4f30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
4f40: 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e  gleShell.exe -in
4f50: 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d  itialize -runtim
4f60: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a  eOption native..
4f70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4f80: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
4f90: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
4fa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
4fb0: 20 20 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73    To enable this
4fc0: 20 6f 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20   option via the 
4fd0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69  command line pri
4fe0: 6f 72 20 74 6f 20 74 68 65 20 22 62 65 74 61 20  or to the "beta 
4ff0: 31 36 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  16"..      #    
5000: 20 20 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61     release of Ea
5010: 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  gle, the followi
5020: 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20  ng command must 
5030: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d  be used instead.
5040: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
5050: 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20  also all on one 
5060: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
5070: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
5080: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69  agleShell.exe -i
5090: 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49  nitialize -postI
50a0: 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20  nitialize..     
50b0: 20 23 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65   #         "obje
50c0: 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
50d0: 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
50e0: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
50f0: 20 6e 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20   native"..      
5100: 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20  #         -file 
5110: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
5120: 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  gle..      #..  
5130: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
5140: 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72  ists ::build_dir
5150: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
5160: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
5170: 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f  length $::build_
5180: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
5190: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
51a0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
51b0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
51c0: 6f 66 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  of the build dir
51d0: 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
51e0: 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20  overridden;..   
51f0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5200: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76  refore, use it v
5210: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
5220: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5230: 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72  urn $::build_dir
5240: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
5250: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5260: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5270: 45 3a 20 49 66 20 74 68 65 20 22 6e 61 74 69 76  E: If the "nativ
5280: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
5290: 6e 20 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69  n is set, the mi
52a0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
52b0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
52c0: 20 20 20 69 73 20 62 65 69 6e 67 20 74 65 73 74     is being test
52d0: 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  ed.  In that cas
52e0: 65 2c 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  e, the path to t
52f0: 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f  he build directo
5300: 72 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ry..        #   
5310: 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e      will contain
5320: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
5330: 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62  me and all the b
5340: 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
5350: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
5360: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72      should be pr
5370: 65 73 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69  esent in that di
5380: 72 65 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65  rectory.  If the
5390: 20 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d   "native" runtim
53a0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
53b0: 20 20 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74     option is not
53c0: 20 73 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20   set, the build 
53d0: 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62  directory will b
53e0: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
53f0: 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
5400: 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65      "platform-ne
5410: 75 74 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65  utral", with the
5420: 20 6e 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69   notable excepti
5430: 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65  on of any native
5440: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5450: 20 20 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e    assembly (e.g.
5460: 20 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70   "SQLite.Interop
5470: 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68  .dll") copied th
5480: 65 72 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a  ere during the..
5490: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
54a0: 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74  build process it
54b0: 73 65 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75  self.  If the bu
54c0: 69 6c 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65  ild process some
54d0: 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20  how does not..  
54e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
54f0: 70 79 20 74 68 65 20 6e 61 74 69 76 65 20 61 73  py the native as
5500: 73 65 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20  sembly for this 
5510: 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f  platform, most o
5520: 66 20 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20  f the tests..   
5530: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
5540: 74 68 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73  the suite will s
5550: 69 6d 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64  imply be skipped
5560: 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65  .  Generally spe
5570: 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20  aking, there..  
5580: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
5590: 65 20 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75  e two ways to bu
55a0: 69 6c 64 20 74 68 65 20 62 69 6e 61 72 69 65 73  ild the binaries
55b0: 20 77 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20   when preparing 
55c0: 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20  to run the..    
55d0: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
55e0: 20 73 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20   suite:..       
55f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20   #..        #   
5600: 20 20 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65      1. Build the
5610: 20 73 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65   separate manage
5620: 64 20 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73  d and native ass
5630: 65 6d 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f  emblies using so
5640: 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  me..        #   
5650: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20         commands 
5660: 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20  similar to:..   
5670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5680: 23 20 20 20 20 20 20 20 20 20 20 62 75 69 6c 64  #          build
5690: 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61  .bat ${Configura
56a0: 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79  tion}ManagedOnly
56b0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20   ${Platform}..  
56c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
56d0: 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e   build.bat ${Con
56e0: 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76  figuration}Nativ
56f0: 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d  eOnly ${Platform
5700: 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  }..        #..  
5710: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
5720: 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75   Where ${Configu
5730: 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65  ration} is eithe
5740: 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
5750: 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20  lease" and..    
5760: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 24      #          $
5770: 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69  {Platform} is ei
5780: 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20  ther "Win32" or 
5790: 22 78 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20  "x64"...        
57a0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  #..        #    
57b0: 20 20 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20     2. Build the 
57c0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
57d0: 62 6c 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d  bly using a comm
57e0: 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  and similar to:.
57f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5800: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
5810: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
5820: 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74  guration} ${Plat
5830: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
5840: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5850: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
5860: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
5870: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
5880: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
5890: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
58a0: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
58b0: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
58c0: 20 6f 72 20 22 78 36 34 22 2e 20 20 49 66 20 74   or "x64".  If t
58d0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a  his command is..
58e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
58f0: 20 20 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73     used, various
5900: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
5910: 69 72 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72  ire supplementar
5920: 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  y managed..     
5930: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 73     #          as
5940: 73 65 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c  semblies (e.g. L
5950: 49 4e 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70  INQ) may be skip
5960: 70 65 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65  ped unless those
5970: 20 62 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20   binaries..     
5980: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 61 72     #          ar
5990: 65 20 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63  e subsequently c
59a0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
59b0: 6f 72 72 65 63 74 20 64 69 72 65 63 74 6f 72 79  orrect directory
59c0: 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20   (i.e. by..     
59d0: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 22 74     #          "t
59e0: 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a  est_all.bat")...
59f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5a00: 20 20 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20     #       Note 
5a10: 74 68 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20  that all of the 
5a20: 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61  build commands a
5a30: 62 6f 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c  bove will defaul
5a40: 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20  t to using..    
5a50: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
5a60: 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f  latest version o
5a70: 66 20 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61  f MSBuild availa
5a80: 62 6c 65 20 61 6e 64 20 74 68 65 20 22 74 65 73  ble and the "tes
5a90: 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20  t_year" may..   
5aa0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65       #       nee
5ab0: 64 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64  d to be adjusted
5ac0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20   accordingly to 
5ad0: 61 63 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65  actually run the
5ae0: 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
5af0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 52 65        #       Re
5b00: 66 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  fer to the comme
5b10: 6e 74 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64  nts in [getBuild
5b20: 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69  Year] for more i
5b30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20  nformation on.. 
5b40: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
5b50: 6f 77 20 74 6f 20 73 65 74 20 74 68 69 73 20 76  ow to set this v
5b60: 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20  ariable...      
5b70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
5b80: 20 6e 61 74 69 76 65 20 5b 68 61 73 52 75 6e 74   native [hasRunt
5b90: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
5ba0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ]....        ret
5bb0: 75 72 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69  urn [joinBuildDi
5bc0: 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20  rectory $native 
5bd0: 5b 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72  [getBuildBaseDir
5be0: 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20  ectory] \..     
5bf0: 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64         [getBuild
5c00: 59 65 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50  Year] [getBuildP
5c10: 6c 61 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d  latform $native]
5c20: 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
5c30: 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20  uration]]..     
5c40: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
5c50: 20 20 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73    proc getReleas
5c60: 65 56 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20  eVersion {} {.. 
5c70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5c80: 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
5c90: 20 74 68 65 20 72 65 6c 65 61 73 65 20 76 65 72   the release ver
5ca0: 73 69 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74  sion for use wit
5cb0: 68 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  h the build dire
5cc0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ctory..      #  
5cd0: 20 20 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69       when checki
5ce0: 6e 67 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65  ng for available
5cf0: 20 72 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20   releases...    
5d00: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
5d10: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65  info exists ::re
5d20: 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26  lease_version] &
5d30: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
5d40: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
5d50: 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e  :release_version
5d60: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5d70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5d80: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65    # NOTE: The re
5d90: 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61  lease version ha
5da0: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
5db0: 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73  n; therefore, us
5dc0: 65 20 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20  e it..        # 
5dd0: 20 20 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d        verbatim..
5de0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5df0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65      return $::re
5e00: 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20  lease_version.. 
5e10: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
5e20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5e30: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c    # NOTE: No rel
5e40: 65 61 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20  ease version is 
5e50: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
5e60: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
5e70: 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  g...        #   
5e80: 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74      It is import
5e90: 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  ant to return an
5ea0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68 65   empty string he
5eb0: 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d 0a  re because the..
5ec0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5ed0: 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 70  result of this p
5ee0: 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65 20  rocedure may be 
5ef0: 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65 20  used with [file 
5f00: 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20 20  join]...        
5f10: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5f20: 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  n ""..      }.. 
5f30: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
5f40: 63 20 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61  c getBuildFileNa
5f50: 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  me { fileName {p
5f60: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
5f70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
5f80: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20  # NOTE: Returns 
5f90: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
5fa0: 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74  le name as if it
5fb0: 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e   were located in
5fc0: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
5fd0: 20 20 20 20 62 75 69 6c 64 20 64 69 72 65 63 74      build direct
5fe0: 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20  ory, discarding 
5ff0: 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e  any directory in
6000: 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e  formation presen
6010: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
6020: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d   in the file nam
6030: 65 20 61 73 20 70 72 6f 76 69 64 65 64 20 62 79  e as provided by
6040: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
6050: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
6060: 20 72 65 73 75 6c 74 20 5b 66 69 6c 65 20 6e 61   result [file na
6070: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
6080: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
6090: 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
60a0: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b  ory] $platform [
60b0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
60c0: 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ame]]]....      
60d0: 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a  #..      # HACK:
60e0: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
60f0: 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20 74   WoW64, assume t
6100: 68 65 20 74 65 73 74 20 65 78 65 63 75 74 61 62  he test executab
6110: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 0d  les are present.
6120: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
6130: 69 74 68 20 74 68 65 20 22 33 32 22 20 73 75 66  ith the "32" suf
6140: 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20  fix on them...  
6150: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
6160: 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34  {[isRunningWoW64
6170: 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65 6e  ] && [file exten
6180: 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65 71  sion $result] eq
6190: 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d   ".exe"} then {.
61a0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73  .        set res
61b0: 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ult [appendArgs 
61c0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
61d0: 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d  result] 32.exe].
61e0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
61f0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
6200: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6210: 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c  proc getExternal
6220: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
6230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6240: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
6250: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
6260: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
6270: 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  e the external b
6280: 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  inary..      #  
6290: 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20 6c       files are l
62a0: 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 23  ocated...      #
62b0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
62c0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
62d0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66  [file dirname [f
62e0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
62f0: 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d 0d 0a 20 20  o binary]]]]..  
6300: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
6310: 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74   getBinaryDirect
6320: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
6330: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6340: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
6350: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
6360: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
6370: 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  test application
6380: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6390: 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65  itself (i.e. the
63a0: 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73   Eagle shell) is
63b0: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
63c0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d  will be used as.
63d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
63e0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
63f0: 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53 79  or the copied Sy
6400: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
6410: 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20   native and..   
6420: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
6430: 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69  ed assemblies (i
6440: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69 73  .e. because this
6450: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   is one of the f
6460: 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20  ew places..     
6470: 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20 74   #       where t
6480: 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75  he CLR will actu
6490: 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f  ally find and lo
64a0: 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79  ad them properly
64b0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
64c0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
64d0: 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72  sts ::binary_dir
64e0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
64f0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6500: 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79  length $::binary
6510: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
6520: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6530: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6540: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
6550: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 64   of the binary d
6560: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
6570: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
6580: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
6590: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
65a0: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
65b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
65c0: 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f  eturn $::binary_
65d0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
65e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
65f0: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
6600: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
6610: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6620: 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c  proc getExternal
6630: 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e  FileName { fileN
6640: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ame } {..      #
6650: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
6660: 52 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63  Returns the spec
6670: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
6680: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f  as if it were lo
6690: 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20  cated in the..  
66a0: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
66b0: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
66c0: 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69   the external bi
66d0: 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20 20 20 23  naries...      #
66e0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
66f0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6700: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 45  [file join [getE
6710: 78 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79  xternalDirectory
6720: 5d 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  ] $fileName]].. 
6730: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6740: 63 20 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e  c getBinaryFileN
6750: 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ame { fileName {
6760: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b  platform ""} } {
6770: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6780: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73   # NOTE: Returns
6790: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
67a0: 69 6c 65 20 6e 61 6d 65 20 61 73 20 69 66 20 69  ile name as if i
67b0: 74 20 77 65 72 65 20 6c 6f 63 61 74 65 64 20 69  t were located i
67c0: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  n the..      #  
67d0: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
67e0: 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64 69 6e  ctory, discardin
67f0: 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72 79 20  g any directory 
6800: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72 65 73  information pres
6810: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
6820: 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65 20 6e     in the file n
6830: 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65 64 20  ame as provided 
6840: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a  by our caller...
6850: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
6860: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
6870: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
6880: 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b      [file join [
6890: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
68a0: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 66  ry] $platform [f
68b0: 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
68c0: 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  me]]]..    }....
68d0: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 72  .    proc getCor
68e0: 65 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  eBinaryFileName 
68f0: 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  { {platform ""} 
6900: 7b 73 74 61 6e 64 61 72 64 20 66 61 6c 73 65 7d  {standard false}
6910: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
6920: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
6930: 75 72 6e 73 20 74 68 65 20 66 75 6c 6c 20 70 61  urns the full pa
6940: 74 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  th for the file 
6950: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
6960: 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20  QLite core..    
6970: 20 20 23 20 20 20 20 20 20 20 6e 61 74 69 76 65    #       native
6980: 20 6c 69 62 72 61 72 79 20 63 6f 64 65 20 66 6f   library code fo
6990: 72 20 74 68 69 73 20 70 6c 61 74 66 6f 72 6d 2e  r this platform.
69a0: 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 61    First, check a
69b0: 6e 64 20 73 65 65 20 69 66 0d 0a 20 20 20 20 20  nd see if..     
69c0: 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c   #       the SQL
69d0: 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20  ite core native 
69e0: 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72 65  library has alre
69f0: 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 2e  ady been loaded.
6a00: 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20 20 20 23    Next,..      #
6a10: 20 20 20 20 20 20 20 66 61 6c 6c 62 61 63 6b 20         fallback 
6a20: 74 6f 20 77 68 61 74 20 74 68 65 20 66 75 6c 6c  to what the full
6a30: 20 70 61 74 68 20 73 68 6f 75 6c 64 20 62 65 2c   path should be,
6a40: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
6a50: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  r the..      #  
6a60: 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20       mixed-mode 
6a70: 61 73 73 65 6d 62 6c 79 20 69 73 20 62 65 69 6e  assembly is bein
6a80: 67 20 75 73 65 64 20 61 6e 64 20 74 68 65 20 6e  g used and the n
6a90: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
6aa0: 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  nt..      #     
6ab0: 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20    platform...   
6ac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
6ad0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
6ae0: 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
6af0: 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
6b00: 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
6b10: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
6b20: 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65  ite.UnsafeNative
6b30: 4d 65 74 68 6f 64 73 20 5f 53 51 4c 69 74 65 4e  Methods _SQLiteN
6b40: 61 74 69 76 65 4d 6f 64 75 6c 65 46 69 6c 65 4e  ativeModuleFileN
6b50: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 20 66 69 6c  ame..      } fil
6b60: 65 4e 61 6d 65 5d 20 3d 3d 20 30 20 26 26 20 5b  eName] == 0 && [
6b70: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
6b80: 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68  ileName] > 0} th
6b90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6ba0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6bb0: 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   The SQLite core
6bc0: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
6bd0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
6be0: 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20 20   loaded via..   
6bf0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
6c00: 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20   native library 
6c10: 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65 74  pre-loader.  Ret
6c20: 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e 61  urn that file na
6c30: 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  me now...       
6c40: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6c50: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
6c60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
6c70: 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
6c80: 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68  tion native]} th
6c90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
6ca0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6cb0: 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65   Return the mixe
6cc0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
6cd0: 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20  file name...    
6ce0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6cf0: 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69  eturn [file nati
6d00: 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  vename \..      
6d10: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
6d20: 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63   [getBinaryDirec
6d30: 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20  tory] $platform 
6d40: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
6d50: 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20  te.dll]]..      
6d60: 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 6e 64  } elseif {$stand
6d70: 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ard} then {..   
6d80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6d90: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
6da0: 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 73  he native-only s
6db0: 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20 6c  tandard SQLite l
6dc0: 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  ibrary file name
6dd0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
6de0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69        return [fi
6df0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d  le nativename \.
6e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69  .            [fi
6e10: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61  le join [getBina
6e20: 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c  ryDirectory] $pl
6e30: 61 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e 64  atform sqlite3.d
6e40: 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ll]]..      } el
6e50: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
6e60: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
6e70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74 69   Return the nati
6e80: 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20  ve-only interop 
6e90: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61  assembly file na
6ea0: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
6eb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
6ec0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
6ed0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
6ee0: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69  file join [getBi
6ef0: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24  naryDirectory] $
6f00: 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e  platform SQLite.
6f10: 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 20  Interop.dll]].. 
6f20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
6f30: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
6f40: 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b 7d  mmonDirectory {}
6f50: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6f60: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6f70: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
6f80: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
6f90: 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20 73  where the test s
6fa0: 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23 20  cripts..      # 
6fb0: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
6fc0: 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65 66  located.  By def
6fd0: 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20  ault, this just 
6fe0: 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67 6c  returns the Eagl
6ff0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
7000: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
7010: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
7020: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
7030: 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72  sts ::common_dir
7040: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
7050: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
7060: 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e  length $::common
7070: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
7080: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7090: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
70a0: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
70b0: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 64   of the common d
70c0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
70d0: 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20 20  n set;..        
70e0: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
70f0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
7100: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
7110: 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f  eturn $::common_
7120: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
7130: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
7140: 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f 72   exists ::vendor
7150: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7160: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7170: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76 65  ing length $::ve
7180: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20  ndor_directory] 
7190: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
71a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
71b0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
71c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e 64  tion of the vend
71d0: 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  or directory has
71e0: 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20   been set;..    
71f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
7200: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
7210: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7220: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65 6e     return $::ven
7230: 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  dor_directory.. 
7240: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
7250: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
7260: 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c 0d  l_library] && \.
7270: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
7280: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63 6c  ng length $::tcl
7290: 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26 26  _library] > 0 &&
72a0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
72b0: 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79 20  ile isdirectory 
72c0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 7d  $::tcl_library]}
72d0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
72e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
72f0: 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c 65  TE: The variable
7300: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74 69   with the locati
7310: 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70 74  on of the script
7320: 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20 20   library is..   
7330: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
7340: 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f 20   and appears to 
7350: 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63 74  be a real direct
7360: 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65 6d  ory (i.e. not em
7370: 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20 20  bedded..        
7380: 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20 61  #       within a
7390: 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f 72   file); therefor
73a0: 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20  e, use it...    
73b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
73c0: 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69 62  eturn $::tcl_lib
73d0: 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  rary..      } el
73e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
73f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
7400: 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   Fallback to the
7410: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
7420: 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  ining the execut
7430: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
7440: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7450: 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a   [info binary]..
7460: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
7470: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44  ...    proc getD
7480: 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72 79  atabaseDirectory
7490: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
74a0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
74b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
74c0: 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f  urns the directo
74d0: 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73  ry where the tes
74e0: 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20 20  t databases..   
74f0: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
7500: 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42  d be located.  B
7510: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20  y default, this 
7520: 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74 65  just uses the te
7530: 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
7540: 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
7550: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
7560: 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20  this system...  
7570: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
7580: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
7590: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
75a0: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
75b0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
75c0: 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64  th $::database_d
75d0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
75e0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
75f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
7600: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
7610: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  f the database d
7620: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
7630: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
7640: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7650: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7660: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
7680: 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74 6f  database_directo
7690: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
76a0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
76b0: 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63   ::scratch_direc
76c0: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
76d0: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
76e0: 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f  ngth $::scratch_
76f0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7700: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7710: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7720: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7730: 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64  of the scratch d
7740: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
7750: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
7760: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7770: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7780: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
77a0: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
77b0: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
77c0: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
77d0: 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50  n [getTemporaryP
77e0: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ath]..      }.. 
77f0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7800: 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69  c getTemporaryDi
7810: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
7820: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7830: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
7840: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
7850: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
7860: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
7870: 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  les..      #    
7880: 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63     should be loc
7890: 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c  ated.  By defaul
78a0: 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73 65  t, this just use
78b0: 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d  s the temporary.
78c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
78d0: 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75  irectory configu
78e0: 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79 73  red for this sys
78f0: 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  tem...      #.. 
7900: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
7910: 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61 72  xists ::temporar
7920: 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  y_directory] && 
7930: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
7940: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
7950: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
7960: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
7970: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
7980: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
7990: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
79a0: 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
79b0: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
79c0: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
79d0: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
79e0: 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20  ore, use it...  
79f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
7a00: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70 6f   return $::tempo
7a10: 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a  rary_directory..
7a20: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
7a30: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 73  [info exists ::s
7a40: 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79  cratch_directory
7a50: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
7a60: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
7a70: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
7a80: 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e  ctory] > 0} then
7a90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7aa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
7ab0: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
7ac0: 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65 63  he scratch direc
7ad0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
7ae0: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
7af0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
7b00: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
7b10: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7b20: 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72 61    return $::scra
7b30: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  tch_directory.. 
7b40: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
7b50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67         return [g
7b60: 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68 5d  etTemporaryPath]
7b70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
7b80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
7b90: 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70 20  tExecuteOnSetup 
7ba0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b  {} {..      if {
7bb0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65  [info exists ::e
7bc0: 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70 5d  xecute_on_setup]
7bd0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7be0: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7bf0: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
7c00: 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tup] > 0} then {
7c10: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7c20: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
7c30: 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75 72  urn the configur
7c40: 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75 74  ed SQL to execut
7c50: 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6e  e during the con
7c60: 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  nection..       
7c70: 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20 70   #       setup p
7c80: 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20 66  rocedure (i.e. f
7c90: 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64 61  or every test da
7ca0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7cb0: 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n)...        #..
7cc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
7cd0: 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74  ::execute_on_set
7ce0: 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  up..      } else
7cf0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
7d00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
7d10: 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
7d20: 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65 78   is no SQL to ex
7d30: 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68 65  ecute during the
7d40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
7d50: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
7d60: 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e  up procedure (i.
7d70: 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65 73  e. for every tes
7d80: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
7d90: 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20  ction)...       
7da0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7db0: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
7dc0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7dd0: 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72 69  oc getTestOverri
7de0: 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b 65  desPreamble { {e
7df0: 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22 7d  xtraVarNames ""}
7e00: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
7e10: 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d 0d  varNames [list].
7e20: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7e30: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
7e40: 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77 69  ilable, start wi
7e50: 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c 69  th the master li
7e60: 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72 72  st of test overr
7e70: 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ide..      #    
7e80: 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a 20     variables... 
7e90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
7ea0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
7eb0: 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d  :test_overrides]
7ec0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7ed0: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
7ee0: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20 30  t_overrides] > 0
7ef0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7f00: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76    eval lappend v
7f10: 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74 5f  arNames $::test_
7f20: 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20 20  overrides..     
7f30: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
7f40: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
7f50: 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72  requested by our
7f60: 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e 79   caller, add any
7f70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72 69   additional vari
7f80: 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20  able..      #   
7f90: 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f 70      names to cop
7fa0: 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  y now...      #.
7fb0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  .      if {[llen
7fc0: 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61 6d  gth $extraVarNam
7fd0: 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  es] > 0} then {.
7fe0: 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61  .        eval la
7ff0: 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20 24  ppend varNames $
8000: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a 20  extraVarNames.. 
8010: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8020: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8030: 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69 70   Build the scrip
8040: 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62 65  t fragment to be
8050: 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72 6f   returned by pro
8060: 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20 20  cessing each..  
8070: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
8080: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61 64  able name and ad
8090: 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65 73  ding the nececes
80a0: 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61 67  sary script frag
80b0: 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20 20  ments for..     
80c0: 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f 6e   #       each on
80d0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
80e0: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22 22     set result ""
80f0: 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
8100: 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61  h varName $varNa
8110: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  mes {..        #
8120: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
8130: 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61 6c  : Build the qual
8140: 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61 72  ified global var
8150: 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20  iable name...   
8160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8170: 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65 20  set fullVarName 
8180: 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20 24  [appendArgs :: $
8190: 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  varName]....    
81a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
81b0: 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65 20   NOTE: Does the 
81c0: 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20 69  variable exist i
81d0: 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
81e0: 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20 20  er context?..   
81f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
8200: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
8210: 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20   $fullVarName]} 
8220: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8230: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
8240: 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61 20   NOTE: Append a 
8250: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
8260: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74 68  to the result th
8270: 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74 6c  at will correctl
8280: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
8290: 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63 6f       copy any co
82a0: 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74 6f  ntained value to
82b0: 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70 72   another interpr
82c0: 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a 20  eter context... 
82d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
82e0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65 73        append res
82f0: 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24 66  ult \n "set " $f
8300: 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b 22  ullVarName " \{"
8310: 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61   [set $fullVarNa
8320: 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20 20  me] \}..        
8330: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
8340: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8350: 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73 75  OTE: If the resu
8360: 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  lt contains one 
8370: 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20 66  or more script f
8380: 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e 64  ragments, append
8390: 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   a..      #     
83a0: 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20 20    newline...    
83b0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
83c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72  string length $r
83d0: 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65 6e  esult] > 0} then
83e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
83f0: 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20 20  nd result \n..  
8400: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
8410: 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
8420: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
8430: 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72  c getAppDomainPr
8440: 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78  eamble { {prefix
8450: 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d   ""} {suffix ""}
8460: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
8470: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
8480: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
8490: 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70  rns a test setup
84a0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
84b0: 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20   suitable for.. 
84c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61       #       eva
84d0: 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e  luation by an in
84e0: 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65  terpreter create
84f0: 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64  d in an isolated
8500: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
8510: 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61      #       doma
8520: 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20  in.  The script 
8530: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
8540: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
8550: 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20  surrounded by.. 
8560: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
8570: 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66   prefix and suff
8580: 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d  ix "script fragm
8590: 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20  ents" specified 
85a0: 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a  by our caller,..
85b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66        #       if
85c0: 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72   any.  The entir
85d0: 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72  e script being r
85e0: 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
85f0: 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d  substituted via.
8600: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
8610: 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63  subst], in the c
8620: 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
8630: 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69  ller, before bei
8640: 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20  ng returned...  
8650: 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73      #       This
8660: 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61   step is necessa
8670: 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20  ry so that some 
8680: 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20  limited context 
8690: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20  information,..  
86a0: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d      #       prim
86b0: 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f  arily related to
86c0: 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72   the testing dir
86d0: 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65  ectories, can be
86e0: 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20   transferred..  
86f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74      #       to t
8700: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  he interpreter i
8710: 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61  n the isolated a
8720: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
8730: 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20  n, making it..  
8740: 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65      #       able
8750: 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79   to successfully
8760: 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20   run tests that 
8770: 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d  require one or m
8780: 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ore of the..    
8790: 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20    #       files 
87a0: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  in one of the te
87b0: 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65  sting directorie
87c0: 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75  s.  Callers shou
87d0: 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20  ld keep in..    
87e0: 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74    #       mind t
87f0: 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72  hat the test scr
8800: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69  ipt fragment bei
8810: 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e  ng returned cann
8820: 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20  ot rely on..    
8830: 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63    #       any sc
8840: 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f  ript library pro
8850: 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65  cedures that are
8860: 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79   not provided by
8870: 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20   the Eagle..    
8880: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
8890: 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20  y package (i.e. 
88a0: 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69  "init.eagle"), i
88b0: 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70  ncluding those p
88c0: 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20  rovided by..    
88d0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61    #       the Ea
88e0: 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  gle test package
88f0: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c  , unless the fil
8900: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8910: 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20  m is loaded..   
8920: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61     #       manua
8930: 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68  lly via some oth
8940: 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e  er mechanism (e.
8950: 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20  g. by including 
8960: 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20  appropriate..   
8970: 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b     #       [pack
8980: 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20  age require] or 
8990: 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64  [source] command
89a0: 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20  s in the prefix 
89b0: 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20  or suffix..     
89c0: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
89d0: 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73  fragments).  Als
89e0: 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20  o, all variable 
89f0: 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61  references and a
8a00: 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20  ll nested..     
8a10: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
8a20: 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e  s (i.e. those in
8a30: 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73   square brackets
8a40: 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  ) contained in t
8a50: 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20  he final..      
8a60: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
8a70: 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64  ragment will end
8a80: 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61   up being evalua
8a90: 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ted in the conte
8aa0: 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  xt of the..     
8ab0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67   #       calling
8ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64   interpreter and
8ad0: 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20   not the target 
8ae0: 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61  interpreter crea
8af0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
8b00: 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74    #       isolat
8b10: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ed application d
8b20: 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65  omain unless the
8b30: 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e   dollar signs an
8b40: 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20  d/or square..   
8b50: 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b     #       brack
8b60: 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c  ets are speciall
8b70: 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61  y quoted with ba
8b80: 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20  ckslashes...    
8b90: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
8ba0: 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69  n [uplevel 1 [li
8bb0: 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64  st subst [append
8bc0: 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a  Args $prefix {..
8bd0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
8be0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
8bf0: 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
8c00: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8c10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
8c20: 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d  e \[object\] com
8c30: 6d 61 6e 64 20 6d 61 79 20 62 65 20 6d 69 73 73  mand may be miss
8c40: 69 6e 67 20 69 6e 20 73 6f 6d 65 20 45 61 67 6c  ing in some Eagl
8c50: 65 20 63 6f 72 65 0d 0a 20 20 20 20 20 20 20 20  e core..        
8c60: 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72    #       librar
8c70: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  y configurations
8c80: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
8c90: 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 70 79 20   we cannot copy 
8ca0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23  the..          #
8cb0: 20 20 20 20 20 20 20 22 6e 61 74 69 76 65 22 20         "native" 
8cc0: 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0d  runtime option..
8cd0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
8ce0: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
8cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
8d00: 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
8d10: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
8d20: 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f   AddRuntimeOptio
8d30: 6e 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20 20  n native..      
8d40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
8d50: 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65  ..      } [getTe
8d60: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
8d70: 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74  ble [list path t
8d80: 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73  est_channel]] $s
8d90: 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  uffix]]]..    }.
8da0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
8db0: 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65  CopyExternalFile
8dc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8dd0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
8de0: 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e  rm ""} {newFileN
8df0: 61 6d 65 20 22 22 7d 20 7b 76 65 72 62 6f 73 65  ame ""} {verbose
8e00: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
8e10: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
8e20: 65 4e 61 6d 65 20 5b 67 65 74 45 78 74 65 72 6e  eName [getExtern
8e30: 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  alFileName $file
8e40: 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  Name]....      i
8e50: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
8e60: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
8e70: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
8e80: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
8e90: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8ea0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8eb0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8ec0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8ed0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
8ee0: 70 65 64 20 63 6f 70 79 69 6e 67 20 65 78 74 65  ped copying exte
8ef0: 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20 24 73  rnal file \"" $s
8f00: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
8f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
8f20: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
8f30: 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20  exist\n"]..     
8f40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65     }..        re
8f50: 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  turn..      }...
8f60: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
8f70: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69  ng length $newFi
8f80: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
8f90: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
8fa0: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
8fb0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
8fc0: 6d 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20  me $newFileName 
8fd0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
8fe0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
8ff0: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
9000: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
9010: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
9020: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
9030: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9040: 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63   set targetDirec
9050: 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61  tory [file dirna
9060: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
9070: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  me]....      if 
9080: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
9090: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
90a0: 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65  ists $targetDire
90b0: 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
90c0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d            file m
90d0: 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65  kdir $targetDire
90e0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d  ctory..        }
90f0: 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
9100: 6f 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72  opy -force $sour
9110: 63 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67  ceFileName $targ
9120: 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20  etFileName..    
9130: 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20    }] == 0} then 
9140: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
9150: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9160: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9170: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
9180: 2d 20 63 6f 70 69 65 64 20 65 78 74 65 72 6e 61  - copied externa
9190: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  l file from \"" 
91a0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
91b0: 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20  "\" to \"" \..  
91c0: 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65            $targe
91d0: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
91e0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
91f0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
9200: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
9210: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
9220: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
9230: 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 65  failed to copy e
9240: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
9250: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
9260: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
9270: 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20       "\" to \"" 
9280: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
9290: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
92a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
92b0: 6f 63 20 74 72 79 43 6f 70 79 42 69 6e 61 72 79  oc tryCopyBinary
92c0: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
92d0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
92e0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
92f0: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
9300: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9310: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
9320: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69  eFileName [getBi
9330: 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
9340: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
9350: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  ]....      if {!
9360: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f  [file exists $so
9370: 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74  urceFileName]} t
9380: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
9390: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
93a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
93b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
93c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
93d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
93e0: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
93f0: 63 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66  copying binary f
9400: 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46  ile \"" $sourceF
9410: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
9420: 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74           "\", it
9430: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
9440: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
9450: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
9460: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9470: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
9480: 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65  gth $newFileName
9490: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
94a0: 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65         set targe
94b0: 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75  tFileName [getBu
94c0: 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77  ildFileName $new
94d0: 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  FileName $platfo
94e0: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  rm]..      } els
94f0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
9500: 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20   targetFileName 
9510: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
9520: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
9530: 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d  tform]..      }.
9540: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 74 61 72  ...      set tar
9550: 67 65 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69  getDirectory [fi
9560: 6c 65 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67  le dirname $targ
9570: 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20  etFileName].... 
9580: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
9590: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
95a0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 74 61  [file exists $ta
95b0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20  rgetDirectory]} 
95c0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
95d0: 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61    file mkdir $ta
95e0: 72 67 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20  rgetDirectory.. 
95f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9600: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
9610: 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ce $sourceFileNa
9620: 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61  me $targetFileNa
9630: 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20  me..      }] == 
9640: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9650: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
9660: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
9670: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
9680: 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64      "---- copied
9690: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
96a0: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
96b0: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
96c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
96d0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
96e0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
96f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
9700: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
9710: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9720: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9730: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
9740: 63 6f 70 79 20 62 69 6e 61 72 79 20 66 69 6c 65  copy binary file
9750: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
9760: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
9770: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
9780: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
9790: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
97a0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
97b0: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 75    proc tryCopyBu
97c0: 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20  ildFile {..     
97d0: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
97e0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e  {platform ""} {n
97f0: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b  ewFileName ""} {
9800: 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d  verbose false} }
9810: 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f   {..      set so
9820: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65  urceFileName [ge
9830: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24  tBuildFileName $
9840: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
9850: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
9860: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
9870: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d  sourceFileName]}
9880: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9890: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
98a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
98b0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
98c0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
98d0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
98e0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
98f0: 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64 20  d copying build 
9900: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
9910: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
9920: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
9930: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
9940: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
9950: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
9960: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9970: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
9980: 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d  ngth $newFileNam
9990: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
99a0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
99b0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
99c0: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 6e  inaryFileName $n
99d0: 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74  ewFileName $plat
99e0: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  form]..      } e
99f0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  lse {..        s
9a00: 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  et targetFileNam
9a10: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
9a20: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
9a30: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
9a40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
9a50: 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79 20  targetDirectory 
9a60: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 74  [file dirname $t
9a70: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d 0a  argetFileName]..
9a80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
9a90: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  ch {..        if
9aa0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
9ab0: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
9ac0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
9ad0: 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20       file mkdir 
9ae0: 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79  $targetDirectory
9af0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
9b00: 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d       file copy -
9b10: 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c  force $sourceFil
9b20: 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c  eName $targetFil
9b30: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d 20  eName..      }] 
9b40: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
9b50: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
9b60: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
9b70: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
9b80: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
9b90: 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 66  ied build file f
9ba0: 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46  rom \"" $sourceF
9bb0: 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c  ileName "\" to \
9bc0: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
9bd0: 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d    $targetFileNam
9be0: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
9bf0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9c00: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
9c10: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
9c20: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
9c30: 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74    "---- failed t
9c40: 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66 69 6c  o copy build fil
9c50: 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72  e from \"" $sour
9c60: 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20  ceFileName \..  
9c70: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f            "\" to
9c80: 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65   \"" $targetFile
9c90: 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  Name \"\n]..    
9ca0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
9cb0: 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74     proc tryDelet
9cc0: 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69  eBinaryFile { fi
9cd0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
9ce0: 20 22 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61   ""} {verbose fa
9cf0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
9d00: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
9d10: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
9d20: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
9d30: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
9d40: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
9d50: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
9d60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
9d70: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
9d80: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
9d90: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
9da0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
9db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
9dc0: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
9dd0: 65 74 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  eting binary fil
9de0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
9df0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
9e00: 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f   "\", it does no
9e10: 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20  t exist\n"]..   
9e20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9e30: 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d  return..      }.
9e40: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
9e50: 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
9e60: 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20   $fileName}] == 
9e70: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
9e80: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
9e90: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
9ea0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
9eb0: 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65      "---- delete
9ec0: 64 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c 22  d binary file \"
9ed0: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
9ee0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
9ef0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
9f00: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
9f10: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
9f30: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
9f40: 74 65 20 62 69 6e 61 72 79 20 66 69 6c 65 20 5c  te binary file \
9f50: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
9f60: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
9f70: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9f80: 74 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69  tryDeleteBuildFi
9f90: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  le { fileName {p
9fa0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72  latform ""} {ver
9fb0: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
9fc0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
9fd0: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
9fe0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
9ff0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
a000: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
a010: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
a020: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a030: 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20    if {$verbose} 
a040: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
a050: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
a060: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
a070: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a080: 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70       "---- skipp
a090: 65 64 20 64 65 6c 65 74 69 6e 67 20 62 75 69 6c  ed deleting buil
a0a0: 64 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  d file \"" $file
a0b0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
a0c0: 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f        "\", it do
a0d0: 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d  es not exist\n"]
a0e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a0f0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
a100: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
a110: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
a120: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
a130: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
a140: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
a150: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
a160: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
a170: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
a180: 65 6c 65 74 65 64 20 62 75 69 6c 64 20 66 69 6c  eleted build fil
a190: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
a1a0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
a1b0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
a1c0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
a1d0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a1e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a1f0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
a200: 64 65 6c 65 74 65 20 62 75 69 6c 64 20 66 69 6c  delete build fil
a210: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
a220: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
a230: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a240: 6f 63 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62  oc tryCopyAssemb
a250: 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ly {..          
a260: 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74    fileName {plat
a270: 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72  form ""} {pdb tr
a280: 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c  ue} {verbose fal
a290: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  se} } {..      t
a2a0: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
a2b0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
a2c0: 6f 72 6d 20 22 22 20 24 76 65 72 62 6f 73 65 0d  orm "" $verbose.
a2d0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64  ...      if {$pd
a2e0: 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  b} then {..     
a2f0: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
a300: 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ile [appendArgs 
a310: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
a320: 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66  file rootname $f
a330: 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24  ileName] .pdb] $
a340: 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72  platform "" $ver
a350: 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  bose..      }.. 
a360: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
a370: 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d  c tryDeleteAssem
a380: 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  bly {..         
a390: 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61     fileName {pla
a3a0: 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74  tform ""} {pdb t
a3b0: 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 66 61  rue} {verbose fa
a3c0: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
a3d0: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
a3e0: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
a3f0: 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65  latform $verbose
a400: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70  ....      if {$p
a410: 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  db} then {..    
a420: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
a430: 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  aryFile [appendA
a440: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a450: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
a460: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
a470: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65  b] $platform $ve
a480: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rbose..      }..
a490: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
a4a0: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
a4b0: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
a4c0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
a4d0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
a4e0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
a4f0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
a500: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
a510: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a520: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  {..        set a
a530: 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20  ssembly [object 
a540: 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46  load -loadtype F
a550: 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65  ile -alias $file
a560: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20  Name]..      }] 
a570: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
a580: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a590: 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64   # NOTE: Now, ad
a5a0: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
a5b0: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e  test constraint.
a5c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a5d0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
a5e0: 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  nt [file rootnam
a5f0: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
a600: 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  leName]]....    
a610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
a620: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
a630: 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65  image runtime ve
a640: 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61  rsion from the a
a650: 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d  ssembly because.
a660: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
a670: 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72   several tests r
a680: 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67  ely on it having
a690: 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65   a certain value
a6a0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a6b0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
a6c0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
a6d0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
a6e0: 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20  Name] _ \..     
a6f0: 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c         [$assembl
a700: 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65  y ImageRuntimeVe
a710: 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rsion]]....     
a720: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a730: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
a740: 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68   full path of th
a750: 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a  e loaded file...
a760: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a770: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
a780: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
a790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
a7a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
a7b0: 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64  roc isSQLiteRead
a7c0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
a7d0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
a7e0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75  his procedure mu
a7f0: 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  st return non-ze
a800: 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53  ro only if the S
a810: 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20  QLite native..  
a820: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
a830: 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74  ary and the Syst
a840: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d  em.Data.SQLite m
a850: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
a860: 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20  are loaded..    
a870: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
a880: 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
a890: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20  he test suite.  
a8a0: 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20  Currently, this 
a8b0: 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20  procedure..     
a8c0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
a8d0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61  be called only a
a8e0: 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61  fter the [tryLoa
a8f0: 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65  dAssembly] proce
a900: 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20  dure has..      
a910: 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c  #       been cal
a920: 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72  led to probe for
a930: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
a940: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
a950: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
a960: 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20  #       and the 
a970: 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d  [checkForSQLite]
a980: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62   procedure has b
a990: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72  een called to pr
a9a0: 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  obe for..      #
a9b0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
a9c0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
a9d0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69  ; otherwise, thi
a9e0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c  s procedure will
a9f0: 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23   simply..      #
aa00: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65         always re
aa10: 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20  turn zero...    
aa20: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
aa30: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
aa40: 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
aa50: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
aa60: 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43  QLite] && [haveC
aa70: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
aa80: 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  ]..      }]..   
aa90: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
aaa0: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 7b 20 70  matchMachine { p
aab0: 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20 20  latform } {..   
aac0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
aad0: 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74 72  TE: An empty str
aae0: 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61 74  ing for the plat
aaf0: 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74 20  form means that 
ab00: 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f 74  the build is not
ab10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
ab20: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e 61  [primarily] a na
ab30: 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65 72  tive build; ther
ab40: 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79 73  efore, it always
ab50: 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20 20   matches...     
ab60: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
ab70: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
ab80: 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68  atform] == 0} th
ab90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
aba0: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
abb0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
abc0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
abd0: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
abe0: 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20 75  platform match u
abf0: 70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  p to the current
ac00: 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20 20   process?..     
ac10: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70   #..      if {$p
ac20: 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63 68  latform eq [mach
ac30: 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a  ineToPlatform $:
ac40: 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61  :tcl_platform(ma
ac50: 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  chine)]} then {.
ac60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ac70: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
ac80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ac90: 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65 63  # NOTE: The spec
aca0: 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 64  ified platform d
acb0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75 70  oes not match up
acc0: 20 77 69 74 68 20 74 68 65 20 70 6c 61 74 66 6f   with the platfo
acd0: 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  rm..      #     
ace0: 20 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e    for the curren
acf0: 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20  t process...    
ad00: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
ad10: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
ad20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 76 65  ...    proc have
ad30: 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
ad40: 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  and {} {..      
ad50: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ad60: 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d   Is the [object]
ad70: 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e 74   command current
ad80: 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20  ly available?.. 
ad90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
ada0: 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c 65  turn [expr {[lle
adb0: 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61  ngth [info comma
adc0: 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20 30  nds object]] > 0
add0: 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  }]..    }.....  
ade0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
adf0: 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
ae00: 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b  nd { channel } {
ae10: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
ae20: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65  hannel "---- che
ae30: 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a 65  cking for \"obje
ae40: 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73 61  ct\" command usa
ae50: 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ge... "....     
ae60: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
ae70: 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f 62  ts ::no(sqliteOb
ae80: 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26 26  jectCommand)] &&
ae90: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
aea0: 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
aeb0: 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
aec0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
aed0: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
aee0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
aef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
af00: 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73 73    # NOTE: Unless
af10: 20 77 65 20 61 72 65 20 66 6f 72 62 69 64 64 65   we are forbidde
af20: 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f 2c  n from doing so,
af30: 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74 72   add some constr
af40: 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 23  aints..        #
af50: 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c         that will
af60: 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20 74   allow most of t
af70: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 74 6f  he test suite to
af80: 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73 65   run (i.e. those
af90: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
afa0: 20 20 74 65 73 74 73 20 74 68 61 74 20 64 6f 20    tests that do 
afb0: 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72 65 6c  not directly rel
afc0: 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a 65  y upon the [obje
afd0: 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a 20  ct] command)... 
afe0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
aff0: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
b000: 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51 4c  sts ::no(shimSQL
b010: 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73 74  iteAssemblyConst
b020: 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b  raints)]} then {
b030: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
b040: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
b050: 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 43  ..          addC
b060: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
b070: 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20  Interop..       
b080: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b090: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
b0a0: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61  ite..          a
b0b0: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79 73  ddConstraint Sys
b0c0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
b0d0: 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20 20  Encryption..    
b0e0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
b0f0: 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
b100: 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a 20  SQLite.Linq.... 
b110: 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73           addCons
b120: 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
b130: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
b140: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
b150: 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67 65  SQLite.dll_v [ge
b160: 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f 6e  tBuildClrVersion
b170: 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ]]..        }...
b180: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
b190: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
b1a0: 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69 6e 65  shimSQLiteDefine
b1b0: 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61 69  ConstantConstrai
b1c0: 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  nts)]} then {.. 
b1d0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
b1e0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20   defineConstant 
b1f0: 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
b200: 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45         INTEROP_E
b210: 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
b220: 4e 53 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f  NS INTEROP_TEST_
b230: 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20  EXTENSION \..   
b240: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
b250: 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
b260: 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c   USE_INTEROP_DLL
b270: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
b280: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b   addConstraint [
b290: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
b2b0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73  fineConstant.Sys
b2c0: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
b2d0: 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
b2e0: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
b2f0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
b300: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
b310: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d  exists ::no(shim
b320: 53 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75 64  SQLiteVisualStud
b330: 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d  ioConstraints)]}
b340: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b350: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b360: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69 73   [appendArgs vis
b370: 75 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42 75  ualStudio [getBu
b380: 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20 20  ildYear]]..     
b390: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
b3a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
b3b0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  o\n..      }..  
b3c0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
b3d0: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42   checkForSQLiteB
b3e0: 75 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20  uilds { channel 
b3f0: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
b400: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
b410: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
b420: 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
b430: 62 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e  ble valid combin
b440: 61 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20  ation of values 
b450: 75 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20  used when..     
b460: 20 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e   #       locatin
b470: 67 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20  g out the build 
b480: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
b490: 2c 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61  , showing each a
b4a0: 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
b4b0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61  #       build va
b4c0: 72 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68  riation along th
b4d0: 65 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d  e way...      #.
b4e0: 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e  .      foreach n
b4f0: 61 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73  ative [list fals
b500: 65 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20  e true] {..     
b510: 20 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20     foreach year 
b520: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20  [getBuildYears] 
b530: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
b540: 65 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  each configurati
b550: 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
b560: 69 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20  igurations] {.. 
b570: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
b580: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
b590: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  : Figure out the
b5a0: 20 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64   effective build
b5b0: 20 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73   platform.  This
b5c0: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
b5d0: 20 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f   #       based o
b5e0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
b5f0: 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e   a [primarily] n
b600: 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20  ative build..   
b610: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
b620: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
b630: 20 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d   For [primarily]
b640: 20 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c   non-native buil
b650: 64 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ds,..           
b660: 20 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69   #       this wi
b670: 6c 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73  ll be an empty s
b680: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
b690: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b6a0: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
b6b0: 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72  [getBuildPlatfor
b6c0: 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20  m $native]....  
b6d0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
b6e0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
b6f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
b700: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
b710: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
b720: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
b730: 69 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d  ild \"" [expr \.
b740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b750: 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74   {$native ? "nat
b760: 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78  ive/" : ""}] [ex
b770: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
b780: 74 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  th \..          
b790: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d        $platform]
b7a0: 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72   > 0 ? [appendAr
b7b0: 67 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20  gs $platform /] 
b7c0: 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a  : ""}] $year \..
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
b7f0: 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
b800: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
b810: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
b820: 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79   Build the fully
b830: 20 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63   qualified direc
b840: 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e  tory where the n
b850: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
b860: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
b870: 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73  mponents for Sys
b880: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
b890: 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e  should be found.
b8a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
b8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
b8c0: 20 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e   directory [join
b8d0: 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24  BuildDirectory $
b8e0: 6e 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20  native \..      
b8f0: 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
b900: 69 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79  ildBaseDirectory
b910: 5d 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72  ] $year $platfor
b920: 6d 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  m $configuration
b930: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
b940: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
b950: 23 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e  # NOTE: Do the n
b960: 65 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65  ecessary files e
b970: 78 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79  xist?  Currently
b980: 2c 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73  , no other steps
b990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
b9a0: 20 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20        are taken 
b9b0: 74 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62  to verify this b
b9c0: 75 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79  uild is actually
b9d0: 20 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20   viable...      
b9e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b9f0: 20 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c       if {[isBuil
ba00: 64 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69  dAvailable $nati
ba10: 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20  ve $directory]} 
ba20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ba30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ba40: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
ba50: 68 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20  hen in "select" 
ba60: 6d 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61  mode, automatica
ba70: 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66  lly select the f
ba80: 69 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  irst..          
ba90: 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69      #       avai
baa0: 6c 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  lable build of S
bab0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
bac0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72  e and then retur
bad0: 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n..             
bae0: 20 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61   #       immedia
baf0: 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  tely...         
bb00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bb10: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
bb20: 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69  t && [matchMachi
bb30: 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ne $platform]} t
bb40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
bb50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
bb60: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
bb70: 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72  : Manually overr
bb80: 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c  ide all the buil
bb90: 64 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65  d directory sele
bba0: 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ction..         
bbb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
bbc0: 65 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74  elated test sett
bbd0: 69 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  ings in order to
bbe0: 20 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c   force this buil
bbf0: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d..             
bc00: 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79     #       of Sy
bc10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
bc20: 20 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20   to be used...  
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
bc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc50: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49   object invoke I
bc80: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
bc90: 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74  tive [expr {$nat
bca0: 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ive ? \..       
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
bcc0: 41 64 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  AddRuntimeOption
bcd0: 22 20 3a 20 22 52 65 6d 6f 76 65 52 75 6e 74 69  " : "RemoveRunti
bce0: 6d 65 4f 70 74 69 6f 6e 22 7d 5d 20 6e 61 74 69  meOption"}] nati
bcf0: 76 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ve..            
bd00: 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68      } error]} th
bd10: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
bd20: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
bd30: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
bd40: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 2c              "no,
bd60: 20 66 61 69 6c 65 64 20 74 6f 20 22 20 5b 65 78   failed to " [ex
bd70: 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22 61  pr {$native ? "a
bd80: 64 64 22 20 3a 20 22 72 65 6d 6f 76 65 22 7d 5d  dd" : "remove"}]
bd90: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
bda0: 20 20 20 20 20 20 20 20 20 20 22 20 74 68 65 20            " the 
bdb0: 5c 22 6e 61 74 69 76 65 5c 22 20 72 75 6e 74 69  \"native\" runti
bdc0: 6d 65 20 6f 70 74 69 6f 6e 2c 20 65 72 72 6f 72  me option, error
bdd0: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
bde0: 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
bdf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
be00: 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
be10: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
be20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
be30: 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79 65 61  ::test_year $yea
be40: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
be50: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 70 6c     set ::test_pl
be60: 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d  atform $platform
be70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
be80: 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e    set ::test_con
be90: 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f 6e 66  figuration $conf
bea0: 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20 20 20  iguration....   
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
bec0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
bed0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
bef0: 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22  yes, selected ("
bf00: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
bf10: 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20 22 22  ? "native/" : ""
bf20: 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  }] \..          
bf30: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
bf40: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
bf50: 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20 3f  $platform] > 0 ?
bf60: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d      $platform /]
bf90: 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20 2f 20   : ""}] $year / 
bfa0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22  $configuration "
bfb0: 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  )\n"]....       
bfc0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
bfd0: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
bfe0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
c000: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
c010: 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n..            
c020: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
c030: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c040: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
c050: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
c060: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
c070: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
c080: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
c090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
c0a0: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
c0b0: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
c0c0: 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 7b 20  QLiteReleases { 
c0d0: 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20  channel {select 
c0e0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
c0f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c100: 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70 61 73  E: Check for pas
c110: 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20 53 79  t releases of Sy
c120: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
c130: 20 69 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72   in the director
c140: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
c150: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
c160: 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  e "System.Data.S
c170: 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65  QLite" environme
c180: 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69 66 0d  nt variable, if.
c190: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
c1a0: 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23  resent...      #
c1b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
c1c0: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 53  o exists ::env(S
c1d0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c1e0: 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  e)] && \..      
c1f0: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
c200: 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d  th $::env(System
c210: 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e  .Data.SQLite)] >
c220: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
c230: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
c240: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
c250: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
c260: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
c270: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a   the necessary..
c280: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
c290: 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53  components for S
c2a0: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
c2b0: 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e  e should be foun
c2c0: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
c2d0: 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65 63         set direc
c2e0: 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74 69 76  tory [file nativ
c2f0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
c300: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c310: 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61  $::env(System.Da
c320: 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65 74 52  ta.SQLite) [getR
c330: 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d  eleaseVersion]]]
c340: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
c350: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
c360: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
c370: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
c380: 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
c390: 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65  Data.SQLite rele
c3a0: 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
c3b0: 20 20 20 20 20 20 20 24 64 69 72 65 63 74 6f 72         $director
c3c0: 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  y "\"... "].... 
c3d0: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
c3e0: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
c3f0: 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74 66 6f  directory platfo
c400: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
c410: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
c420: 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
c430: 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  orm] == 0} then 
c440: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
c450: 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e  et platform unkn
c460: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  own..          }
c470: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
c480: 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61   {$select && [ma
c490: 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74  tchMachine $plat
c4a0: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
c4c0: 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  :build_directory
c4d0: 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20   $directory.... 
c4e0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
c4f0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
c500: 64 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65  dArgs "yes, sele
c510: 63 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72  cted (" $platfor
c520: 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  m ")\n"]....    
c530: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
c540: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  rue..          }
c550: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c560: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c570: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c580: 22 79 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72  "yes (" $platfor
c590: 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  m ")\n"]..      
c5a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
c5b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
c5c0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
c5d0: 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20  l no\n....      
c5e0: 20 20 20 20 66 6f 72 65 61 63 68 20 70 61 74 68      foreach path
c5f0: 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65 61 73   [lsort -decreas
c600: 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74 20 24  ing [file list $
c610: 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d  directory *]] {.
c620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
c630: 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 70  {[file exists $p
c640: 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20 69 73  ath] && [file is
c650: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 5d  directory $path]
c660: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
c670: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
c680: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
c690: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
c6a0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
c6b0: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
c6c0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
c6d0: 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
c6f0: 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a  path "\"... "]..
c700: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c710: 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76  if {[isReleaseAv
c720: 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20 70 6c  ailable $path pl
c730: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
c740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c750: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
c760: 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d  gth $platform] =
c770: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c790: 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e  et platform unkn
c7a0: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  own..           
c7b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c7c0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 73            if {$s
c7d0: 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68 4d  elect && [matchM
c7e0: 61 63 68 69 6e 65 20 24 70 6c 61 74 66 6f 72 6d  achine $platform
c7f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
c810: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
c820: 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20 20 20  ry $path....    
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
c840: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
c850: 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73  pendArgs "yes, s
c860: 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74  elected (" $plat
c870: 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20  form ")\n"].... 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
c8b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
c8c0: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c8d0: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c8e0: 41 72 67 73 20 22 79 65 73 20 28 22 20 24 70 6c  Args "yes (" $pl
c8f0: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20  atform ")\n"].. 
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
c910: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c920: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
c930: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c940: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20  $channel no\n.. 
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c960: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
c970: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
c980: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
c990: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
c9a0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
c9b0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c9c0: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65           "---- e
c9d0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
c9e0: 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  ble \"System.Dat
c9f0: 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20 6e 6f  a.SQLite\" is no
ca00: 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
ca10: 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70 69 6e     "set, skippin
ca20: 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65 6c 65  g check for rele
ca30: 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20  ases...\n"]..   
ca40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
ca50: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
ca60: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
ca70: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
ca80: 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  rary { channel }
ca90: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
caa0: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
cab0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
cac0: 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  te core library.
cad0: 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66  .. "....      if
cae0: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
caf0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
cb00: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
cb10: 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
cb20: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
cb30: 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51  QLite.SQLite3 SQ
cb40: 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20 20 20  LiteVersion..   
cb50: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
cb60: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
cb70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
cb80: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
cb90: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
cba0: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
cbb0: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
cbc0: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
cbd0: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
cbe0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
cbf0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
cc00: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
cc10: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
cc20: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
cc30: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
cc40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
cc50: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
cc60: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
cc70: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
cc80: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
cc90: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
cca0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
ccb0: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
ccc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
ccd0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
cce0: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
ccf0: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
cd00: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
cd10: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
cd20: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
cd30: 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75 72 63  ite3 SQLiteSourc
cd40: 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  eId..        } s
cd50: 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b  ourceId]} then {
cd60: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
cd70: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
cd80: 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71 75   We failed to qu
cd90: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
cda0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
cdb0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
cdc0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
cdd0: 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a  urceId unknown..
cde0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
cdf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ce00: 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
ce10: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46 6f   the returned Fo
ce20: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
ce30: 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e  tifier was null.
ce40: 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23 20    If..        # 
ce50: 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69        so, make i
ce60: 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d  t easy to spot..
ce70: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
ce80: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
ce90: 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64  length $sourceId
cea0: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ceb0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 6f            set so
cec0: 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20  urceId null..   
ced0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cee0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
cef0: 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53 51  OTE: Yes, the SQ
cf00: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
cf10: 79 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  y appears to be 
cf20: 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20  available...    
cf30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61      #..        a
cf40: 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
cf50: 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ite....        t
cf60: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
cf70: 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
cf80: 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
cf90: 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
cfa0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
cfb0: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
cfc0: 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
cfd0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
cfe0: 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
cff0: 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
d000: 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
d010: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d020: 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
d030: 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
d040: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
d050: 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
d060: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
d070: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
d080: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
d090: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
d0a0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
d0b0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
d0c0: 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20  eropVersion..   
d0d0: 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
d0e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
d0f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
d100: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
d110: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
d120: 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
d130: 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
d140: 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
d150: 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
d160: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d170: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
d180: 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
d190: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d1a0: 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
d1b0: 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
d1c0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
d1d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
d1e0: 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
d1f0: 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
d200: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
d210: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
d220: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
d230: 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
d240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d250: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
d260: 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
d270: 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
d280: 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
d290: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
d2a0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
d2b0: 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72  ite3 InteropSour
d2c0: 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ceId..        } 
d2d0: 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
d2e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
d2f0: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
d300: 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
d310: 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
d320: 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
d330: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
d340: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
d350: 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
d360: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
d370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d380: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
d390: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
d3a0: 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
d3b0: 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
d3c0: 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
d3d0: 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
d3e0: 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
d3f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d400: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
d410: 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
d420: 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
d430: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
d440: 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
d450: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d460: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
d470: 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20 53  NOTE: Yes, the S
d480: 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
d490: 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73 20 74  sembly appears t
d4a0: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
d4b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d4c0: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
d4d0: 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 0d  t SQLiteInterop.
d4e0: 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ...        tputs
d4f0: 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
d500: 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24 76  dArgs "yes (" $v
d510: 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f 75 72  ersion " " $sour
d520: 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20 20 20  ceId ")\n"]..   
d530: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
d540: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d550: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d560: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
d570: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
d580: 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
d590: 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  nt { channel nam
d5a0: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  e } {..      tpu
d5b0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
d5c0: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d5d0: 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
d5e0: 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
d5f0: 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66 69 6e  ata.SQLite defin
d600: 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22 20 24  e constant \"" $
d610: 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  name \..        
d620: 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20    "\"... "].... 
d630: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
d640: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
d650: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
d660: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
d670: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
d680: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
d690: 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
d6a0: 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 64 65  ants..      } de
d6b0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d  fineConstants] =
d6c0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
d6d0: 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63       if {[lsearc
d6e0: 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
d6f0: 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74   $defineConstant
d700: 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20  s $name] != -1} 
d710: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d720: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
d730: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73   NOTE: Yes, this
d740: 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74   define constant
d750: 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65   was enabled whe
d760: 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d 0a 20  n the managed.. 
d770: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
d780: 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f   assembly was co
d790: 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20  mpiled...       
d7a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
d7b0: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
d7c0: 70 70 65 6e 64 41 72 67 73 20 64 65 66 69 6e 65  ppendArgs define
d7d0: 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
d7e0: 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24 6e 61  Data.SQLite. $na
d7f0: 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me]....         
d800: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d810: 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d  yes\n..        }
d820: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
d830: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d840: 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20  l no\n..        
d850: 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
d860: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d870: 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c   $channel error\
d880: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
d890: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
d8a0: 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  etDateTimeFormat
d8b0: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
d8c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
d8d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 69 6d  is procedure sim
d8e0: 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68 65 20  ply returns the 
d8f0: 22 64 65 66 61 75 6c 74 22 20 44 61 74 65 54 69  "default" DateTi
d900: 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64 0d 0a  me format used..
d910: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
d920: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
d930: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d940: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
d950: 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72  s ::datetime_for
d960: 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  mat] && \..     
d970: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
d980: 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f  gth $::datetime_
d990: 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65  format] > 0} the
d9a0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
d9b0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
d9c0: 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e 75 61  Return the manua
d9d0: 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e 20 76  lly overridden v
d9e0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44 61 74  alue for the Dat
d9f0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d 0a 20  eTime format... 
da00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
da10: 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61 74 65    return $::date
da20: 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20 20 20  time_format..   
da30: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
da40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
da50: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 61  # NOTE: Return a
da60: 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65 54 69  n ISO8601 DateTi
da70: 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70 61 74  me format compat
da80: 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69 74 65  ible with SQLite
da90: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
daa0: 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
dab0: 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69 74 61  QLite, and suita
dac0: 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d 74 72  ble for round-tr
dad0: 69 70 70 69 6e 67 20 77 69 74 68 20 74 68 65 0d  ipping with the.
dae0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
daf0: 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73 73 20   DateTime class 
db00: 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b  of the framework
db10: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
db20: 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a 20 20   is changed,..  
db30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
db40: 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61 79 20  rious tests may 
db50: 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20 20 23  fail...        #
db60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
db70: 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a   "yyyy-MM-dd HH:
db80: 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b 22 0d  mm:ss.FFFFFFFK".
db90: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
dba0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 75  ....    proc enu
dbb0: 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20 7b 20  merableToList { 
dbc0: 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b 0d 0a  enumerable } {..
dbd0: 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
dbe0: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
dbf0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
dc00: 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c 65 5d  gth $enumerable]
dc10: 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d 65 72   == 0 || $enumer
dc20: 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22 7d 20  able eq "null"} 
dc30: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
dc40: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
dc50: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dc60: 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
dc70: 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65 6e 75  -alias item $enu
dc80: 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20 20 20  merable {..     
dc90: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
dca0: 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e 20 30  ength $item] > 0
dcb0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dcc0: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
dcd0: 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74 72 69  lt [$item ToStri
dce0: 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ng]..        }..
dcf0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
dd00: 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d   return $result.
dd10: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
dd20: 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65 74 75  roc catchAndRetu
dd30: 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73 74 61  rn { script {sta
dd40: 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d 20 7b  ckTrace false} {
dd50: 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d 20 7b  strict true} } {
dd60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
dd70: 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75 61 74   # NOTE: Evaluat
dd80: 65 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f  e the script pro
dd90: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
dda0: 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63 6f 6e  ler in their con
ddb0: 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23 20 20  text,..      #  
ddc0: 20 20 20 20 20 63 61 70 74 75 72 69 6e 67 20 62       capturing b
ddd0: 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 61  oth the result a
dde0: 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  nd the return co
ddf0: 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  de...      #..  
de00: 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b 63 61      set code [ca
de10: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24  tch {uplevel 1 $
de20: 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74 5d 0d  script} result].
de30: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
de40: 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20 74 68    # NOTE: Did th
de50: 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
de60: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
de70: 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65 72 72  NOT raise an err
de80: 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  or?..      #..  
de90: 20 20 20 20 69 66 20 7b 24 73 74 72 69 63 74 20      if {$strict 
dea0: 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20 7c 7c  && $code == 0 ||
deb0: 20 21 24 73 74 72 69 63 74 20 26 26 20 24 63 6f   !$strict && $co
dec0: 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20 7b 0d  de != 1} then {.
ded0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
dee0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
def0: 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61 20 6c  ess.  Return a l
df00: 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
df10: 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
df20: 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
df30: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
df40: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
df50: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
df60: 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 63 6b  } elseif {$stack
df70: 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  Trace} then {.. 
df80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
df90: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
dfa0: 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 77  e.  Our caller w
dfb0: 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74 61 63  ants a full stac
dfc0: 6b 20 74 72 61 63 65 20 28 69 66 20 61 70 70 6c  k trace (if appl
dfd0: 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20 20 20  icable),..      
dfe0: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
dff0: 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
e000: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64   return code and
e010: 20 74 68 65 20 72 65 73 75 6c 74 20 76 65 72 62   the result verb
e020: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
e030: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
e040: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65   [list $code $re
e050: 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65  sult]..      } e
e060: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
e070: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
e080: 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
e090: 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f 74 20  caller does not 
e0a0: 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74 61 63  want a full stac
e0b0: 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20 20 20  k trace (if..   
e0c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
e0d0: 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75 72 6e  licable), return
e0e0: 20 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65   a list with the
e0f0: 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20 74 68   return code, th
e100: 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  e error..       
e110: 20 23 20 20 20 20 20 20 20 63 6f 64 65 20 66 6f   #       code fo
e120: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
e130: 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  r, and the error
e140: 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f 20 74   message up to t
e150: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
e160: 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72 65 20      point where 
e170: 74 68 65 20 73 74 61 63 6b 20 74 72 61 63 65 20  the stack trace 
e180: 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d 0a 20  should start... 
e190: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
e1a0: 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73 74 72    set index [str
e1b0: 69 6e 67 20 66 69 72 73 74 20 22 20 20 20 61 74  ing first "   at
e1c0: 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23 20 48   " $result]; # H
e1d0: 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f 0d 0a  ACK: Reliable?..
e1e0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
e1f0: 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 3a 3a   [list $code $::
e200: 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70 72 20  errorCode [expr 
e210: 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20 3f 20  {$index != -1 ? 
e220: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
e230: 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73 74 72  string trim [str
e240: 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73 75 6c  ing range $resul
e250: 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a 20 24  t 0 $index]] : $
e260: 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20 20 20  result}]]..     
e270: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
e280: 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65 43 53    proc compileCS
e290: 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20 20 20  harpWith {..    
e2a0: 20 20 20 20 20 20 20 20 74 65 78 74 20 6d 65 6d          text mem
e2b0: 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74 72 69  ory symbols stri
e2c0: 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e 61 6d  ct resultsVarNam
e2d0: 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20  e errorsVarName 
e2e0: 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20 20 20  fileNames..     
e2f0: 20 20 20 20 20 20 20 61 72 67 73 20 7d 20 7b 0d         args } {.
e300: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e310: 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20 77 65  # NOTE: Since we
e320: 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20 75 73   are going to us
e330: 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6e 61  e this method na
e340: 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69 67 6e  me a lot, assign
e350: 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20 20 20   it to a..      
e360: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
e370: 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20 20 23   first...      #
e380: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64 64 20  ..      set add 
e390: 52 65 66 65 72 65 6e 63 65 64 41 73 73 65 6d 62  ReferencedAssemb
e3a0: 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20 20 20  lies.Add....    
e3b0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
e3c0: 45 3a 20 43 72 65 61 74 65 20 74 68 65 20 62 61  E: Create the ba
e3d0: 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  se command to ev
e3e0: 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64 20 74  aluate and add t
e3f0: 68 65 20 70 72 6f 70 65 72 74 79 20 73 65 74 74  he property sett
e400: 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20  ings..      #   
e410: 20 20 20 20 74 68 61 74 20 61 72 65 20 61 6c 6d      that are alm
e420: 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65  ost always neede
e430: 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65  d by our unit te
e440: 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20 53 79  sts (i.e. the Sy
e450: 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20 20 20  stem..      #   
e460: 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d 2e 44      and System.D
e470: 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72 65 66  ata assembly ref
e480: 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20 20 20  erences)...     
e490: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f   #..      set co
e4a0: 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d 0a 20  mmand [list \.. 
e4b0: 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69 6c 65           compile
e4c0: 43 53 68 61 72 70 20 24 74 65 78 74 20 24 6d 65  CSharp $text $me
e4d0: 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20 24 73  mory $symbols $s
e4e0: 74 72 69 63 74 20 72 65 73 75 6c 74 73 20 65 72  trict results er
e4f0: 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  rors \..        
e500: 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 64 6c    $add System.dl
e510: 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e 44 61  l $add System.Da
e520: 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74  ta.dll $add Syst
e530: 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 2e  em.Transactions.
e540: 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
e550: 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58 6d 6c   $add System.Xml
e560: 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  .dll]....      #
e570: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e580: 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76  Add all the prov
e590: 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20  ided file names 
e5a0: 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  as assembly refe
e5b0: 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 23  rences...      #
e5c0: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
e5d0: 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  fileName $fileNa
e5e0: 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 6c  mes {..        l
e5f0: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
e600: 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79 46 69  add [getBinaryFi
e610: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
e620: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
e630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e640: 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65 78 74  OTE: Add the ext
e650: 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20 69 66  ra arguments, if
e660: 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63 6f 6d   any, to the com
e670: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65  mand to evaluate
e680: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e690: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 63    eval lappend c
e6a0: 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a 0d 0a  ommand $args....
e6b0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e6c0: 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65   NOTE: Alias the
e6d0: 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20   compiler local 
e6e0: 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f  results and erro
e6f0: 72 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  rs variables to 
e700: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
e710: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65     variable name
e720: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75  s provided by ou
e730: 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20  r caller...     
e740: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
e750: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 72 65  tring length $re
e760: 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20 3e 20  sultsVarName] > 
e770: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
e780: 20 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75     upvar 1 $resu
e790: 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c  ltsVarName resul
e7a0: 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ts..      }.... 
e7b0: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
e7c0: 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72 73 56   length $errorsV
e7d0: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
e7e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
e7f0: 61 72 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e  ar 1 $errorsVarN
e800: 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20  ame errors..    
e810: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
e820: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76        # NOTE: Ev
e830: 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74  aluate the const
e840: 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43  ructed [compileC
e850: 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61  Sharp] command a
e860: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20  nd return the.. 
e870: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
e880: 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ult...      #.. 
e890: 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61       eval $comma
e8a0: 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nd..    }.....  
e8b0: 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44    proc isMemoryD
e8c0: 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b  b { fileName } {
e8d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e8e0: 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20   # NOTE: Is the 
e8f0: 73 70 65 63 69 66 69 65 64 20 64 61 74 61 62 61  specified databa
e900: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61  se file name rea
e910: 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  lly an in-memory
e920: 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20   database?..    
e930: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
e940: 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61  n [expr {$fileNa
e950: 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22  me eq ":memory:"
e960: 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
e970: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
e980: 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65  fileName 0 12] e
e990: 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a  q "file::memory:
e9a0: 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  "}]..    }..... 
e9b0: 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49     proc isTableI
e9c0: 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e  nDb { name {varN
e9d0: 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20  ame db} } {..   
e9e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e9f0: 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65  TE: Refer to the
ea00: 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61   specified varia
ea10: 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20  ble (e.g. "db") 
ea20: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
ea30: 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20  f our..      #  
ea40: 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74       caller.  It
ea50: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
ea60: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ea70: 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69  n handle that wi
ea80: 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ll be..      #  
ea90: 20 20 20 20 20 75 73 65 64 20 74 6f 20 65 78 65       used to exe
eaa0: 63 75 74 65 20 74 68 65 20 71 75 65 72 79 20 75  cute the query u
eab0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
eac0: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
ead0: 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20  ble is..      # 
eae0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e        present in
eaf0: 20 74 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d   that database..
eb00: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
eb10: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
eb20: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
eb30: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
eb40: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
eb50: 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64 65 74  ter table to det
eb60: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61  ermine if the na
eb70: 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20  med table is..  
eb80: 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
eb90: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
eba0: 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
ebb0: 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b 0d 0a       set sql {..
ebc0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 43          SELECT C
ebd0: 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73 71 6c  OUNT(*) FROM sql
ebe0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
ebf0: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20   type = 'table' 
ec00: 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d 0a 20  AND name = ?;.. 
ec10: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ec20: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ec30: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
ec40: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   if the named ta
ec50: 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2e 0d  ble is present..
ec60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ec70: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a  return [expr {..
ec80: 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65          [sql exe
ec90: 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73 63  cute -execute sc
eca0: 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20 5b 6c  alar $db $sql [l
ecb0: 69 73 74 20 70 61 72 61 6d 31 20 53 74 72 69 6e  ist param1 Strin
ecc0: 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d 0a 20  g $name]] > 0.. 
ecd0: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a       }]..    }..
ece0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69 6d  ...    proc trim
ecf0: 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a 20  Sql { sql } {.. 
ed00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67       return [reg
ed10: 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73 2b  sub -all -- {\s+
ed20: 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  } [string trim $
ed30: 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20 7d  sql] " "]..    }
ed40: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78  .....    proc ex
ed50: 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20 7b  ecuteSql { sql {
ed60: 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b 66  execute none} {f
ed70: 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66 69 6c  ormat none} {fil
ed80: 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  eName ""} } {.. 
ed90: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
eda0: 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d   length $fileNam
edb0: 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 73  e] == 0} then {s
edc0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d 65 6d  et fileName :mem
edd0: 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73 65 74  ory:}..      set
ede0: 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65 20 22  upDb $fileName "
edf0: 22 20 22 22 20 22 22 20 22 22 20 22 22 20 66 61  " "" "" "" "" fa
ee00: 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20  lse false false 
ee10: 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d 0a 0d  false db true...
ee20: 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20  .      try {..  
ee30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75 70        return [up
ee40: 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 5c 0d  level 1 [list \.
ee50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
ee60: 20 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74   execute -execut
ee70: 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f 72 6d  e $execute -form
ee80: 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62 20 24  at $format $db $
ee90: 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 66  sql]]..      } f
eea0: 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20  inally {..      
eeb0: 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66 69 6c    cleanupDb $fil
eec0: 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65 20 66  eName db false f
eed0: 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  alse false..    
eee0: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
eef0: 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46 6c 61     proc hasNoFla
ef00: 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e 6f 6e  gs { varName non
ef10: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76  e } {..      upv
ef20: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 66 6c  ar 1 $varName fl
ef30: 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ags....      if 
ef40: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66  {![info exists f
ef50: 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  lags]} then {.. 
ef60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ef70: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
ef80: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
ef90: 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
efa0: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
efb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
efc0: 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  e..      }....  
efd0: 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20 26 26      if {$none &&
efe0: 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f 6e 65   $flags eq "None
eff0: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
f000: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
f010: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f020: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20   return false.. 
f030: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
f040: 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  c getConnectionF
f050: 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d 65 20  lags { fileName 
f060: 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66 61 6c  flags {quiet fal
f070: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
f080: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f090: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
f0a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
f0b0: 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74 69 6f  ame or connectio
f0c0: 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65 0d 0a  n string these..
f0d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
f0e0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 77  nnection flags w
f0f0: 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61 70 70  ill actually app
f100: 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  ly to.  This is 
f110: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d 0a 20  not necessary.. 
f120: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 20       #       in 
f130: 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63 61 75  quiet mode becau
f140: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
f150: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
f160: 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a 20 20   for logging..  
f170: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
f180: 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  reporting purpos
f190: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
f1a0: 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
f1b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f1c0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
f1d0: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
f1e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f1f0: 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61        set databa
f200: 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  se [appendArgs "
f210: 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20 24 66  file name \"" $f
f220: 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20 20 20  ileName \"]..   
f230: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
f240: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61  info exists ::da
f250: 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c 0d 0a  taSource] && \..
f260: 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 61 72              ![ar
f270: 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64 61 74  ray exists ::dat
f280: 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e 20 7b  aSource]} then {
f290: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
f2a0: 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e 64  database [append
f2b0: 41 72 67 73 20 22 64 61 74 61 20 73 6f 75 72 63  Args "data sourc
f2c0: 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53 6f 75  e \"" $::dataSou
f2d0: 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20  rce \"]..       
f2e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
f2f0: 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
f300: 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20 20 20  e <unknown>..   
f310: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
f320: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f330: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
f340: 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c 6f 63  and log) the loc
f350: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
f360: 61 67 73 20 61 6e 64 20 74 68 65 20 61 73 73 6f  ags and the asso
f370: 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20 23 20  ciated..      # 
f380: 20 20 20 20 20 20 64 61 74 61 20 73 6f 75 72 63        data sourc
f390: 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65 2e 0d  e or file name..
f3a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f3b0: 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
f3c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
f3d0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
f3e0: 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c 61  :no(emitLocalFla
f3f0: 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  gs)] && \..     
f400: 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65         (![info e
f410: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 4c  xists ::no(emitL
f420: 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  ocalFlagsIfNone)
f430: 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
f440: 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
f450: 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d  s flags false])}
f460: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f470: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
f480: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
f490: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
f4a0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63 61        "---- loca
f4b0: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
f4c0: 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
f4d0: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
f4e0: 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
f4f0: 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
f500: 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f 20   flags false] ? 
f510: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f520: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
f530: 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e  $flags \"] : "<n
f540: 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20  one>"}] \n]..   
f550: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
f560: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f570: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
f580: 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73 68 61  and log) the sha
f590: 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  red connection f
f5a0: 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  lags...      #..
f5b0: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
f5c0: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
f5d0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
f5e0: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
f5f0: 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65 6d 2e  t invoke System.
f600: 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
f610: 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53 68 61  teConnection Sha
f620: 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  redFlags..      
f630: 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67 73 5d    } sharedFlags]
f640: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
f650: 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
f660: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
f670: 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73 29  emitSharedFlags)
f680: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
f690: 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
f6a0: 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
f6b0: 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29  aredFlagsIfNone)
f6c0: 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
f6d0: 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
f6e0: 61 67 73 20 73 68 61 72 65 64 46 6c 61 67 73 20  ags sharedFlags 
f6f0: 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a  true])} then {..
f700: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
f710: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
f720: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f740: 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20 63 6f   "---- shared co
f750: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66  nnection flags f
f760: 6f 72 20 22 20 24 64 61 74 61 62 61 73 65 20 5c  or " $database \
f770: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f780: 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70 72    " are: " [expr
f790: 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73   {![hasNoFlags s
f7a0: 68 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d  haredFlags true]
f7b0: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
f7c0: 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
f7d0: 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c 61 67  s \" $sharedFlag
f7e0: 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22  s \"] : "<none>"
f7f0: 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  }] \n]..        
f800: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
f810: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
f820: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
f830: 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68 61 72  ts ::no(emitShar
f840: 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a  edFlags)] && \..
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b                ![
f860: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
f870: 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67 73  (emitSharedFlags
f880: 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29 5d 7d  IfUnavailable)]}
f890: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f8a0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f8b0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f8c0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f8d0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
f8e0: 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f  shared connectio
f8f0: 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24 64  n flags for " $d
f900: 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20 20  atabase \..     
f910: 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72 65             " are
f920: 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65 3e 5c  : <unavailable>\
f930: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
f940: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
f950: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
f960: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
f970: 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
f980: 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f 62 61  e detected globa
f990: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  l connection fla
f9a0: 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20  gs, if any...   
f9b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
f9c0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
f9d0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
f9e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
f9f0: 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67 73 29  emitGlobalFlags)
fa00: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
fa10: 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
fa20: 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c 6f 62  ts ::no(emitGlob
fa30: 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29 5d 20  alFlagsIfNone)] 
fa40: 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
fa50: 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20     ![hasNoFlags 
fa60: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
fa70: 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e  gs false])} then
fa80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
fa90: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
faa0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
fab0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
fac0: 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f   "---- global co
fad0: 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61  nnection flags a
fae0: 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  re: " \..       
faf0: 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 21 5b         [expr {![
fb00: 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e  hasNoFlags ::con
fb10: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61  nection_flags fa
fb20: 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20  lse] ? \..      
fb30: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
fb40: 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65 63  rgs \" $::connec
fb50: 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20 3a  tion_flags \"] :
fb60: 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d   "<none>"}] \n].
fb70: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
fb80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
fb90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
fba0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67   there are any g
fbb0: 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20  lobal (per test 
fbc0: 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  run) connection 
fbd0: 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d  flags currently.
fbe0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
fbf0: 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77  et, use them now
fc00: 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e   (i.e. by combin
fc10: 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68  ing them with th
fc20: 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d  e ones for this.
fc30: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
fc40: 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20  onnection)...   
fc50: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
fc60: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63  [info exists ::c
fc70: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
fc80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fc90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
fca0: 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61 6e 64  OTE: Combine and
fcb0: 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68 65 20  /or replace the 
fcc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
fcd0: 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77 20 74   and then show t
fce0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
fcf0: 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e 0d 0a      new value...
fd00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fd10: 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b 63 6f     set flags [co
fd20: 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c 61 67  mbineFlags $flag
fd30: 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f  s $::connection_
fd40: 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  flags]....      
fd50: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
fd60: 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
fd70: 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66 66 65  og) the new effe
fd80: 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  ctive connection
fd90: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20   flags...       
fda0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
fdb0: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
fdc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
fdd0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
fde0: 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c  o(emitCombinedFl
fdf0: 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ags)] && \..    
fe00: 20 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66            (![inf
fe10: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
fe20: 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 49  itCombinedFlagsI
fe30: 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20  fNone)] || \..  
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
fe50: 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73 20  asNoFlags flags 
fe60: 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d  false])} then {.
fe70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
fe80: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
fe90: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
fea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
feb0: 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65 64    "---- combined
fec0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
fed0: 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
fee0: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
fef0: 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65       " are: " [e
ff00: 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67  xpr {![hasNoFlag
ff10: 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f  s flags false] ?
ff20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
ff30: 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20      [appendArgs 
ff40: 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20  \" $flags \"] : 
ff50: 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a  "<none>"}] \n]..
ff60: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
ff70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
ff80: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
ff90: 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a 0c  $flags..    }...
ffa0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46 6c  ..    proc getFl
ffb0: 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b 66  agsProperty { {f
ffc0: 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74 20  lags ""} {quiet 
ffd0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
ffe0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
fff0: 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 61  E: Determine wha
10000 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 28  t the combined (
10010 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61 6c  global and local
10020 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  ) connection..  
10030 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61 67      #       flag
10040 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f 73  s should be, pos
10050 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d 0a  sibly quietly...
10060 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
10070 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e  et flags [getCon
10080 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22 20  nectionFlags "" 
10090 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
100a0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
100b0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20 67   # NOTE: If no g
100c0 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20 63  lobal or local c
100d0 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
100e0 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2c 20  were specified, 
100f0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
10100 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65     default conne
10110 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f 75  ction flags shou
10120 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68 65 72  ld be used; ther
10130 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a 20  efore, return.. 
10140 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 20       #       an 
10150 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e 20  empty string in 
10160 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20 20  that case...    
10170 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
10180 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
10190 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  lags] == 0} then
101a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
101b0 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
101c0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
101d0 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64 65   # NOTE: In orde
101e0 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  r to check if th
101f0 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63  e default connec
10200 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20 62  tion flags are b
10210 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20 20  eing used..     
10220 20 23 20 20 20 20 20 20 20 69 74 20 69 73 20 6e   #       it is n
10230 65 63 65 73 73 61 72 79 20 74 6f 20 61 74 74 65  ecessary to atte
10240 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f 6e  mpt a conversion
10250 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20 65   to the actual e
10260 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20 20  numerated..     
10270 20 23 20 20 20 20 20 20 20 74 79 70 65 2e 20 20   #       type.  
10280 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74 68  Failing that, th
10290 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74 20  e check against 
102a0 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
102b0 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20  e will be..     
102c0 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
102d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
102e0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
102f0 20 20 20 20 20 20 20 20 73 65 74 20 65 72 72 6f          set erro
10300 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f 52 45  r null; # IGNORE
10310 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  D....        obj
10320 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69 6c 69  ect invoke Utili
10330 74 79 20 54 72 79 50 61 72 73 65 46 6c 61 67 73  ty TryParseFlags
10340 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20 20 20  Enum "" \..     
10350 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
10360 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
10370 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
10380 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74  "" $flags null t
10390 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rue \..         
103a0 20 20 20 74 72 75 65 20 65 72 72 6f 72 0d 0a 20     true error.. 
103b0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74       } value]} t
103c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
103d0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
103e0 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  : Attempting to 
103f0 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  parse the connec
10400 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75 73 65  tion flags cause
10410 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20 20 20  d a script..    
10420 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f      #       erro
10430 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72 6e 69  r.  Emit a warni
10440 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c  ng to the test l
10450 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74  og file and cont
10460 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 23 20  inue..        # 
10470 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e 20 65        using an e
10480 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e 73 74  mtpy string inst
10490 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ead...        #.
104a0 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20 5b 61  .        tlog [a
104b0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
104c0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
104d0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
104e0 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63 74 69  o parse connecti
104f0 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a  on flags, error:
10500 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
10510 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e    \n\t $value \n
10520 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
10530 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20 20 20   value ""..     
10540 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
10550 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
10560 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61  the combined fla
10570 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20  gs string could 
10580 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
10590 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20  converted..     
105a0 20 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20   #       to the 
105b0 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20  enumerated type 
105c0 69 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  it is the defaul
105d0 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75  t value, then ju
105e0 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20  st use..      # 
105f0 20 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69        it verbati
10600 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75  m; otherwise, ju
10610 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  st return an emp
10620 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74  ty string.  In t
10630 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  hat..      #    
10640 20 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66     case, the def
10650 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
10660 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73  flags will be us
10670 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
10680 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
10690 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d  length $value] =
106a0 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65  = 0 || $value ne
106b0 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e   "Default"} then
106c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
106d0 20 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47         # WARNING
106e0 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74  : This returns t
106f0 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20  he string value 
10700 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
10710 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20  flags, not..    
10720 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74      #          t
10730 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61  he enumerated va
10740 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79  lue.  This is by
10750 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75   design and shou
10760 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  ld not..        
10770 23 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68  #          be ch
10780 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61  anged without ca
10790 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74  reful considerat
107a0 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75  ion (e.g. it wou
107b0 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ld..        #   
107c0 20 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74         prevent t
107d0 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  he SQLiteConnect
107e0 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61  ion class from a
107f0 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d  llowing invalid.
10800 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
10810 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20      ["magical"] 
10820 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20  meta-flags)...  
10830 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10840 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41   return [appendA
10850 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c  rgs "Flags=" $fl
10860 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ags \;]..      }
10870 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
10880 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
10890 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65 53 68     proc enableSh
108a0 61 72 65 64 43 61 63 68 65 20 7b 20 63 68 61 6e  aredCache { chan
108b0 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75 69 65  nel enable {quie
108c0 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
108d0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
108e0 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
108f0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
10900 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
10910 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
10920 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
10930 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
10940 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
10950 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
10960 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78 70 72  ared_cache [expr
10970 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d 0d 0a   int($enable)]..
10980 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
10990 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
109a0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
109b0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
109c0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
109d0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
109e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
109f0 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69   "---- call sqli
10a00 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
10a10 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c  d_cache(" $enabl
10a20 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
10a30 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24     ")... ok: " $
10a40 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
10a50 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
10a60 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  lse {..        i
10a70 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
10a80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
10a90 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
10aa0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
10ab0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
10ac0 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 6e 61  call sqlite3_ena
10ad0 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
10ae0 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a 20 20  (" $enable \..  
10af0 20 20 20 20 20 20 20 20 20 20 20 20 22 29 2e 2e              ")..
10b00 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
10b10 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
10b20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
10b30 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
10b40 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d 0a 20  roc setupDb {.. 
10b50 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
10b60 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20 7b 64  ame {mode ""} {d
10b70 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20 22 22  ateTimeFormat ""
10b80 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64 20  } {dateTimeKind 
10b90 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d 0d 0a  ""} {flags ""}..
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 7b 65 78 74              {ext
10bb0 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66 79 20  ra ""} {qualify 
10bc0 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20 74 72  true} {delete tr
10bd0 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65 7d 0d  ue} {uri false}.
10be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 74 65  .            {te
10bf0 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20 7b 76  mporary true} {v
10c00 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75 69 65  arName db} {quie
10c10 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10c30 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65 65 20  OTE: First, see 
10c40 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 68 61  if our caller ha
10c50 73 20 72 65 71 75 65 73 74 65 64 20 61 6e 20 69  s requested an i
10c60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
10c70 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
10c80 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72 79 20     set isMemory 
10c90 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66 69 6c  [isMemoryDb $fil
10ca0 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  eName]....      
10cb0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
10cc0 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20 74 65   For now, all te
10cd0 73 74 20 64 61 74 61 62 61 73 65 73 20 75 73 65  st databases use
10ce0 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  d by the test su
10cf0 69 74 65 20 61 72 65 20 70 6c 61 63 65 64 0d 0a  ite are placed..
10d00 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
10d10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10d20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61 63 68  directory.  Each
10d30 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
10d40 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20 20 20  lated files..   
10d50 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
10d60 62 79 20 61 20 74 65 73 74 20 73 68 6f 75 6c 64  by a test should
10d70 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62   be cleaned up b
10d80 79 20 74 68 61 74 20 74 65 73 74 20 75 73 69 6e  y that test usin
10d90 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  g the..      #  
10da0 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44 62 22       "cleanupDb"
10db0 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65 6c 6f   procedure, belo
10dc0 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
10dd0 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
10de0 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
10df0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
10e00 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
10e10 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
10e20 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
10e30 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
10e40 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
10e50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
10e60 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66 61 75  # NOTE: By defau
10e70 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79 20 70  lt, delete any p
10e80 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61 74 61  re-existing data
10e90 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
10ea0 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 23  me file..      #
10eb0 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66 20 69         name if i
10ec0 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  t currently exis
10ed0 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ts...      #..  
10ee0 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
10ef0 72 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26  ry && $delete &&
10f00 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66   [file exists $f
10f10 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
10f20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10f30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
10f40 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20 61  empt to delete a
10f50 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20  ny pre-existing 
10f60 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
10f70 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20  e same file..   
10f80 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d       #       nam
10f90 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
10fa0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
10fb0 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
10fc0 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
10fd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10fe0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
10ff0 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65   # NOTE: We some
11000 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65  how failed to de
11010 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72  lete the file, r
11020 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
11030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11040 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11050 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11060 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
11070 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
11080 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11090 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
110a0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
110b0 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73  o delete databas
110c0 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  e file \"" $file
110d0 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
110e0 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69          "\" duri
110f0 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f 72 3a  ng setup, error:
11100 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
11110 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
11120 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
11130 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
11140 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
11150 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
11160 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
11170 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
11180 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
11190 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
111a0 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
111b0 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  le to the opened
111c0 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
111d0 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
111e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
111f0 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
11200 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
11210 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74        # NOTE: St
11220 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74 68 65  art building the
11230 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69   connection stri
11240 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65  ng.  The only re
11250 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e 0d 0a  quired portion..
11260 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
11270 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
11280 73 74 72 69 6e 67 20 69 73 20 74 68 65 20 64 61  string is the da
11290 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69 63 68  ta source, which
112a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d 0a 20   contains the.. 
112b0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
112c0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
112d0 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75 72 20  itself.  If our 
112e0 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20  caller wants to 
112f0 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a 20 20  use a URI as..  
11300 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
11310 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75 73 65  data source, use
11320 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63 6f 6e   the FullUri con
11330 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 70  nection string p
11340 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20 20 20  roperty to..    
11350 20 20 23 20 20 20 20 20 20 20 70 72 65 76 65 6e    #       preven
11360 74 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63  t the data sourc
11370 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 62 65  e string from be
11380 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a 20 20  ing mangled...  
11390 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
113a0 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$uri} then {.. 
113b0 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
113c0 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69 3d 24  ction {FullUri=$
113d0 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20 20 20  {fileName}}..   
113e0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
113f0 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65 63 74       set connect
11400 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72 63 65  ion {Data Source
11410 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
11420 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11430 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
11440 20 53 69 6e 63 65 20 74 68 69 73 20 70 72 6f 63   Since this proc
11450 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73 70 65  edure has no spe
11460 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  cial knowledge o
11470 66 20 77 68 61 74 20 74 68 65 20 64 65 66 61 75  f what the defau
11480 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  lt..      #     
11490 20 20 73 65 74 74 69 6e 67 20 69 73 20 66 6f 72    setting is for
114a0 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74 68 20   the ToFullPath 
114b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
114c0 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77 61 79  g propery, alway
114d0 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
114e0 20 61 64 64 20 74 68 65 20 76 61 6c 75 65 20 77   add the value w
114f0 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74 6f 20  e know about to 
11500 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
11510 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d  tring...      #.
11520 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f  .      append co
11530 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46 75 6c  nnection {;ToFul
11540 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66 79 7d  lPath=${qualify}
11550 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
11560 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
11570 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
11580 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20 6d 6f  ied a journal mo
11590 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  de, add the nece
115a0 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20  ssary portion.. 
115b0 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
115c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
115d0 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
115e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
115f0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6d  string length $m
11600 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ode] > 0} then {
11610 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
11620 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 4a 6f   connection {;Jo
11630 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d 6f 64  urnal Mode=${mod
11640 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  e}}..      }....
11650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11660 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
11670 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 61  ller specified a
11680 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74   DateTime format
11690 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
116a0 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
116b0 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68     portion of th
116c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  e connection str
116d0 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ing now...      
116e0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
116f0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61 74  ring length $dat
11700 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e 20 30  eTimeFormat] > 0
11710 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11720 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
11730 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 46 6f  ion {;DateTimeFo
11740 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d 65 46  rmat=${dateTimeF
11750 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20 20 7d  ormat}}..      }
11760 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11770 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
11780 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
11790 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b 69 6e  ed a DateTimeKin
117a0 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73  d, add the neces
117b0 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a 20 20  sary portion..  
117c0 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 74      #       of t
117d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
117e0 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ring now...     
117f0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
11800 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 61  tring length $da
11810 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20 30 7d  teTimeKind] > 0}
11820 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11830 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
11840 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b 69 6e  on {;DateTimeKin
11850 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69 6e 64  d=${dateTimeKind
11860 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
11870 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
11880 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74  NOTE: Figure out
11890 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20   what the final 
118a0 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73 20 63  flags for this c
118b0 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64 20 74  onnection need t
118c0 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  o be...      #..
118d0 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20        set flags 
118e0 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c  [getConnectionFl
118f0 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20 24 66  ags $fileName $f
11900 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a 0d 0a  lags $quiet]....
11910 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11920 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61   NOTE: If our ca
11930 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64 20 73  ller specified s
11940 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ome SQLiteConnec
11950 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64 20 74  tionFlags, add t
11960 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
11970 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74    necessary port
11980 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
11990 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
119a0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
119b0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
119c0 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30  ngth $flags] > 0
119d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
119e0 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
119f0 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b 66 6c  ion {;Flags=${fl
11a00 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ags}}..      }..
11a10 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11a20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
11a30 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
11a40 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c 6f 61   an extra payloa
11a50 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  d to the connect
11a60 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
11a70 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70 65 6e     string, appen
11a80 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  d it now...     
11a90 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73   #..      if {[s
11aa0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78  tring length $ex
11ab0 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tra] > 0} then {
11ac0 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
11ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b 20 24   connection \; $
11ae0 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 0d 0a  extra..      }..
11af0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11b00 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20 74 68   # NOTE: Open th
11b10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11b20 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61 63 69  ction now, placi
11b30 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20 68 61  ng the opaque ha
11b40 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20 20 20  ndle value..    
11b50 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f 20 74    #       into t
11b60 68 65 20 76 61 72 69 61 62 6c 65 20 73 70 65 63  he variable spec
11b70 69 66 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ified by our cal
11b80 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
11b90 20 20 20 20 20 73 65 74 20 64 62 20 5b 73 71 6c       set db [sql
11ba0 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51 4c 69   open -type SQLi
11bb0 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e 6e 65  te [subst $conne
11bc0 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  ction]]....     
11bd0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
11be0 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20  : Configure the 
11bf0 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
11c00 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  ory for the newl
11c10 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
11c20 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
11c30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77 20   connection now 
11c40 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c 6c 65  unless our calle
11c50 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d 0a 20  r forbids it... 
11c60 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
11c70 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26 26 20   {$temporary && 
11c80 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
11c90 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72 79 44  no(setTemporaryD
11ca0 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e  irectory)]} then
11cb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71 6c 20   {..        sql 
11cc0 65 78 65 63 75 74 65 20 24 64 62 20 5b 61 70 70  execute $db [app
11cd0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11ce0 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 74         "PRAGMA t
11cf0 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
11d00 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74 54 65  ory = \"" [getTe
11d10 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79  mporaryDirectory
11d20 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d  ] \"\;]..      }
11d30 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11d40 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72 66 6f     # NOTE: Perfo
11d50 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70 65 72  rm any extra per
11d60 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65 74 75  -connection setu
11d70 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c 79 20  p for the newly 
11d80 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  opened..      # 
11d90 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 6e        database n
11da0 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61  ow unless our ca
11db0 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e  ller forbids it.
11dc0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11dd0 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e 53 65   set executeOnSe
11de0 74 75 70 20 5b 67 65 74 45 78 65 63 75 74 65 4f  tup [getExecuteO
11df0 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20 20 20  nSetup]....     
11e00 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
11e10 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e 53 65  gth $executeOnSe
11e20 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20  tup] > 0 && \.. 
11e30 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20           ![info 
11e40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63  exists ::no(exec
11e50 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20 74 68  uteOnSetup)]} th
11e60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
11e70 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
11e80 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 6d 61   This command ma
11e90 79 20 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72  y raise an error
11ea0 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20 69 73  ; if so, that is
11eb0 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20 20 20   fine, as..     
11ec0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 65     #       the e
11ed0 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20 77 69  nclosing test wi
11ee0 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20 20 54  ll then fail.  T
11ef0 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d 6d 61  he [subst] comma
11f00 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23  nd is..        #
11f10 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e 20 74         used on t
11f20 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65 20 69  he SQL in case i
11f30 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66 65 72  t needs to refer
11f40 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f 75 72   to state in our
11f50 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
11f60 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20    context...    
11f70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
11f80 71 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b  ql execute $db [
11f90 73 75 62 73 74 20 24 65 78 65 63 75 74 65 4f 6e  subst $executeOn
11fa0 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20 7d 0d  Setup]..      }.
11fb0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11fc0 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61 79 73    # NOTE: Always
11fd0 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 6e   return the conn
11fe0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 75 70  ection handle up
11ff0 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20 20 20  on success...   
12000 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
12010 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d 0a 0c  rn $db..    }...
12020 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 44 62  ..    proc getDb
12030 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
12040 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
12050 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12060 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
12070 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
12080 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
12090 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
120a0 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
120b0 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
120c0 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68  The handle to th
120d0 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69  e database previ
120e0 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61  ously opened via
120f0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
12100 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72      [setupDb] pr
12110 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62  ocedure should b
12120 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d  e stored there..
12130 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12140 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
12150 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
12160 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
12170 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 41  is returns the A
12180 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e 65 63  DO.NET IDbConnec
12190 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e 73 74  tion object inst
121a0 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a 20 20  ance for the..  
121b0 20 20 20 20 23 20 20 20 20 20 20 20 73 70 65 63      #       spec
121c0 69 66 69 65 64 20 64 61 74 61 62 73 65 20 68 61  ified databse ha
121d0 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67 65 74  ndle.  Since get
121e0 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65 63 74  ting this object
121f0 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a 20 20   relies upon..  
12200 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
12210 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67 72 65  e internals, gre
12220 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62  at care should b
12230 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f 69 64  e taken to avoid
12240 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d 0a 20   disposing of.. 
12250 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 69       #       thi
12260 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74 68 65  s object or othe
12270 72 77 69 73 65 20 70 75 74 74 69 6e 67 20 69 74  rwise putting it
12280 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64   into an invalid
12290 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20 20 23   state...      #
122a0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
122b0 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20 74 68  o exists db]} th
122c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
122d0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
122e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
122f0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12300 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61  ublic -objectfla
12310 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 2d 61  gs +NoDispose -a
12320 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
12330 20 20 20 20 20 20 49 6e 74 65 72 70 72 65 74 65        Interprete
12340 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
12350 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24 64 62  ections Item $db
12360 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
12370 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
12380 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
12390 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
123a0 20 53 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   Success, return
123b0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
123c0 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20  ct handle...    
123d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
123e0 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
123f0 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  t..        } els
12400 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
12410 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
12420 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72 65 70  TE: Failure, rep
12430 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
12440 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
12450 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
12460 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12470 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12480 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
12490 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
124a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
124b0 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  le for database 
124c0 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
124d0 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20 65 72       $db "\", er
124e0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
124f0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
12500 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
12510 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
12520 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
12530 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f 75 73  eturn an obvious
12540 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61 71 75  ly invalid opaqu
12550 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
12560 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12570 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
12580 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 66  }.....    proc f
12590 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20  reeDbConnection 
125a0 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65  { {varName conne
125b0 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20  ction} } {..    
125c0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
125d0 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
125e0 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
125f0 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e 65 63  le (e.g. "connec
12600 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d 0a 20  tion") in the.. 
12610 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
12620 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c  text of our call
12630 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75 65 20  er.  The opaque 
12640 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66 6f  object handle fo
12650 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a 20 20  r an ADO.NET..  
12660 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
12670 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  ection previousl
12680 79 20 72 65 74 75 72 6e 65 64 20 62 79 20 5b 67  y returned by [g
12690 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20  etDbConnection] 
126a0 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20 20 20  should be..     
126b0 20 23 20 20 20 20 20 20 20 73 74 6f 72 65 64 20   #       stored 
126c0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
126d0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
126e0 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69  varName connecti
126f0 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  on....      #.. 
12700 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
12710 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65 20 74  empt to remove t
12720 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74  he opaque object
12730 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
12740 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a 20 20   interpreter..  
12750 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 77 2e      #       now.
12760 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74 20 64    This [object d
12770 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77 69 6c  ispose] call wil
12780 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 64  l not actually d
12790 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d 0a 20  ispose of the.. 
127a0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 6e 64       #       und
127b0 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74 20 62  erlying object b
127c0 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f 44 69  ecause the +NoDi
127d0 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73 20 73  spose flag was s
127e0 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20 20 20  et on it..      
127f0 23 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 63  #       during c
12800 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  reation of the o
12810 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
12820 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  dle...      #.. 
12830 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
12840 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  xists connection
12850 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
12860 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74    [catch {object
12870 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e 65 63   dispose $connec
12880 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20 74 68  tion} error]} th
12890 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
128a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
128b0 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c   We somehow fail
128c0 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
128d0 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72 74 20   handle, report 
128e0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
128f0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
12900 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
12910 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12920 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
12930 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
12940 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  to remove connec
12950 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22 22 20  tion handle \"" 
12960 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20  $connection \.. 
12970 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20             "\", 
12980 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
12990 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
129a0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
129b0 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e 6e 65   proc addDbConne
129c0 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63 74 69  ction { connecti
129d0 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  on {varName db} 
129e0 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
129f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65      # NOTE: Refe
12a00 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  r to the specifi
12a10 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67  ed variable (e.g
12a20 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20 63  . "db") in the c
12a30 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20  ontext of our.. 
12a40 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
12a50 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
12a60 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
12a70 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
12a80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12a90 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f 72 72  E: Create a corr
12aa0 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65 64 20  ectly formatted 
12ab0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64 61 74  name for the dat
12ac0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12ad0 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
12ae0 20 20 20 62 65 20 61 64 64 65 64 20 74 6f 20 74     be added to t
12af0 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20  he list managed 
12b00 62 79 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  by the Eagle int
12b10 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
12b20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 64 62   #..      set db
12b30 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
12b40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
12b50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 45  c \..          E
12b60 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73  agle._Components
12b70 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61 74 4f  .Private.FormatO
12b80 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a 65 63  ps DatabaseObjec
12b90 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74 69 6f  tName $connectio
12ba0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53  n \..          S
12bb0 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
12bc0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49  [object invoke I
12bd0 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
12be0 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d  tive NextId]]...
12bf0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12c00 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
12c10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12c20 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62 79 20  ion provided by 
12c30 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20 74 68  our caller to th
12c40 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20 23 20  e list..      # 
12c50 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 6b        of those k
12c60 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61 67 6c  nown to the Eagl
12c70 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  e interpreter...
12c80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 6f        #..      o
12c90 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
12ca0 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 49  ags +NonPublic I
12cb0 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
12cc0 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  tive.connections
12cd0 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20 20 20   Add \..        
12ce0 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74 69 6f    $db $connectio
12cf0 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  n..    }.....   
12d00 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46 72 6f   proc getRowsFro
12d10 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64 61 74  mDataTable { dat
12d20 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20  aTable } {..    
12d30 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69 73 74    set rows [list
12d40 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75  ]..      set cou
12d50 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65 20 43  nt [$dataTable C
12d60 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d  olumns.Count]...
12d70 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20  .      for {set 
12d80 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78  index 0} {$index
12d90 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72   < $count} {incr
12da0 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
12db0 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c 75 6d     set dataColum
12dc0 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20 2d 61  n [$dataTable -a
12dd0 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74  lias Columns.get
12de0 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20  _Item $index].. 
12df0 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 73         set names
12e00 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74 61 43  ($index) [$dataC
12e10 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65  olumn ColumnName
12e20 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
12e30 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
12e40 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61 52 6f  ch -alias dataRo
12e50 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77 73 20  w [set dataRows 
12e60 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f 77 73  [$dataTable Rows
12e70 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ]] {..        se
12e80 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a  t row [list]....
12e90 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74          for {set
12ea0 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65   index 0} {$inde
12eb0 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63  x < $count} {inc
12ec0 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20  r index} {..    
12ed0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 20        set value 
12ee0 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65 61 74  [$dataRow -creat
12ef0 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49 74 65  e -alias get_Ite
12f00 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20  m $index]....   
12f10 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
12f20 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
12f30 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20  ] > 0 && \..    
12f40 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62 6a 65            ![obje
12f50 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72  ct invoke Conver
12f60 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75  t IsDBNull $valu
12f70 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
12f80 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
12f90 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73  row [list $names
12fa0 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c 75 65  ($index) [$value
12fb0 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20 20   ToString]]..   
12fc0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70  .            lap
12fe0 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74 20 24  pend row [list $
12ff0 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d 0d 0a  names($index)]..
13000 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13010 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13020 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73 20 24    lappend rows $
13030 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  row..      }....
13040 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 6f        return $ro
13050 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ws..    }.....  
13060 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77 73 46    proc dumpRowsF
13070 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 63  romDataTable { c
13080 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20 7b 0d  hannel rows } {.
13090 0a 20 20 20 20 20 20 73 65 74 20 73 65 71 75 65  .      set seque
130a0 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20 20 66  nce 1....      f
130b0 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f 77 73  oreach row $rows
130c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
130d0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
130e0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
130f0 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24 73 65        [expr {$se
13100 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22 5c 6e  quence > 1 ? "\n
13110 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d 20 52  " : ""}] "---- R
13120 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63 65 20  OW #" $sequence 
13130 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  :\n]....        
13140 66 6f 72 65 61 63 68 20 70 61 69 72 20 24 72 6f  foreach pair $ro
13150 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  w {..          i
13160 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61 69  f {[llength $pai
13170 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20 7b 0d  r] >= 2} then {.
13180 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13190 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
131a0 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a 20 20  endArgs \t \..  
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c                [l
131c0 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69  ist [lindex $pai
131d0 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69 73 74  r 0]] ": " [list
131e0 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72 20 31   [lindex $pair 1
131f0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
13200 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c 65    } elseif {[lle
13210 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d 20 31  ngth $pair] == 1
13220 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13230 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
13240 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
13250 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   \t \..         
13260 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b 6c 69         [list [li
13270 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d 20 22  ndex $pair 0]] "
13280 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a 20 20  : <null>\n"]..  
13290 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
132a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
132b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 74 3c  uts $channel \t<
132c0 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f 54 45  empty>\n; # NOTE
132d0 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20 20 20  : No data?..    
132e0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
132f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 6e   }....        in
13300 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20 20 20  cr sequence..   
13310 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
13320 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
13330 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76  Db { fileName {v
13340 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f 6c 6c  arName db} {coll
13350 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61 6c 69  ect true} {quali
13360 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20 20 20  fy true}..      
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
13380 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d 20 7b  delete true} } {
13390 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
133a0 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
133b0 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
133c0 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
133d0 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
133e0 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
133f0 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
13400 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
13410 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
13420 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
13430 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
13440 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
13450 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
13460 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
13470 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
13480 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
13490 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
134a0 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
134b0 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
134c0 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
134d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
134e0 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
134f0 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
13500 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29  able (e.g. "db")
13510 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20   in the context 
13520 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20  of our..      # 
13530 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54        caller.  T
13540 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65  he handle to the
13550 20 64 61 74 61 62 61 73 65 20 70 72 65 76 69 6f   database previo
13560 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69 61 20  usly opened via 
13570 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
13580 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70 72 6f     [setupDb] pro
13590 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20 62 65  cedure should be
135a0 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
135b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75        #..      u
135c0 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
135d0 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  db....      #.. 
135e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6c 6f       # NOTE: Clo
135f0 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
13600 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
13610 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73 68 6f  e now.  This sho
13620 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a 20 20  uld allow us..  
13630 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 64      #       to d
13640 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
13650 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
13660 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  le...      #..  
13670 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
13680 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63 61 74  ists db] && [cat
13690 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
136a0 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  b} error]} then 
136b0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
136c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
136d0 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
136e0 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 61 74  to close the dat
136f0 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20 77 68  abase, report wh
13700 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
13710 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
13720 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
13730 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13740 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
13750 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
13760 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73 65 20   close database 
13770 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65 72 72  \"" $db "\", err
13780 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
13790 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f 72       \n\t $error
137a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d   \n]..      }...
137b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
137c0 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73  # NOTE: First, s
137d0 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72  ee if our caller
137e0 20 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61   has requested a
137f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13800 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
13810 20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f        set isMemo
13820 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24  ry [isMemoryDb $
13830 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
13840 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
13850 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
13860 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  ll path to the d
13870 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
13880 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c  e.  For now, all
13890 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23 20 20   test..      #  
138a0 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
138b0 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
138c0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
138d0 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20  directory...    
138e0 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
138f0 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75  $isMemory && $qu
13900 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20  alify} then {.. 
13910 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
13920 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
13930 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
13940 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c  tory] [file tail
13950 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20   $fileName]]..  
13960 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
13970 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
13980 43 68 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c  Check if the fil
13990 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d  e still exists..
139a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
139b0 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26  if {!$isMemory &
139c0 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b 66 69  & $delete && [fi
139d0 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
139e0 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
139f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13a00 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
13a10 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
13a20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64  files if somebod
13a30 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61  y sets the globa
13a40 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  l..        #    
13a50 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f 20 70     variable to p
13a60 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20  revent it...    
13a70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
13a80 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
13a90 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44 62 46   ::no(cleanupDbF
13aa0 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
13ab0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13ac0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
13ad0 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
13ae0 74 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73  the test databas
13af0 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  e file now...   
13b00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13b10 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
13b20 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
13b30 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
13b40 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
13b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
13b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
13b70 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
13b80 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
13b90 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
13ba0 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
13bb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13bc0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
13bd0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
13be0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
13bf0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
13c00 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
13c10 20 64 65 6c 65 74 65 20 64 61 74 61 62 61 73 65   delete database
13c20 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
13c30 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
13c40 20 20 20 20 20 20 20 22 5c 22 20 64 75 72 69 6e         "\" durin
13c50 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72 6f 72  g cleanup, error
13c60 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
13c70 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
13c80 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
13c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
13ca0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
13cb0 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77 65 20  E: Show that we 
13cc0 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
13cd0 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20 20 20   the file...    
13ce0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13cf0 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 0d     set code 0...
13d00 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13d10 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
13d20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
13d40 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
13d50 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
13d60 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
13d70 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
13d80 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
13d90 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
13da0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
13db0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13dc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13dd0 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
13de0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
13df0 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
13e00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
13e10 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
13e20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
13e30 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
13e40 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
13e50 75 70 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c  upDbInterruptCal
13e60 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20  lback { channel 
13e70 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  log } {..      t
13e80 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
13e90 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64  --- setting up d
13ea0 65 62 75 67 67 65 72 20 69 6e 74 65 72 72 75 70  ebugger interrup
13eb0 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d  t callback... ".
13ec0 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
13ed0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  tch {..        #
13ee0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
13ef0 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  : Make sure the 
13f00 73 63 72 69 70 74 20 64 65 62 75 67 67 65 72 20  script debugger 
13f10 61 6e 64 20 74 68 65 20 69 73 6f 6c 61 74 65 64  and the isolated
13f20 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 72 65   interpreter are
13f30 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
13f40 20 20 73 65 74 75 70 20 61 6e 64 20 72 65 61 64    setup and read
13f50 79 20 66 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20  y for use...    
13f60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 64      #..        d
13f70 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65 20  ebug setup true 
13f80 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
13f90 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13fa0 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
13fb0 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
13fc0 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
13fd0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
13fe0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
13ff0 20 20 64 65 62 75 67 20 65 76 61 6c 20 7b 0d 0a    debug eval {..
14000 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
14010 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65 0d  e require Eagle.
14020 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61  .          packa
14030 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c 65  ge require Eagle
14040 2e 4c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  .Library..      
14050 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
14060 69 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a  ire Eagle.Test..
14070 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
14080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14090 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
140a0 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
140b0 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
140c0 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
140d0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  er...        #..
140e0 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
140f0 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
14100 74 5f 63 68 61 6e 6e 65 6c 20 24 63 68 61 6e 6e  t_channel $chann
14110 65 6c 3b 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20  el; # NOTE: For 
14120 5b 74 70 75 74 73 5d 2e 0d 0a 20 20 20 20 20 20  [tputs]...      
14130 20 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30    debug invoke 0
14140 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
14150 24 6c 6f 67 3b 20 23 20 4e 4f 54 45 3a 20 46 6f  $log; # NOTE: Fo
14160 72 20 5b 74 6c 6f 67 5d 2e 0d 0a 0d 0a 20 20 20  r [tlog].....   
14170 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14180 23 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20  # NOTE: Install 
14190 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72  the callback scr
141a0 69 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61  ipt to be evalua
141b0 74 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61  ted in the isola
141c0 74 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ted..        #  
141d0 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65 72       interpreter
141e0 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65 72   when this inter
141f0 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72 72  preter is interr
14200 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74 0d  upted by script.
14210 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14220 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65   cancellation, e
14230 74 63 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  tc...        #..
14240 20 20 20 20 20 20 20 20 64 65 62 75 67 20 63 61          debug ca
14250 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b 7b 73  llback apply {{s
14260 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20 20 20  ender e} {..    
14270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14280 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
14290 20 69 66 20 74 68 69 73 20 63 61 6c 6c 62 61 63   if this callbac
142a0 6b 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65  k is one that we
142b0 20 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20   care about...  
142c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
142d0 20 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c       if {"Cancel
142e0 65 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24  ed" in [split [$
142f0 65 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d  e InterruptType]
14300 20 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a   ", "]} then {..
14310 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
14320 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
14330 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  E: Make sure the
14340 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e   [object] comman
14350 64 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  d is available..
14360 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
14370 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14380 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
14390 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
143a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
143b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
143c0 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
143d0 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
143e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
143f0 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
14400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
14410 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e         parent in
14420 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
14430 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14440 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
14450 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
14460 20 70 61 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e   pair [object in
14470 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
14480 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
14490 20 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49              $e I
144a0 6e 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65  nterpreter.conne
144b0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
144c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
144e0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
144f0 20 63 61 6e 63 65 6c 20 61 6e 79 20 53 51 4c 20   cancel any SQL 
14500 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72  queries in progr
14510 65 73 73 20 6f 6e 20 74 68 69 73 0d 0a 20 20 20  ess on this..   
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
14530 20 20 20 20 20 64 61 74 61 62 61 73 65 20 63 6f       database co
14540 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20  nnection...     
14550 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14570 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20   {[catch {$pair 
14580 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72  Value.Cancel} er
14590 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
145c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
145d0 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  s \n \..        
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
145f0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
14600 6c 65 64 20 74 6f 20 63 61 6e 63 65 6c 20 71 75  led to cancel qu
14610 65 72 79 20 66 6f 72 20 63 6f 6e 6e 65 63 74 69  ery for connecti
14620 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  on \"" \..      
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 2c  [$pair Key] "\",
14650 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
14660 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
14670 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
14680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14690 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
146a0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
146b0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
146c0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
146d0 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20  Args \n \..     
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
146f0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e  == WARNING: cann
14700 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75  ot cancel any qu
14710 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20  eries: " \..    
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
14730 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20 63 6f  he \"object\" co
14740 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61 76 61  mmand is not ava
14750 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20 20 20  ilable\n"]..    
14760 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14770 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14780 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72 72 6f  }}..      } erro
14790 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
147a0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
147b0 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75 70 74  traint interrupt
147c0 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33  Callback.sqlite3
147d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  ....        tput
147e0 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e  s $channel yes\n
147f0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
14800 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
14810 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
14820 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a  Args "no, error:
14830 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
14840 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
14850 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
14860 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20 66 69  cleanupFile { fi
14870 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20  leName {collect 
14880 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c  true} {force fal
14890 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
148a0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
148b0 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65  Attempt to force
148c0 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67 61   all pending "ga
148d0 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20 74  rbage" objects t
148e0 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d  o be collected,.
148f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
14900 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65 20  ncluding SQLite 
14910 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20 62  statements and b
14920 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20 74  ackup objects; t
14930 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77  his should allow
14940 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
14950 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
14960 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
14970 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20  be deleted...   
14980 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
14990 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b  $collect} then {
149a0 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65 63  ..        collec
149b0 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73 74  tGarbage $::test
149c0 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  _channel..      
149d0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
149e0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
149f0 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 74  k if the file st
14a00 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20 20 20  ill exists...   
14a10 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
14a20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
14a30 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
14a40 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
14a50 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
14a60 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
14a70 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f 64 79  iles if somebody
14a80 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62 61 6c   sets the global
14a90 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
14aa0 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 70 72     #       to pr
14ab0 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20  event it...     
14ac0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
14ad0 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e   {$force || ![in
14ae0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
14af0 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68  leanupFile)]} th
14b00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14b10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
14b20 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
14b30 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20  delete the test 
14b40 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  file now...     
14b50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14b60 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64 65 20    if {[set code 
14b70 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
14b80 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
14b90 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rror]]} then {..
14ba0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
14bb0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
14bc0 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
14bd0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
14be0 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  he file, report 
14bf0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
14c00 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14c10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
14c20 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
14c30 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
14c40 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
14c50 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
14c60 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c 65 20  elete test file 
14c70 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
14c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c90 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
14ca0 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  nup, error: " \n
14cb0 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
14cc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
14cd0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
14ce0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14cf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
14d00 77 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65  w that we skippe
14d10 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  d deleting the f
14d20 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
14d30 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
14d40 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20   code 0....     
14d50 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
14d60 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
14d70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
14d80 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
14d90 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64  RNING: skipped d
14da0 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c  eleting test fil
14db0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
14dc0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14dd0 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61   "\" during clea
14de0 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  nup\n"]..       
14df0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
14e00 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
14e10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
14e20 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
14e30 20 65 78 69 73 74 2c 20 73 75 63 63 65 73 73 21   exist, success!
14e40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
14e50 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
14e60 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14e70 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a    return $code..
14e80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
14e90 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67  oc collectGarbag
14ea0 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c  e { channel {mil
14eb0 6c 69 73 65 63 6f 6e 64 73 20 31 30 30 30 7d 20  liseconds 1000} 
14ec0 7b 71 75 69 65 74 20 74 72 75 65 7d 20 7d 20 7b  {quiet true} } {
14ed0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
14ee0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
14ef0 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
14f00 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14f10 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
14f20 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
14f30 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
14f40 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
14f50 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
14f60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14f70 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
14f80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14f90 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14fa0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14fc0 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  ---- memory in u
14fd0 73 65 20 62 79 20 74 68 65 20 43 4c 52 20 62 65  se by the CLR be
14fe0 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e  fore collection.
14ff0 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
15000 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20          $result 
15010 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
15020 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15030 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
15040 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
15050 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
15060 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15070 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
15080 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 43   failed to get C
15090 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c  LR memory usage,
150a0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
150b0 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
150c0 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
150d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
150e0 0a 0d 0a 20 20 20 20 20 20 23 23 23 23 23 23 23  ...      #######
150f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15100 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15110 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15120 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15130 23 23 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ##....      #.. 
15140 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
15150 65 61 74 65 64 6c 79 20 61 74 74 65 6d 70 74 20  eatedly attempt 
15160 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
15170 67 65 20 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c  ge until the all
15180 6f 74 74 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20  otted number..  
15190 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20 6d      #       of m
151a0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 68 61 73 20  illiseconds has 
151b0 65 6c 61 70 73 65 64 2e 20 20 41 6c 77 61 79 73  elapsed.  Always
151c0 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c   attempt to coll
151d0 65 63 74 20 67 61 72 62 61 67 65 0d 0a 20 20 20  ect garbage..   
151e0 20 20 20 23 20 20 20 20 20 20 20 61 74 20 6c 65     #       at le
151f0 61 73 74 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20  ast once...     
15200 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68   #..      if {[h
15210 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
15220 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
15230 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 61  .        set sta
15240 72 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64  rt [clock second
15250 73 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  s]..        set 
15260 73 74 6f 70 20 5b 65 78 70 72 20 7b 24 73 74 61  stop [expr {$sta
15270 72 74 20 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f  rt + ($milliseco
15280 6e 64 73 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d  nds / 1000)}]...
15290 0a 20 20 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20  .        do {.. 
152a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
152b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
152c0 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
152d0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
152e0 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
152f0 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
15300 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72       #       err
15310 6f 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75  or that is encou
15320 6e 74 65 72 65 64 20 69 66 20 77 65 20 66 61 69  ntered if we fai
15330 6c 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  l...          #.
15340 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
15350 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
15360 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
15370 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c 4d 65  ke GC GetTotalMe
15380 6d 6f 72 79 20 74 72 75 65 0d 0a 20 20 20 20 20  mory true..     
15390 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
153a0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
153b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
153c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
153d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
153e0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
153f0 66 61 69 6c 65 64 20 66 75 6c 6c 20 67 61 72 62  failed full garb
15400 61 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20  age collection, 
15410 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20  error: " \..    
15420 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
15430 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
15440 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15450 20 20 20 20 20 20 73 65 74 20 6e 6f 77 20 5b 63        set now [c
15460 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20  lock seconds].. 
15470 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 20 7b         } while {
15480 24 73 74 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26  $start <= $now &
15490 26 20 24 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d  & $now < $stop}.
154a0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
154b0 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
154c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
154f0 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20  ###########.... 
15500 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
15510 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
15520 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
15530 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15540 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
15550 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
15560 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
15570 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  e..        } res
15580 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
15590 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
155a0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
155b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
155c0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
155d0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
155e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
155f0 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
15600 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
15610 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
15620 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15630 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
15640 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
15650 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
15660 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
15670 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15680 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
156a0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
156b0 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d  led to get CLR m
156c0 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72  emory usage, err
156d0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
156e0 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
156f0 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
15700 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
15710 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
15720 67 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43  getSQLiteHandleC
15730 6f 75 6e 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20  ounts { channel 
15740 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
15750 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
15760 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
15770 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
15780 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
15790 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72  ] && [haveConstr
157a0 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  aint \..        
157b0 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
157c0 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
157d0 2e 53 51 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41  .SQLite.COUNT_HA
157e0 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  NDLE]} then {.. 
157f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15800 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65 61    # NOTE: Add ea
15810 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  ch critical hand
15820 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20  le count to the 
15830 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d  resulting list..
15840 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15850 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65      foreach name
15860 20 5b 6c 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f   [list connectio
15870 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
15880 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
15890 74 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  t] {..          
158a0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
158b0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
158c0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
158d0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
158f0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
15900 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
15910 6f 64 73 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20  ods $name..     
15920 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d       } value] ==
15930 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
15940 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15950 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15960 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15970 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15980 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15990 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
159a0 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
159b0 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65   count \"" $name
159c0 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65   "\" is " $value
159d0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
159e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
159f0 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
15a00 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  t $value..      
15a10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
15a20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15a30 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
15a40 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
15a50 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
15a60 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
15a70 20 67 65 74 20 63 72 69 74 69 63 61 6c 20 68 61   get critical ha
15a80 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c  ndle count \"" \
15a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15aa0 20 20 24 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72    $name "\", err
15ab0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75  or: " \n\t $valu
15ac0 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  e \n]..         
15ad0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
15ae0 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 21       } elseif {!
15af0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
15b00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15b10 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 61     # NOTE: The a
15b20 63 74 75 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  ctual handle cou
15b30 6e 74 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  nts are not avai
15b40 6c 61 62 6c 65 3b 20 74 68 65 72 65 66 6f 72 65  lable; therefore
15b50 2c 20 6a 75 73 74 0d 0a 20 20 20 20 20 20 20 20  , just..        
15b60 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  #       return a
15b70 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20  n empty list... 
15b80 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15b90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
15ba0 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20   "---- critical 
15bb0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e  handle counts un
15bc0 61 76 61 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20  available\n"..  
15bd0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
15be0 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
15bf0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
15c00 63 20 73 68 75 74 64 6f 77 6e 53 51 4c 69 74 65  c shutdownSQLite
15c10 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63   { channel {forc
15c20 65 20 66 61 6c 73 65 7d 20 7b 71 75 69 65 74 20  e false} {quiet 
15c30 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
15c40 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15c50 45 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  E: Make sure tha
15c60 74 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  t SQLite core li
15c70 62 72 61 72 79 20 69 73 20 63 6f 6d 70 6c 65 74  brary is complet
15c80 65 6c 79 20 73 68 75 74 64 6f 77 6e 2e 20 20 54  ely shutdown.  T
15c90 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
15ca0 20 20 20 69 73 20 75 73 65 64 20 62 79 20 74 65     is used by te
15cb0 73 74 73 20 74 68 61 74 20 63 68 61 6e 67 65 20  sts that change 
15cc0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  configuration op
15cd0 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f  tions and/or tho
15ce0 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
15cf0 20 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 6d    that need to m
15d00 61 6b 65 20 73 75 72 65 20 6c 6f 67 67 69 6e 67  ake sure logging
15d10 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
15d20 28 69 2e 65 2e 20 6a 75 73 74 20 69 6e 20 63 61  (i.e. just in ca
15d30 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  se..      #     
15d40 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
15d50 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 69 6e  e library was in
15d60 69 74 69 61 6c 69 7a 65 64 20 69 6e 20 74 68 65  itialized in the
15d70 20 70 72 6f 63 65 73 73 20 70 72 69 6f 72 20 74   process prior t
15d80 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  o..      #      
15d90 20 74 68 65 20 53 51 4c 69 74 65 4c 6f 67 20 63   the SQLiteLog c
15da0 6c 61 73 73 20 62 65 69 6e 67 20 61 62 6c 65 20  lass being able 
15db0 74 6f 20 73 65 74 75 70 20 69 74 73 20 6c 6f 67  to setup its log
15dc0 67 69 6e 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d  ging callback)..
15dd0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e  .      #       N
15de0 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 73 68  ormally, this sh
15df0 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 70 65 72  ould only be per
15e00 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65  formed if SQLite
15e10 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a   is loaded and..
15e20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
15e30 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
15e40 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a  he test suite...
15e50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
15e60 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73  f {$force || [is
15e70 53 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68  SQLiteReady]} th
15e80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
15e90 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
15ea0 58 3a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  X: Make sure tha
15eb0 74 20 61 6e 79 20 22 6c 65 61 6b 65 64 22 20 74  t any "leaked" t
15ec0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f  ransactions and/
15ed0 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  or connections..
15ee0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
15ef0 20 20 61 72 65 20 63 6c 65 61 6e 65 64 20 75 70    are cleaned up
15f00 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
15f10 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74 64  the native shutd
15f20 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20  own function... 
15f30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15f40 20 20 66 6f 72 65 61 63 68 20 74 72 61 6e 73 61    foreach transa
15f50 63 74 69 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e  ction [info tran
15f60 73 61 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  sactions] {..   
15f70 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
15f80 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20  ng match \..    
15f90 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
15fa0 23 44 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c  #Data#SQLite#SQL
15fb0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a  iteTransaction#*
15fc0 20 24 74 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20   $transaction]} 
15fd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
15fe0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15ff0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16000 73 71 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  sql transaction 
16010 72 6f 6c 6c 62 61 63 6b 20 24 74 72 61 6e 73 61  rollback $transa
16020 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ction..         
16030 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
16040 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
16050 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
16060 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
16080 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16090 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
160b0 2d 2d 2d 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ---- rolled back
160c0 20 6c 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74   leaked transact
160d0 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
160f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e  transaction \"\n
16100 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ]..             
16110 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16120 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
16130 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
16140 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
16160 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
16170 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16190 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
161a0 69 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  iled to rollback
161b0 20 6c 65 61 6b 65 64 20 74 72 61 6e 73 61 63 74   leaked transact
161c0 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ion \"" \..     
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
161e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c  transaction "\",
161f0 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
16200 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
16210 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16220 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16230 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16240 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  }....        for
16250 65 61 63 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f  each db [info co
16260 6e 6e 65 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  nnections] {..  
16270 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
16280 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20  ing match \..   
16290 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
162a0 6d 23 44 61 74 61 23 53 51 4c 69 74 65 23 53 51  m#Data#SQLite#SQ
162b0 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a  LiteConnection#*
162c0 20 24 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20   $db]} then {.. 
162d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
162e0 63 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65  catch {sql close
162f0 20 24 64 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20   $db} error] == 
16300 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
16310 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
16320 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
16340 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
16350 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16370 22 2d 2d 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61  "---- closed lea
16380 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22  ked database \""
16390 20 24 64 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20   $db \"\n]..    
163a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
163b0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
163c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
163d0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
163e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
163f0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
16400 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
16410 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16420 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
16430 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
16440 20 63 6c 6f 73 65 20 6c 65 61 6b 65 64 20 64 61   close leaked da
16450 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  tabase \"" \..  
16460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16470 20 20 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72    $db "\", error
16480 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
16490 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
164a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
164b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
164c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
164d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
164e0 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
164f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
16500 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
16510 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75  unction, make su
16520 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20  re both..       
16530 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68   #         of th
16540 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
16550 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
16560 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
16570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16580 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
16590 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e  rectories $chann
165a0 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
165b0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
165c0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
165d0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
165e0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
165f0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
16600 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
16610 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
16620 64 73 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ds sqlite3_shutd
16630 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  own..        } r
16640 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
16650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
16660 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
16670 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16680 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
16690 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
166b0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
166c0 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f  _shutdown()... o
166d0 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
166e0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
166f0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
16700 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
16710 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
16720 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16730 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
16740 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
16750 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
16760 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
16770 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72  tdown()... error
16780 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
16790 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
167a0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
167b0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
167c0 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74  .    proc report
167d0 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
167e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  {..            c
167f0 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20 66 61  hannel {quiet fa
16800 6c 73 65 7d 20 7b 72 65 73 65 74 20 74 72 75 65  lse} {reset true
16810 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d  } {collect true}
16820 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
16830 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
16840 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72  available, repor
16850 74 20 6f 6e 20 28 61 6e 64 20 70 6f 73 73 69 62  t on (and possib
16860 6c 79 20 72 65 73 65 74 29 20 74 68 65 20 72 75  ly reset) the ru
16870 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 23 20 20  ntime..      #  
16880 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
16890 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 0d 0a  on statistics...
168a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
168b0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
168c0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
168d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68 61  \..          [ha
168e0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69  veConstraint bui
168f0 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
16900 44 65 62 75 67 5d 20 26 26 20 5b 63 61 74 63 68  Debug] && [catch
16910 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
16920 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
16930 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69   +NonPublic -ali
16940 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  as \..          
16950 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
16960 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
16970 65 4d 65 74 68 6f 64 73 20 73 65 74 74 69 6e 67  eMethods setting
16980 52 65 61 64 43 6f 75 6e 74 73 0d 0a 20 20 20 20  ReadCounts..    
16990 20 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43    } settingReadC
169a0 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  ounts] == 0} the
169b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
169c0 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74   nameCount [$set
169d0 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43  tingReadCounts C
169e0 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 73  ount]..        s
169f0 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d  et valueCount 0.
16a00 0a 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  ...        objec
16a10 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73  t foreach -alias
16a20 20 70 61 69 72 20 24 73 65 74 74 69 6e 67 52 65   pair $settingRe
16a30 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20  adCounts {..    
16a40 20 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65        incr value
16a50 43 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c  Count [$pair Val
16a60 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue]....         
16a70 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
16a80 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16a90 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16aa0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22  "---- setting \"
16ad0 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
16ae0 22 20 77 61 73 20 72 65 61 64 20 22 20 5c 0d 0a  " was read " \..
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20 22 20  [$pair Value] " 
16b10 74 69 6d 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  times\n"]..     
16b20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16b30 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
16b40 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d  {$reset} then {.
16b50 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
16b60 63 61 74 63 68 20 7b 24 73 65 74 74 69 6e 67 52  catch {$settingR
16b70 65 61 64 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d  eadCounts Clear}
16b80 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68   error] == 0} th
16b90 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16ba0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
16bb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16bc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
16bd0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
16be0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
16bf0 20 20 20 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74       "---- reset
16c00 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74   setting statist
16c10 69 63 73 20 66 6f 72 20 74 68 65 20 70 72 65 76  ics for the prev
16c20 69 6f 75 73 20 22 20 5c 0d 0a 20 20 20 20 20 20  ious " \..      
16c30 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 61 6d              $nam
16c40 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
16c50 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
16c60 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 5c 6e   " values read\n
16c70 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
16c80 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  }..          } e
16c90 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
16ca0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16cb0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16cd0 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
16ce0 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74 20  failed to reset 
16cf0 73 65 74 74 69 6e 67 20 73 74 61 74 69 73 74 69  setting statisti
16d00 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20  cs for " \..    
16d10 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
16d20 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61 6d   previous " $nam
16d30 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20 61  eCount " names a
16d40 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e 74  nd " $valueCount
16d50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16d60 20 20 20 20 22 20 76 61 6c 75 65 73 20 72 65 61      " values rea
16d70 64 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  d, error: " \n\t
16d80 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
16d90 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16da0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
16db0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
16dc0 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
16dd0 6e 64 5d 20 26 26 20 5b 68 61 76 65 43 6f 6e 73  nd] && [haveCons
16de0 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
16df0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
16e00 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61  nstant.System.Da
16e10 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f  ta.SQLite.INTERO
16e20 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d  P_VIRTUAL_TABLE]
16e30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
16e40 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74   [haveConstraint
16e50 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16e60 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
16e70 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
16e80 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59  ite.TRACK_MEMORY
16e90 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d  _BYTES]} then {.
16ea0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
16eb0 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
16ec0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
16ed0 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
16ee0 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
16ef0 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
16f00 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
16f10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
16f20 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
16f30 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
16f40 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
16f50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
16f60 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
16f70 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
16f80 4d 65 6d 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f  Memory bytesAllo
16f90 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d  cated..        }
16fa0 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74   memory] == 0} t
16fb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16fc0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
16fd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16fe0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16ff0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
17000 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
17010 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
17020 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
17030 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d  .          set m
17040 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
17050 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
17060 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17070 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
17080 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
17090 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c  ndArgs $memory \
170a0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
170b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
170c0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
170d0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
170e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
170f0 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75  nel "---- maximu
17100 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  m memory in use 
17110 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
17120 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
17130 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
17140 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17150 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
17160 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
17170 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
17180 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
17190 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
171a0 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79 74 65 73  ory maximumBytes
171b0 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20  Allocated..     
171c0 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
171d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
171e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
171f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17200 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
17210 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17220 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
17230 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
17240 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
17250 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
17260 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
17270 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
17280 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17290 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
172a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
172b0 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
172c0 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
172d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
172e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
172f0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17300 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
17310 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
17320 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72  -- current memor
17330 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
17340 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
17350 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
17360 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
17370 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
17380 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
17390 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
173a0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
173b0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
173c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
173d0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
173e0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
173f0 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
17400 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20  _memory_used..  
17410 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
17420 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
17430 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
17440 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
17450 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
17460 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17470 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
17480 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
17490 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
174a0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
174b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
174c0 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68 65   NOTE: Maybe the
174d0 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62   SQLite core lib
174e0 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c 61  rary is unavaila
174f0 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  ble?..          
17500 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
17510 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
17520 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
17530 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
17540 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
17550 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17560 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
17570 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
17580 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
17590 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
175a0 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
175b0 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a   unavailable....
175c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
175d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
175e0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
175f0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
17600 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
17610 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17620 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72  }....      set r
17630 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23  esult $memory; #
17640 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65   NOTE: Return me
17650 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f  mory in-use to o
17660 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20  ur caller.....  
17670 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
17680 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17690 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
176a0 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
176b0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
176c0 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
176d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
176e0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
176f0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
17700 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
17710 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
17720 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
17730 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
17740 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
17750 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
17760 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
17770 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
17790 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68  ite3_memory_high
177a0 77 61 74 65 72 20 30 0d 0a 20 20 20 20 20 20 20  water 0..       
177b0 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
177c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
177d0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
177e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
177f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17800 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
17810 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
17820 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
17830 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
17840 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
17850 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17860 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
17870 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
17880 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
17890 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
178a0 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
178b0 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
178c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
178d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
178e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
178f0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17900 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
17910 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17920 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
17930 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
17940 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
17950 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
17960 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17970 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17980 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17990 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
179a0 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
179b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
179c0 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
179d0 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
179e0 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
179f0 67 65 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20  ge $channel..   
17a00 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
17a10 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
17a20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
17a30 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
17a40 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
17a50 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
17a60 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
17a70 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
17a80 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
17a90 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
17aa0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
17ab0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
17ac0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20  bject invoke GC 
17ad0 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66  GetTotalMemory f
17ae0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
17af0 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
17b00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17b10 69 66 20 7b 5b 73 74 72 69 6e 67 20 69 73 20 69  if {[string is i
17b20 6e 74 65 67 65 72 20 2d 73 74 72 69 63 74 20 24  nteger -strict $
17b30 6d 65 6d 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  memory]} then {.
17b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17b50 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
17b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17b70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17b80 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
17b90 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  ry " bytes\n"]..
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17bb0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
17bc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
17bd0 65 74 20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69  et memory invali
17be0 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d....           
17bf0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17c00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17c10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17c20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
17c30 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
17c40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17c50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17c60 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
17c70 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75      set memory u
17c80 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20  nknown....      
17c90 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
17ca0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17cb0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17cc0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
17cd0 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20  $memory \n]..   
17ce0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17cf0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
17d00 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
17d10 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61   memory unavaila
17d20 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  ble....        i
17d30 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
17d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
17d50 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
17d60 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
17d70 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
17d80 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
17d90 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
17da0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
17db0 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c  proc checkForSQL
17dc0 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20 7b  iteDirectories {
17dd0 20 63 68 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20   channel {reset 
17de0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
17df0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
17e00 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
17e10 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
17e20 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
17e30 74 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  tion is availabl
17e40 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
17e50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17e60 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
17e70 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
17e80 72 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74  r function sqlit
17e90 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
17ea0 65 63 74 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ectory... ".... 
17eb0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17ec0 4e 4f 54 45 3a 20 54 68 69 73 20 63 61 6c 6c 20  NOTE: This call 
17ed0 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  to the sqlite3_w
17ee0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
17ef0 72 79 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73  ry function uses
17f00 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
17f10 20 20 20 20 69 6e 76 61 6c 69 64 20 76 61 6c 75      invalid valu
17f20 65 20 30 20 66 6f 72 20 74 68 65 20 66 69 72 73  e 0 for the firs
17f30 74 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69  t argument.  Thi
17f40 73 20 63 6f 64 65 20 69 73 20 64 65 73 69 67 6e  s code is design
17f50 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
17f60 20 20 74 6f 20 63 68 65 63 6b 20 69 66 20 63 61    to check if ca
17f70 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69  lling the functi
17f80 6f 6e 20 77 69 6c 6c 20 72 61 69 73 65 20 61 6e  on will raise an
17f90 20 65 78 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e   exception (i.e.
17fa0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17fb0 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
17fc0 74 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  t of the functio
17fd0 6e 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  n does not matte
17fe0 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d  r as long as no.
17ff0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
18000 69 72 65 63 74 6f 72 79 20 69 73 20 63 68 61 6e  irectory is chan
18010 67 65 64 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ged)...      #..
18020 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18030 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
18040 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
18050 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
18060 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
18070 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
18080 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
18090 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
180a0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
180b0 65 74 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e  et_directory 0 n
180c0 75 6c 6c 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ull..      }] ==
180d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
180e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
180f0 20 4e 4f 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74   NOTE: Calling t
18100 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
18110 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
18120 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
18130 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
18140 20 20 63 61 75 73 65 20 61 6e 20 65 78 63 65 70    cause an excep
18150 74 69 6f 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c  tion; therefore,
18160 20 69 74 20 6d 75 73 74 20 62 65 20 61 76 61 69   it must be avai
18170 6c 61 62 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20  lable (i.e...   
18180 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76 65       #       eve
18190 6e 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  n though it shou
181a0 6c 64 20 72 65 74 75 72 6e 20 61 20 66 61 69 6c  ld return a fail
181b0 75 72 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ure return code 
181c0 69 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  in this..       
181d0 20 23 20 20 20 20 20 20 20 63 61 73 65 29 2e 0d   #       case)..
181e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
181f0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
18200 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
18210 73 65 74 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d  set_directory...
18220 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
18230 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d  channel yes\n...
18240 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
18250 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73      # NOTE: Does
18260 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
18270 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64 69   to reset the di
18280 72 65 63 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20  rectories?..    
18290 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
182a0 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
182b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
182c0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
182d0 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20  : Now make sure 
182e0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
182f0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
18300 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20  tories are..    
18310 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
18320 73 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c  set their defaul
18330 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20  t values, which 
18340 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66  should be null f
18350 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20  or both...      
18360 20 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63      #       Sinc
18370 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69  e the sqlite3_wi
18380 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
18390 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  y function is av
183a0 61 69 6c 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20  ailable,..      
183b0 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
183c0 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  it...          #
183d0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  ..          for 
183e0 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20 7b 24  {set index 1} {$
183f0 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72  index < 3} {incr
18400 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20   index} {..     
18410 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
18420 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
18430 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
18440 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
18450 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
18460 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
18470 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
18480 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
18490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
184a0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
184b0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
184c0 24 69 6e 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20  $index null..   
184d0 20 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c           } resul
184e0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
184f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
18500 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
18510 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18530 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
18540 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
18550 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20 5c  ctory(" $index \
18560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18570 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20      ", null)... 
18580 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e  ok: " $result \n
18590 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
185a0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
185b0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
185c0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
185d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
185e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
185f0 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  l sqlite3_win32_
18600 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22 20  set_directory(" 
18610 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20 20  $index \..      
18620 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20 6e              ", n
18630 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  ull)... error: "
18640 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
18650 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
18660 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
18670 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
18680 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
18690 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
186a0 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20   no\n....       
186b0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
186c0 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c  TE: Does our cal
186d0 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65  ler want to rese
186e0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69 65  t the directorie
186f0 73 3f 20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  s?  This can onl
18700 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
18710 20 20 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20     be performed 
18720 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
18730 64 65 64 20 61 6e 64 20 72 65 61 64 79 20 66 6f  ded and ready fo
18740 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
18750 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
18760 20 20 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20     suite...     
18770 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
18780 20 7b 24 72 65 73 65 74 20 26 26 20 5b 69 73 53   {$reset && [isS
18790 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
187a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
187b0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
187c0 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72  TE: Now make sur
187d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  e the database a
187e0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
187f0 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a 20 20  ectories are..  
18800 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18810 72 65 73 65 74 20 74 68 65 69 72 20 64 65 66 61  reset their defa
18820 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68 69 63  ult values, whic
18830 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c  h should be null
18840 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20   for both...    
18850 20 20 20 20 20 20 23 20 20 20 20 20 20 20 53 69        #       Si
18860 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  nce the sqlite3_
18870 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
18880 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  ory function doe
18890 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20  s not..         
188a0 20 23 20 20 20 20 20 20 20 61 70 70 65 61 72 20   #       appear 
188b0 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2c  to be available,
188c0 20 75 73 65 20 74 68 65 20 61 73 73 6f 63 69 61   use the associa
188d0 74 65 64 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  ted PRAGMA comma
188e0 6e 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 23  nds..          #
188f0 20 20 20 20 20 20 20 69 6e 73 74 65 61 64 2e 0d         instead..
18900 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
18910 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
18920 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
18930 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
18940 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
18950 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
18960 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71            set sq
18970 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50  l [appendArgs "P
18980 52 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f  RAGMA " $directo
18990 72 79 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a  ry " = \"\";"]..
189a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
189b0 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74   {[catch {execut
189c0 65 53 71 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c  eSql $sql} resul
189d0 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  t] == 0} then {.
189e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
189f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
18a00 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18a20 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
18a30 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
18a40 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d   "... ok: \"" \.
18a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a60 20 20 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d     $result \"\n]
18a70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
18a80 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
18a90 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18aa0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
18ab0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18ac0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
18ad0 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
18ae0 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
18af0 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
18b00 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
18b10 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
18b20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18b30 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18b40 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
18b50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
18b60 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73  NOTE: Finally, s
18b70 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
18b80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
18b90 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70 6f 72  abase and tempor
18ba0 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
18bb0 20 20 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20     directories. 
18bc0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62   This can only b
18bd0 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 53  e performed if S
18be0 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64 0d  QLite is loaded.
18bf0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
18c00 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65  nd ready for use
18c10 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
18c20 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
18c30 20 20 20 20 69 66 20 7b 5b 69 73 53 51 4c 69 74      if {[isSQLit
18c40 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d  eReady]} then {.
18c50 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
18c60 20 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74   directory [list
18c70 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65   data_store_dire
18c80 63 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65  ctory temp_store
18c90 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20  _directory] {.. 
18ca0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
18cb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
18cc0 72 67 73 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  rgs "---- checki
18cd0 6e 67 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  ng " $directory 
18ce0 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20  "... "]....     
18cf0 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70       set sql [ap
18d00 70 65 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41  pendArgs "PRAGMA
18d10 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 3b   " $directory \;
18d20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  ]....          i
18d30 66 20 7b 5b 63 61 74 63 68 20 7b 65 78 65 63 75  f {[catch {execu
18d40 74 65 53 71 6c 20 24 73 71 6c 20 73 63 61 6c 61  teSql $sql scala
18d50 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  r} result] == 0}
18d60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18d70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
18d80 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18d90 22 6f 6b 3a 20 5c 22 22 20 24 72 65 73 75 6c 74  "ok: \"" $result
18da0 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
18db0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18dc0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
18dd0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18de0 67 73 20 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  gs "error: " \n\
18df0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
18e00 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
18e10 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
18e20 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
18e30 6f 63 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73  oc loadSQLiteTes
18e40 74 53 65 74 74 69 6e 67 73 20 7b 20 63 68 61 6e  tSettings { chan
18e50 6e 65 6c 20 7b 73 75 66 66 69 78 20 22 22 7d 20  nel {suffix ""} 
18e60 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
18e70 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
18e80 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c    # NOTE: Skip l
18e90 6f 61 64 69 6e 67 20 74 68 65 20 73 65 74 74 69  oading the setti
18ea0 6e 67 73 20 69 66 20 74 68 65 69 72 20 75 73 61  ngs if their usa
18eb0 67 65 20 68 61 73 20 62 65 65 6e 20 64 69 73 61  ge has been disa
18ec0 62 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bled...      #..
18ed0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
18ee0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
18ef0 69 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 29  iteTestSettings)
18f00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
18f10 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18f20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f  NOTE: Load custo
18f30 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f  m per-user and/o
18f40 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  r per-host test 
18f50 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
18f60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
18f70 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
18f80 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
18f90 6d 28 75 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b  m(user)]} then {
18fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
18fb0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
18fc0 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
18fd0 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
18fe0 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
18ff0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
19000 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
19010 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
19020 66 6f 72 6d 28 75 73 65 72 29 20 2e 65 61 67 6c  form(user) .eagl
19030 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
19040 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
19050 73 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46  s $userSettingsF
19060 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
19070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
19080 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
19090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
190a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
190b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
190e0 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
190f0 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
19100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19110 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
19120 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
19130 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
19140 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
19150 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c               upl
19170 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
19180 72 63 65 20 24 75 73 65 72 53 65 74 74 69 6e 67  rce $userSetting
19190 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  sFileName]..    
191a0 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
191b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
191c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
191d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
191f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
19200 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19220 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
19230 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
19240 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73 20 66  -user settings f
19250 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
19270 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
19280 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
19290 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
192a0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
192b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
192c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
192d0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
192e0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
192f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19300 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19310 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19320 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19330 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
19340 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
19350 2d 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69  -user test setti
19360 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46    $userSettingsF
19390 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
193a0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
193b0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
193c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
193d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
193e0 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23       ###########
193f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19420 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a  ############....
19430 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
19440 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70  o exists ::tcl_p
19450 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20  latform(host)]} 
19460 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19470 20 20 73 65 74 20 68 6f 73 74 53 65 74 74 69 6e    set hostSettin
19480 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  gsFileName [file
19490 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e   join [getCommon
194a0 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20  Directory] \..  
194b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70              [app
194c0 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e 67 73  endArgs settings
194d0 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63   $suffix . $::tc
194e0 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29  l_platform(host)
194f0 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20   .eagle]]....   
19500 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
19510 20 65 78 69 73 74 73 20 24 68 6f 73 74 53 65 74   exists $hostSet
19520 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20  tingsFileName]} 
19530 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19540 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
19550 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19560 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
19570 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19580 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19590 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61         "---- loa
195a0 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65  ding per-host te
195b0 73 74 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  st settings file
195c0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
195d0 20 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53            $hostS
195e0 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20  ettingsFileName 
195f0 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20  \"...\n]..      
19600 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19610 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
19620 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
19630 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
19640 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73 74 53  st source $hostS
19650 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
19660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
19670 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
19690 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
196a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
196b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
196c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
196d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
196e0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
196f0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f  NG: failed to lo
19700 61 64 20 70 65 72 2d 68 6f 73 74 20 73 65 74 74  ad per-host sett
19710 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
19720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19730 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
19740 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
19750 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
19760 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
19770 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19780 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
19790 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
197a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
197b0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
197d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
197e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
19800 2d 2d 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69  -- skipped loadi
19810 6e 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  ng per-host test
19820 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
19830 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
19840 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74          $hostSet
19850 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c  tingsFileName "\
19860 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
19870 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
19880 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19890 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
198a0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
198b0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75 6e  ....    proc run
198c0 53 51 4c 69 74 65 54 65 73 74 50 72 6f 6c 6f 67  SQLiteTestProlog
198d0 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ue {} {..      #
198e0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
198f0 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72  Skip running our
19900 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65   custom prologue
19910 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65   if the main one
19920 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20   has been..     
19930 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65 64   #       skipped
19940 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19950 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
19960 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75  sts ::no(prologu
19970 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20  e.eagle)]} then 
19980 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
19990 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f        # NOTE: Lo
199a0 61 64 20 74 68 65 20 22 62 65 66 6f 72 65 2d 63  ad the "before-c
199b0 6f 6e 73 74 72 61 69 6e 74 73 22 20 63 75 73 74  onstraints" cust
199c0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
199d0 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20  or per-host..   
199e0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73       #       tes
199f0 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d  t settings now..
19a00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19a10 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
19a20 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
19a30 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
19a40 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f  st_channel .befo
19a50 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  re]....        #
19a60 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
19a70 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 5b  : Check if the [
19a80 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20  object] command 
19a90 69 73 20 61 76 61 69 6c 61 62 6c 65 3b 20 69 66  is available; if
19aa0 20 6e 6f 74 2c 20 61 64 64 20 73 6f 6d 65 0d 0a   not, add some..
19ab0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19ac0 73 68 69 6d 73 20 74 6f 20 6d 61 6b 65 20 74 68  shims to make th
19ad0 65 20 74 65 73 74 20 73 75 69 74 65 20 72 75 6e  e test suite run
19ae0 20 73 6d 6f 6f 74 68 65 72 2e 0d 0a 20 20 20 20   smoother...    
19af0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
19b00 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a  heckForSQLiteObj
19b10 65 63 74 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65  ectCommand $::te
19b20 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
19b30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19b40 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69   # NOTE: Determi
19b50 6e 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ne the names of 
19b60 74 68 65 20 6e 61 74 69 76 65 20 70 6c 61 74 66  the native platf
19b70 6f 72 6d 20 61 6e 64 20 61 72 63 68 69 74 65 63  orm and architec
19b80 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ture...        #
19b90 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 70 6c  ..        set pl
19ba0 61 74 66 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64  atform [getBuild
19bb0 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a  Platform true]..
19bc0 20 20 20 20 20 20 20 20 73 65 74 20 61 72 63 68          set arch
19bd0 69 74 65 63 74 75 72 65 20 5b 61 72 63 68 69 74  itecture [archit
19be0 65 63 74 75 72 65 46 6f 72 50 6c 61 74 66 6f 72  ectureForPlatfor
19bf0 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  m $platform]....
19c00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19c10 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
19c20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64  the platform and
19c30 20 61 72 63 68 69 74 65 63 74 75 72 65 20 75 73   architecture us
19c40 65 64 20 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74  ed to help locat
19c50 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  e the..        #
19c60 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 62 75         native bu
19c70 69 6c 64 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20  ild files...    
19c80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
19c90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19ca0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19cb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19cc0 22 2d 2d 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66  "---- platform f
19cd0 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69  or locating nati
19ce0 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73 20 69  ve build files i
19cf0 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  s \"" \..       
19d00 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c       $platform \
19d10 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  "\n]....        
19d20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
19d30 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
19d40 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
19d50 20 22 2d 2d 2d 2d 20 61 72 63 68 69 74 65 63 74   "---- architect
19d60 75 72 65 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67  ure for locating
19d70 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 66 69   native build fi
19d80 6c 65 73 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20  les is \"" \..  
19d90 20 20 20 20 20 20 20 20 20 20 24 61 72 63 68 69            $archi
19da0 74 65 63 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d  tecture \"\n]...
19db0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19dc0 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
19dd0 64 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66  d a list of conf
19de0 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 73 20  iguration files 
19df0 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d  that we handle..
19e00 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19e10 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67 46 69      set configFi
19e20 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d  leNames [list \.
19e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73  .            Sys
19e40 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
19e50 64 6c 6c 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20  dll.config].... 
19e60 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19e70 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
19e80 61 20 6c 69 73 74 20 6f 66 20 61 75 78 69 6c 69  a list of auxili
19e90 61 72 79 20 4d 61 6e 61 67 65 64 20 44 65 62 75  ary Managed Debu
19ea0 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
19eb0 20 28 4d 44 41 29 0d 0a 20 20 20 20 20 20 20 20   (MDA)..        
19ec0 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72  #       configur
19ed0 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61 74  ation files that
19ee0 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
19ef0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19f00 73 65 74 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c  set mdaConfigFil
19f10 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
19f20 20 20 20 20 20 20 20 20 20 20 20 20 45 61 67 6c              Eagl
19f30 65 53 68 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61  eShell32.exe.mda
19f40 2e 63 6f 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65  .config Installe
19f50 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  r.exe.mda.config
19f60 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19f70 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  test.exe.mda.con
19f80 66 69 67 20 74 65 73 74 6c 69 6e 71 2e 65 78 65  fig testlinq.exe
19f90 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20  .mda.config \.. 
19fa0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 65             teste
19fb0 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  f6.exe.mda.confi
19fc0 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  g]....        #.
19fd0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
19fe0 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20   Build the list 
19ff0 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  of external file
1a000 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1a010 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20  .  Some of..    
1a020 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 73      #       thes
1a030 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65 20 6e  e files may be n
1a040 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e  ative and/or man
1a050 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20  aged assemblies 
1a060 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20 20 20  that are..      
1a070 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72    #       requir
1a080 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20 76 61  ed to perform va
1a090 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a 20 20  rious tests...  
1a0a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a0b0 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46 69 6c   set externalFil
1a0c0 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
1a0e0 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46 72 61  e join EntityFra
1a0f0 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69  mework lib [stri
1a100 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46 78 20  ng map [list Fx 
1a110 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c 0d 0a 20  ""] [string \.. 
1a120 20 20 20 20 20 20 20 20 20 20 20 6d 61 70 20 5b             map [
1a130 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20 6e 65  list netFx451 ne
1a140 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69 6c 64  tFx45] [getBuild
1a150 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46  NetFx]]] EntityF
1a160 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a  ramework.dll]]..
1a170 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a180 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
1a190 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e  ld the list of n
1a1a0 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66  ative assembly f
1a1b0 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e  iles that we han
1a1c0 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20 20 20  dle.  The..     
1a1d0 20 20 20 23 20 20 20 20 20 20 20 72 65 61 73 6f     #       reaso
1a1e0 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61  n the "System.Da
1a1f0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66  ta.SQLite.dll" f
1a200 69 6c 65 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ile is included 
1a210 68 65 72 65 20 69 73 0d 0a 20 20 20 20 20 20 20  here is..       
1a220 20 23 20 20 20 20 20 20 20 62 65 63 61 75 73 65   #       because
1a230 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1a240 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
1a250 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  mbly...        #
1a260 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
1a270 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  tiveFileNames [l
1a280 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
1a290 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 53     sqlite3.dll S
1a2a0 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
1a2b0 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  l System.Data.SQ
1a2c0 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  Lite.dll]....   
1a2d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a2e0 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
1a2f0 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
1a300 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
1a310 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e   that we handle.
1a320 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a330 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67 65 64       set managed
1a340 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20  FileNames [list 
1a350 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1a360 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a370 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  e.dll System.Dat
1a380 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
1a390 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1a3a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a3b0 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a  ite.EF6.dll]....
1a3c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a3d0 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
1a3e0 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e 73 74  e any test const
1a3f0 72 61 69 6e 74 73 20 74 68 61 74 20 72 65 66 65  raints that refe
1a400 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76 65 20  r to the native 
1a410 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20  and/or..        
1a420 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20  #       managed 
1a430 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74  assembly files t
1a440 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20 75 6e  hat we handle un
1a450 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e 20 66  less forbidden f
1a460 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23 20 20  rom..        #  
1a470 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a       doing so...
1a480 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a490 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1a4a0 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
1a4b0 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  RemoveConstraint
1a4c0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1a4d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
1a4e0 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
1a4f0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1a500 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f          removeCo
1a510 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1a520 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65  Args file_ $file
1a530 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20  Name]..         
1a540 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a550 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1a560 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
1a570 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1a580 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
1a590 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1a5a0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
1a5b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1a5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
1a5d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78  ach fileName $ex
1a5e0 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20  ternalFileNames 
1a5f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
1a600 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  emoveConstraint 
1a610 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65  [appendArgs file
1a620 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  _ [file tail $fi
1a630 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20  leName]]..      
1a640 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a650 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1a660 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
1a670 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1a680 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72      removeConstr
1a690 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1a6a0 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65   file_ $fileName
1a6b0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1a6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
1a6d0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61  ach fileName $ma
1a6e0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
1a6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1a700 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
1a710 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
1a720 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
1a730 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a740 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1a750 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a760 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73 74 65  : Skip all Syste
1a770 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
1a780 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e 64 6c  lated file handl
1a790 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a  ing (deleting,..
1a7a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a7b0 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61  copying, and loa
1a7c0 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72 75 63  ding) if instruc
1a7d0 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ted...        #.
1a7e0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
1a7f0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1a800 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  sqliteFiles)]} t
1a810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a820 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1a830 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
1a840 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  g to delete any 
1a850 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
1a860 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
1a870 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1a880 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1a890 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
1a8a0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1a8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1a8c0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1a8d0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
1a8e0 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74  ConfigFiles)]} t
1a8f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a900 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1a910 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c  eName $configFil
1a920 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1a930 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
1a940 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
1a950 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1a960 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a970 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a980 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1a990 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
1a9a0 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65 72 6e  leteSqliteExtern
1a9b0 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  alFiles)]} then 
1a9c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1a9d0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1a9e0 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65  e $mdaConfigFile
1a9f0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1aa00 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
1aa10 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c  teBuildFile $fil
1aa20 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
1aa30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1aa40 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1aa50 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e  fileName $extern
1aa60 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  alFileNames {.. 
1aa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1aa80 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
1aa90 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  le $fileName..  
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1aab0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1aad0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1aae0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e  no(deleteSqliteN
1aaf0 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20 74 68  ativeFiles)]} th
1ab00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ab10 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1ab20 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1ab30 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46  eSqliteImplicitF
1ab40 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab60 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1ab70 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
1ab80 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1ab90 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
1aba0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
1abb0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
1abc0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1abd0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1abe0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1abf0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
1ac00 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d  eleteSqliteNonIm
1ac10 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
1ac20 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ac30 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1ac40 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
1ac50 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f  leteSqlitePlatfo
1ac60 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac80 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1ac90 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
1aca0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1acc0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1acd0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1ace0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1acf0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
1ad00 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1ad10 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1ad30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ad40 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ad50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1ad60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
1ad70 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69 74  leteSqliteArchit
1ad80 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
1ad90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ada0 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1adb0 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
1adc0 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
1add0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ade0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1adf0 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
1ae00 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1ae20 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
1ae30 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69  $fileName $archi
1ae40 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20  tecture..       
1ae50 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1ae80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1ae90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1aea0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1aeb0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
1aec0 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73 29 5d  teManagedFiles)]
1aed0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aee0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1aef0 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  fileName $manage
1af00 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  dFileNames {..  
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1af20 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79 20  yDeleteAssembly 
1af30 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1af40 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1af50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1af60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1af70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1af80 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
1af90 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65 6c 65  or the "autoSele
1afa0 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ct" runtime opti
1afb0 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c  on.  If present,
1afc0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1afd0 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f 20 61      attempt to a
1afe0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
1aff0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 61 76  ect the first av
1b000 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
1b010 20 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64     #       build
1b020 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22 29 20   (or "release") 
1b030 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20 53 79  of SQLite and Sy
1b040 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b050 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1b060 20 20 20 20 66 6f 72 20 75 73 65 20 77 69 74 68      for use with
1b070 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
1b080 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1b090 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61           if {[ha
1b0a0 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61  sRuntimeOption a
1b0b0 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e  utoSelect]} then
1b0c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b0d0 69 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51  if {![checkForSQ
1b0e0 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65  LiteBuilds $::te
1b0f0 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d  st_channel true]
1b100 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b110 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1b120 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24  SQLiteReleases $
1b130 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74  ::test_channel t
1b140 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
1b150 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
1b160 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1b170 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1b180 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
1b190 20 76 65 72 69 66 79 20 74 68 65 20 62 75 69 6c   verify the buil
1b1a0 64 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 69  d directory if i
1b1b0 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20 20 20  nstructed;..    
1b1c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 74        #       ot
1b1d0 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20 73 75  herwise, make su
1b1e0 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79 20 65  re it actually e
1b1f0 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20 74 68  xists or halt th
1b200 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20 20 20  e entire..      
1b210 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1b220 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66 20 69  ing process if i
1b230 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1b240 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1b250 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1b260 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1b270 28 76 65 72 69 66 79 42 75 69 6c 64 44 69 72 65  (verifyBuildDire
1b280 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d  ctory)]} then {.
1b290 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b2b0 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f 69 6e  TE: At this poin
1b2c0 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  t, the build dir
1b2d0 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78 69 73  ectory MUST exis
1b2e0 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20 20 20  t as a..        
1b2f0 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c 69      #       vali
1b300 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  d directory for 
1b310 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
1b320 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ess to continue.
1b330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1b340 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
1b350 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
1b360 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a  uildDirectory]..
1b370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1b380 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
1b390 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c  $directory] || \
1b3a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b3b0 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72 65 63    ![file isdirec
1b3c0 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72 79 5d  tory $directory]
1b3d0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1b3e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b3f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b400 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f 20 61   Just prior to a
1b410 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20  ctually halting 
1b420 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
1b430 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ess,..          
1b440 20 20 20 20 23 20 20 20 20 20 20 20 61 64 64 20      #       add 
1b450 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20  an error to the 
1b460 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a  test log file...
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1b490 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1b4a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1b4b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b4c0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c        "---- coul
1b4d0 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69  d not verify bui
1b4e0 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22  ld directory \""
1b4f0 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20   $directory \.. 
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e   "\", all testin
1b520 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a  g halted\n"]....
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1b540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1b550 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61   NOTE: Raising a
1b560 20 73 63 72 69 70 74 20 65 72 72 6f 72 20 66 72   script error fr
1b570 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68  om this point sh
1b580 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20  ould halt..     
1b590 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1b5a0 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f   the testing pro
1b5b0 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20  cess...         
1b5c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b5d0 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70        error [app
1b5e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1b600 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
1b610 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
1b620 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
1b630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b640 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
1b650 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20  ing halted"]..  
1b660 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1b670 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b680 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b690 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
1b6a0 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61  trying to copy a
1b6b0 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74  ny files if inst
1b6c0 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20  ructed...       
1b6d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b6e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1b6f0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1b700 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  eFiles)]} then {
1b710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1b720 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1b730 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43  ::no(copySqliteC
1b740 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68  onfigFiles)]} th
1b750 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1b760 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1b770 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
1b780 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1b790 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
1b7a0 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e  BuildFile $fileN
1b7b0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1b7c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b7d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1b7e0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1b7f0 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
1b800 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65  liteExternalFile
1b810 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1b820 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1b830 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b840 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d 61 6e  TE: Copy the Man
1b850 61 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41  aged Debugging A
1b860 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 20  ssistants (MDA) 
1b870 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20  configuration.. 
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
1b890 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20 74 68       file for th
1b8a0 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f  e Eagle shell to
1b8b0 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75   the build outpu
1b8c0 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20  t directory,..  
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1b8e0 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e 67 20      while using 
1b8f0 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61 6d 65  each of the name
1b900 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  s of the various
1b910 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a 20 20   legacy test..  
1b920 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
1b930 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 73 2e      executables.
1b940 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65 6c 70    This will help
1b950 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1b960 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20  at all the..    
1b970 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1b980 20 20 6c 65 67 61 63 79 20 74 65 73 74 73 20 72    legacy tests r
1b990 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c 79 20  un with exactly 
1b9a0 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
1b9b0 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  Managed..       
1b9c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44         #       D
1b9d0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
1b9e0 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d  nts configured..
1b9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1ba00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ba10 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1ba20 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e   $mdaConfigFileN
1ba30 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1ba40 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42          tryCopyB
1ba50 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c 65 53  inaryFile EagleS
1ba60 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
1ba70 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61 6d 65  fig "" $fileName
1ba80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ba90 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1baa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bab0 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79      # NOTE: Copy
1bac0 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62 69   the external bi
1bad0 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79 2c 20  naries, if any, 
1bae0 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1baf0 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20 20   that..         
1bb00 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
1bb10 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c 65 20  tains the Eagle 
1bb20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69 73 20  shell.  This is 
1bb30 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64 20 74  typically used t
1bb40 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20  o make..        
1bb50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
1bb60 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20 72 65  re assemblies re
1bb70 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
1bb80 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73 74 65  ones being teste
1bb90 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  d are..         
1bba0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 76 61       #       ava
1bbb0 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20 74 68  ilable during th
1bbc0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
1bbd0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
1bbe0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1bbf0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1bc00 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
1bc10 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
1bc20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
1bc30 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20 24 66  yExternalFile $f
1bc40 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1bc50 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1bc60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bc70 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1bc80 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
1bc90 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65 46 69  pySqliteNativeFi
1bca0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1bcd0 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
1bce0 74 20 70 6c 61 74 66 6f 72 6d 20 69 73 20 6c 69  t platform is li
1bcf0 6b 65 6c 79 20 74 68 65 20 64 65 66 61 75 6c 74  kely the default
1bd00 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20   for this..     
1bd10 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1bd20 20 6d 61 63 68 69 6e 65 2c 20 61 6c 73 6f 20 74   machine, also t
1bd30 72 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6e  ry to copy the n
1bd40 61 74 69 76 65 20 66 69 6c 65 73 20 74 6f 20 74  ative files to t
1bd50 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
1bd60 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79    #       binary
1bd70 20 6c 6f 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20   location...    
1bd80 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bd90 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1bda0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1bdb0 6f 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c  o(copySqliteImpl
1bdc0 69 63 69 74 46 69 6c 65 73 29 5d 20 26 26 20 5c  icitFiles)] && \
1bdd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bde0 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42 75      [isDefaultBu
1bdf0 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74 72 75 65  ildPlatform true
1be00 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1be10 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
1be20 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
1be30 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c    tryCopyAssembl
1be60 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1be90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1bea0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1beb0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
1bec0 74 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c  teNonImplicitFil
1bed0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1bef0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1bf00 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50  ::no(copySqliteP
1bf10 6c 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26  latformFiles)] &
1bf20 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1bf30 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1bf40 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
1bf50 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1bf80 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
1bf90 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1bfa0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
1bfb0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
1bfc0 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1bff0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1c000 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1c010 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1c020 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69  (copySqliteArchi
1c030 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
1c040 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
1c050 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1c060 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
1c070 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
1c080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c090 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
1c0a0 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
1c0b0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c0d0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
1c0e0 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74  fileName $archit
1c0f0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
1c100 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1c130 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c140 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c150 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1c160 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d  ::no(copySqliteM
1c170 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
1c180 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c190 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1c1a0 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
1c1b0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1c1c0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
1c1d0 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
1c1e0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1c1f0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c200 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1c210 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
1c220 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1c230 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
1c240 74 6f 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65  to load any file
1c250 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e  s if instructed.
1c260 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1c270 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1c280 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1c290 6c 6f 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29  loadSqliteFiles)
1c2a0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c2b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1c2c0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
1c2d0 61 64 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74  adSqliteImplicit
1c2e0 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
1c2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
1c300 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
1c310 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1c320 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  e.dll..         
1c330 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c340 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1c350 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
1c360 71 6c 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d  qliteLinqFiles)]
1c370 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1c380 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
1c390 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
1c3a0 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
1c3b0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
1c3c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1c3d0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1c3e0 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
1c3f0 69 74 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74  iteEf6Files)]} t
1c400 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c410 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
1c420 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
1c430 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d  .SQLite.EF6.dll.
1c440 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1c450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1c460 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1c470 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e  ::no(loadSqliteN
1c480 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
1c490 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c4a0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1c4b0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1c4c0 6c 6f 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f  loadSqlitePlatfo
1c4d0 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  rmFiles)] && \..
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1c500 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
1c510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1c520 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64           tryLoad
1c530 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e  Assembly System.
1c540 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20  Data.SQLite.dll 
1c550 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
1c560 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1c580 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1c590 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63  no(loadSqliteArc
1c5a0 68 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d  hitectureFiles)]
1c5b0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1c5c0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
1c5d0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
1c5e0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
1c5f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c600 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d      tryLoadAssem
1c610 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  bly System.Data.
1c620 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
1c630 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
1c640 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c650 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c660 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1c670 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1c680 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1c690 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1c6a0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1c6b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c6c0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1c6d0 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65  sion of \"sqlite
1c6e0 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  3.dll\"... " \..
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
1c700 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
1c710 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73  BinaryFileName s
1c720 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d  qlite3.dll]] \n]
1c730 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1c740 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1c750 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1c760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1c770 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1c790 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
1c7a0 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65  of \"SQLite.Inte
1c7b0 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  rop.dll\"... " \
1c7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c7d0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1c7e0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1c7f0 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
1c800 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
1c810 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c820 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1c830 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1c840 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1c850 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1c860 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
1c870 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
1c880 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1c890 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
1c8b0 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
1c8c0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79  inaryFileName Sy
1c8d0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1c8e0 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  .dll]] \n]..    
1c8f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c900 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
1c910 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1c920 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1c930 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1c940 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1c950 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
1c960 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1c970 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20  e.Linq.dll\"... 
1c980 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1c990 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
1c9a0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1c9b0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1c9c0 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d  SQLite.Linq.dll]
1c9d0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
1c9e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
1c9f0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
1ca00 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1ca10 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1ca20 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ca30 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1ca40 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d  sion of \"System
1ca50 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36  .Data.SQLite.EF6
1ca60 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
1ca80 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
1ca90 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79  inaryFileName Sy
1caa0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1cab0 2e 45 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  .EF6.dll]] \n]..
1cac0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1cad0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1cae0 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
1caf0 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
1cb00 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1cb10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1cb20 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1cb30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1cb40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cb50 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1cb60 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70  ersion of \"" $p
1cb70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20  latform \..     
1cb80 20 20 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c             "/sql
1cb90 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  ite3.dll\"... " 
1cba0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
1cbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cbc0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1cbd0 61 6d 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20  ame sqlite3.dll 
1cbe0 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d  $platform]] \n].
1cbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1cc00 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
1cc10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1cc20 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1cc30 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1cc40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1cc50 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1cc60 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70  ersion of \"" $p
1cc70 6c 61 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20  latform \..     
1cc80 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c             "/SQL
1cc90 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
1cca0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
1ccb0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
1ccc0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
1ccd0 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ryFileName SQLit
1cce0 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70  e.Interop.dll $p
1ccf0 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20  latform]] \n].. 
1cd00 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1cd10 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1cd20 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1cd30 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1cd40 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cd50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cd60 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1cd70 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
1cd80 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
1cd90 20 20 20 20 20 20 20 20 20 22 2f 53 79 73 74 65           "/Syste
1cda0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1cdb0 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
1cdc0 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
1cdd0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
1cde0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
1cdf0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1ce00 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20  dll $platform]] 
1ce10 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1ce20 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1ce30 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1ce40 6e 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69  ng length $archi
1ce50 74 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68  tecture] > 0} th
1ce60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ce70 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1ce80 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ce90 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1cea0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ceb0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1cec0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1ced0 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75 72  \"" $architectur
1cee0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1cef0 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64       "/sqlite3.d
1cf00 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
1cf10 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
1cf20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
1cf30 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
1cf40 6c 69 74 65 33 2e 64 6c 6c 20 24 61 72 63 68 69  lite3.dll $archi
1cf50 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20  tecture]] \n].. 
1cf60 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1cf70 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
1cf80 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1cf90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1cfa0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1cfb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cfc0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
1cfd0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63  sion of \"" $arc
1cfe0 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20  hitecture \..   
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53               "/S
1d000 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
1d010 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
1d020 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
1d030 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
1d040 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c  naryFileName SQL
1d050 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20  ite.Interop.dll 
1d060 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20  $architecture]] 
1d070 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1d080 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61  ....          ca
1d090 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1d0a0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1d0b0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1d0c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1d0d0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
1d0e0 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
1d0f0 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
1d100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d110 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61     "/System.Data
1d120 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
1d130 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
1d140 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1d150 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
1d160 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
1d170 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61  ta.SQLite.dll $a
1d180 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e  rchitecture]] \n
1d190 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
1d1a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1d1b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d1c0 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
1d1d0 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64   list of managed
1d1e0 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20   assemblies for 
1d1f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
1d200 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ess..        #  
1d210 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20       and report 
1d220 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
1d230 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
1d240 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
1d250 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1d260 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
1d270 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20  tCommand]} then 
1d280 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
1d290 20 61 73 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a   assemblies [obj
1d2a0 65 63 74 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f  ect invoke AppDo
1d2b0 6d 61 69 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61  main.CurrentDoma
1d2c0 69 6e 20 47 65 74 41 73 73 65 6d 62 6c 69 65 73  in GetAssemblies
1d2d0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  ]....          o
1d2e0 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20 61 73  bject foreach as
1d2f0 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62 6c 69  sembly $assembli
1d300 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1d310 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
1d320 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
1d330 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
1d340 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
1d350 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1d360 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1d370 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1d380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d390 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
1d3a0 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
1d3b0 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
1d3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1d3d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d3e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d3f0 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
1d400 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1d410 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  st_channel \..  
1d420 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1d430 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e  - define constan
1d440 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e  ts for \"System.
1d450 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e  Data.SQLite\"...
1d460 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
1d470 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1d480 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1d490 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1d4a0 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1d4c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1d4d0 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f  SQLite3 DefineCo
1d4e0 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20  nstants..       
1d4f0 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74     } defineConst
1d500 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ants] == 0} then
1d510 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d520 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d530 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d540 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
1d550 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
1d560 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65 43          $defineC
1d570 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e  onstants] <none>
1d580 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1d590 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1d5a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1d5b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1d5c0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1d5d0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1d5e0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1d5f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1d600 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1d610 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1d620 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65      "---- source
1d630 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79   version of \"Sy
1d640 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1d650 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
1d660 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
1d670 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1d680 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
1d690 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
1d6a0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
1d6b0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
1d6c0 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
1d6d0 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
1d6e0 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20  erVersion..     
1d6f0 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
1d700 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
1d710 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1d720 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
1d730 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
1d740 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1d750 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
1d760 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
1d770 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1d780 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d790 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d7a0 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
1d7b0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1d7c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d7d0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d7e0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
1d7f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1d800 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d810 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1d820 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1d830 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1d850 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
1d860 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
1d870 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
1d880 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
1d890 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
1d8a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
1d8b0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1d8c0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1d8f0 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74  te.SQLiteConnect
1d900 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75 72  ion ProviderSour
1d910 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ceId..          
1d920 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30  } sourceId] == 0
1d930 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1d940 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
1d950 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
1d960 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
1d970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d980 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c  set sourceId nul
1d990 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
1d9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
1d9b0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
1d9c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
1d9d0 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20  $sourceId \n].. 
1d9e0 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
1d9f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1da00 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1da10 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a  nnel unknown\n..
1da20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1da30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1da40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1da50 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
1da60 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
1da70 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
1da80 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
1da90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1daa0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1dab0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
1dac0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1dad0 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
1dae0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
1daf0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1db00 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
1db10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
1db20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1db30 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
1db40 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
1db50 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
1db60 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
1db70 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
1db80 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
1db90 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
1dba0 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
1dbb0 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
1dbc0 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
1dbd0 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
1dbe0 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
1dbf0 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
1dc00 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
1dc10 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
1dc20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
1dc30 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
1dc40 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
1dc50 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
1dc60 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
1dc70 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
1dc80 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
1dc90 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
1dca0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
1dcb0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
1dcc0 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
1dcd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1dce0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1dcf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1dd00 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
1dd10 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
1dd20 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
1dd30 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1dd40 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
1dd50 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
1dd60 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
1dd70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1dd80 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
1dd90 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
1dda0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
1ddb0 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
1ddc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ddd0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
1dde0 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
1ddf0 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
1de00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1de10 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
1de20 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
1de30 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
1de40 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
1de50 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
1de60 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
1de70 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
1de80 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
1de90 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
1dea0 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
1deb0 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
1dec0 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
1ded0 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
1dee0 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
1def0 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
1df00 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
1df10 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
1df20 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
1df30 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
1df40 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
1df50 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
1df60 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
1df70 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
1df80 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
1df90 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
1dfa0 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
1dfb0 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
1dfc0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
1dfd0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
1dfe0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1dff0 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
1e000 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
1e010 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
1e020 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
1e030 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
1e040 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
1e050 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
1e060 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
1e070 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
1e080 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 49 4e 43  IONS INTEROP_INC
1e090 4c 55 44 45 5f 43 45 52 4f 44 20 5c 0d 0a 20 20  LUDE_CEROD \..  
1e0a0 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
1e0b0 50 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 20  P_INCLUDE_EXTRA 
1e0c0 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f  INTEROP_INCLUDE_
1e0d0 53 45 45 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41  SEE INTEROP_LEGA
1e0e0 43 59 5f 43 4c 4f 53 45 20 5c 0d 0a 20 20 20 20  CY_CLOSE \..    
1e0f0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
1e100 4c 4f 47 20 49 4e 54 45 52 4f 50 5f 54 45 53 54  LOG INTEROP_TEST
1e110 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
1e120 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45  OP_VIRTUAL_TABLE
1e130 20 4e 45 54 5f 32 30 20 5c 0d 0a 20 20 20 20 20   NET_20 \..     
1e140 20 20 20 20 20 20 20 4e 45 54 5f 33 35 20 4e 45         NET_35 NE
1e150 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f  T_40 NET_45 NET_
1e160 34 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f  451 NET_COMPACT_
1e170 32 30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  20 \..          
1e180 20 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41    PLATFORM_COMPA
1e190 43 54 46 52 41 4d 45 57 4f 52 4b 20 50 52 45 4c  CTFRAMEWORK PREL
1e1a0 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41  OAD_NATIVE_LIBRA
1e1b0 52 59 20 52 45 54 41 52 47 45 54 41 42 4c 45 20  RY RETARGETABLE 
1e1c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
1e1d0 51 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 54  QLITE_STANDARD T
1e1e0 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44  HROW_ON_DISPOSED
1e1f0 20 54 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e   TRACE TRACE_CON
1e200 4e 45 43 54 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  NECTION \..     
1e210 20 20 20 20 20 20 20 54 52 41 43 45 5f 44 45 54         TRACE_DET
1e220 45 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e  ECTION TRACE_HAN
1e230 44 4c 45 20 54 52 41 43 45 5f 50 52 45 4c 4f 41  DLE TRACE_PRELOA
1e240 44 20 54 52 41 43 45 5f 53 48 41 52 45 44 20 5c  D TRACE_SHARED \
1e250 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52  ..            TR
1e260 41 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52  ACE_STATEMENT TR
1e270 41 43 45 5f 57 41 52 4e 49 4e 47 20 54 52 41 43  ACE_WARNING TRAC
1e280 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 5c  K_MEMORY_BYTES \
1e290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 53  ..            US
1e2a0 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f  E_ENTITY_FRAMEWO
1e2b0 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45 52 4f 50  RK_6 USE_INTEROP
1e2c0 5f 44 4c 4c 20 55 53 45 5f 50 52 45 50 41 52 45  _DLL USE_PREPARE
1e2d0 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b 0d 0a  _V2 WINDOWS] {..
1e2e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1e2f0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1e300 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f 6d 70  heck if the comp
1e310 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
1e320 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74 68 65  is listed in the
1e330 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20 20 20   list of..      
1e340 20 20 20 20 23 20 20 20 20 20 20 20 22 64 65 66      #       "def
1e350 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22 20 6b  ine constants" k
1e360 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62 79 20  ept track of by 
1e370 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65  the managed asse
1e380 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20  mbly...         
1e390 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   #..          ch
1e3a0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
1e3b0 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a 74 65  neConstant $::te
1e3c0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65 66 69  st_channel $defi
1e3d0 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20 20 20  neConstant..    
1e3e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1e3f0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1e400 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
1e410 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1e420 69 74 65 20 70 72 6f 76 69 64 65 72 20 77 61 73  ite provider was
1e430 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0d 0a   compiled with..
1e440 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e450 73 75 70 70 6f 72 74 20 66 6f 72 20 61 6e 79 20  support for any 
1e460 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61  encrypted databa
1e470 73 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ses...        #.
1e480 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
1e490 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a  veConstraint \..
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4b0 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53  defineConstant.S
1e4c0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e4d0 65 2e 49 4e 54 45 52 4f 50 5f 43 4f 44 45 43 5d  e.INTEROP_CODEC]
1e4e0 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
1e4f0 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
1e500 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  nt \..          
1e510 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73        defineCons
1e520 74 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61  tant.System.Data
1e530 2e 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f  .SQLite.INTEROP_
1e540 49 4e 43 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68  INCLUDE_SEE]} th
1e550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1e560 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
1e570 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20 67 65  OTE: Yes, add ge
1e580 6e 65 72 69 63 20 63 6f 6e 73 74 72 61 69 6e 74  neric constraint
1e590 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
1e5a0 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
1e5b0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e5c0 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
1e5d0 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
1e5e0 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d  Lite.Encryption.
1e5f0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1e600 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e610 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1e620 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
1e630 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
1e640 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
1e650 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
1e660 20 20 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e     which version
1e670 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f   of MSBuild and/
1e680 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  or Visual Studio
1e690 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20   was used to..  
1e6a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1e6b0 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65 6d 62  mpile the assemb
1e6c0 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  ly binaries unde
1e6d0 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20  r test...       
1e6e0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
1e6f0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1e700 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1e710 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
1e720 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
1e730 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61  SQLite build yea
1e740 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  r... "....      
1e750 20 20 73 65 74 20 79 65 61 72 20 5b 67 65 74 42    set year [getB
1e760 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20 20 20  uildYear]..     
1e770 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
1e780 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
1e790 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a  ldYear. $year]..
1e7a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1e7b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1e7c0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 79 65  ppendArgs \" $ye
1e7d0 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ar \"\n]....    
1e7e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1e7f0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1e800 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 2e   current build .
1e810 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20  NET Framework.  
1e820 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d  Basically, this.
1e830 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1e840 20 69 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   indicates which
1e850 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
1e860 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 69  .NET Framework i
1e870 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20 20 20  s being..       
1e880 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62 79   #       used by
1e890 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62 69   the assembly bi
1e8a0 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73  naries under tes
1e8b0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
1e8c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1e8d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1e8f0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
1e900 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1e910 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46 72 61  e build .NET Fra
1e920 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20  mework... ".... 
1e930 20 20 20 20 20 20 20 73 65 74 20 6e 65 74 46 78         set netFx
1e940 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46 78 5d   [getBuildNetFx]
1e950 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
1e960 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
1e970 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65 77 6f  rgs buildFramewo
1e980 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20  rk. $netFx]..   
1e990 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1e9a0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1e9b0 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74 46 78  ndArgs \" $netFx
1e9c0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
1e9d0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1e9e0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63  OTE: Check the c
1e9f0 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e  urrent build con
1ea00 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 69  figuration.  Thi
1ea10 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1ea20 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
1ea30 20 20 20 62 65 20 65 69 74 68 65 72 20 22 44 65     be either "De
1ea40 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65  bug" or "Release
1ea50 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  "...        #.. 
1ea60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1ea70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
1ea90 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
1eaa0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1eab0 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72  e build configur
1eac0 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  ation... "....  
1ead0 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66 69 67        set config
1eae0 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c  uration [getBuil
1eaf0 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  dConfiguration].
1eb00 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
1eb10 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
1eb20 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  gs buildConfigur
1eb30 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72  ation. $configur
1eb40 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ation]..        
1eb50 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1eb60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1eb70 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72 61 74  s \" $configurat
1eb80 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20  ion \"\n]....   
1eb90 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1eba0 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73  # NOTE: Try to s
1ebb0 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70  etup an interrup
1ebc0 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  t callback using
1ebd0 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75   the script debu
1ebe0 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20  gger..        # 
1ebf0 20 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20        that will 
1ec00 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71  cancel all SQL q
1ec10 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65  ueries in progre
1ec20 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ss for all datab
1ec30 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ase..        #  
1ec40 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
1ec50 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69   known to this i
1ec60 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
1ec70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ec80 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1ec90 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74  s ::no(sqliteInt
1eca0 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d  erruptCallback)]
1ecb0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ecc0 20 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72      setupDbInter
1ecd0 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a  ruptCallback $::
1ece0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a  test_channel $::
1ecf0 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20  test_log..      
1ed00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1ed10 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ed20 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20  : Check for the 
1ed30 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f  native runtime o
1ed40 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75  ption, which wou
1ed50 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a  ld mean we are..
1ed60 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ed70 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d  using the mixed-
1ed80 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  mode assembly...
1ed90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1eda0 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69     checkForRunti
1edb0 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74  meOption $::test
1edc0 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d  _channel native.
1edd0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ede0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1edf0 65 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20  eck if the test 
1ee00 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75  suite should cou
1ee10 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1ee20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20   connections..  
1ee30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f        #       "o
1ee40 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73  pened" and "clos
1ee50 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f  ed" from the poo
1ee60 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69  l when determini
1ee70 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20  ng if a test..  
1ee80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
1ee90 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67  ssed.  Disabling
1eea0 20 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69   this behavior i
1eeb0 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65  s sometimes nece
1eec0 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20  ssary (e.g...   
1eed0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72       #       dur
1eee0 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20  ing the release 
1eef0 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29  testing process)
1ef00 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61   because there a
1ef10 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20  re several..    
1ef20 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
1ef30 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74  s that rely on t
1ef40 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20  he "opened from 
1ef50 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e  pool" count bein
1ef60 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20  g greater..     
1ef70 20 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20     #       than 
1ef80 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73  zero.  These tes
1ef90 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20  ts may fail due 
1efa0 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72  to the non-deter
1efb0 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20  ministic..      
1efc0 20 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69    #       behavi
1efd0 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43  or of the CLR GC
1efe0 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72  , even when ther
1eff0 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74  e is no bug in t
1f000 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20  he code..       
1f010 20 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74   #       being t
1f020 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ested...        
1f030 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1f040 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  ForRuntimeOption
1f050 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f060 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d   noPoolCounts...
1f070 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f080 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
1f090 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75  k if the test su
1f0a0 69 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73  ite should use s
1f0b0 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
1f0c0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1f0d0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75        checkForRu
1f0e0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74  ntimeOption $::t
1f0f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72  est_channel shar
1f100 65 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20  edCache....     
1f110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f120 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65  NOTE: Report the
1f130 20 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20   resource usage 
1f140 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67  prior to running
1f150 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20   any tests...   
1f160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f170 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
1f180 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
1f190 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
1f1a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1f1b0 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73  TE: Grab the lis
1f1c0 74 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75  t of native modu
1f1d0 6c 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72  les for the curr
1f1e0 65 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d  ent process and.
1f1f0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f200 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53   report on the S
1f210 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1f220 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d  e related ones..
1f230 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f240 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
1f250 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
1f260 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1f270 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73       set modules
1f280 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
1f290 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f2a0 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1f2b0 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
1f2c0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
1f2d0 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
1f2e0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
1f2f0 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65  ch -alias module
1f300 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20   $modules {..   
1f310 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1f320 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f330 54 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20  The module file 
1f340 6e 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62  name here must b
1f350 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20  e normalized... 
1f360 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f370 20 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69            set fi
1f380 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72  leName [file nor
1f390 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20  malize [$module 
1f3a0 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20  FileName]]....  
1f3b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
1f3c0 74 72 69 6e 67 20 6d 61 74 63 68 20 2d 6e 6f 63  tring match -noc
1f3d0 61 73 65 20 2a 2f 73 71 6c 69 74 65 33 2e 64 6c  ase */sqlite3.dl
1f3e0 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  l $fileName]} th
1f3f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1f400 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1f410 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1f420 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1f430 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1f440 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
1f450 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
1f460 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
1f470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f480 20 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d     $fileName \n]
1f490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
1f4a0 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67 20  elseif {[string 
1f4b0 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
1f4c0 20 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73 65           -nocase
1f4d0 20 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   */SQLite.Intero
1f4e0 70 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d  p.dll $fileName]
1f4f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f500 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f510 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1f520 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f540 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
1f550 64 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  d SQLite interop
1f560 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64 75 6c 65   assembly module
1f570 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
1f580 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
1f590 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  me \n]..        
1f5a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1f5b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1f5c0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1f5d0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1f5e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f5f0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1f600 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
1f610 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
1f620 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  r SQLite core li
1f630 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  brary... "....  
1f640 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1f650 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f660 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f670 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1f680 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1f690 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1f6a0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1f6b0 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
1f6c0 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ions..          
1f6d0 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  } compileOptions
1f6e0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f700 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f710 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 66  l [appendArgs [f
1f720 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74  ormatList [lsort
1f730 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1f740 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69      $compileOpti
1f750 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d  ons] <none>] \n]
1f760 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
1f770 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
1f780 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1f790 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
1f7a0 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
1f7b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1f7c0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1f7d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f7e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
1f7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1f800 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  ---- compile-tim
1f810 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51  e options for SQ
1f820 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73  Lite interop ass
1f830 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20  embly... "....  
1f840 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1f850 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f860 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1f870 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
1f880 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
1f890 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
1f8a0 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
1f8b0 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
1f8c0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 20  tions..         
1f8d0 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e   } compileOption
1f8e0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1f8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1f900 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1f910 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1f920 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1f930 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1f940 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f 70 74       $compileOpt
1f950 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e  ions] <none>] \n
1f960 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
1f970 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
1f980 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1f990 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e  _channel unknown
1f9a0 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  \n..          }.
1f9b0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1f9c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1f9d0 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68   # NOTE: Show th
1f9e0 65 20 61 63 74 69 76 65 20 74 65 73 74 20 63 6f  e active test co
1f9f0 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20  nstraints...    
1fa00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
1fa10 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
1fa20 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
1fa30 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72 61 69 6e   "---- constrain
1fa40 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ts: " \..       
1fa50 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c 69 73 74       [formatList
1fa60 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43 6f 6e 73   [lsort [getCons
1fa70 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f 6e 65 3e  traints]] <none>
1fa80 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
1fa90 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1faa0 54 45 3a 20 53 61 76 65 20 74 68 65 20 74 65 73  TE: Save the tes
1fab0 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  t constraints fo
1fac0 72 20 75 73 65 20 62 79 20 74 68 72 65 61 64 73  r use by threads
1fad0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69 73   created in this
1fae0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1faf0 20 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f    application do
1fb00 6d 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 6e  main.  This is n
1fb10 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
1fb20 20 61 6c 6c 20 74 68 65 20 45 61 67 6c 65 0d 0a   all the Eagle..
1fb30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1fb40 22 74 65 73 74 20 63 6f 6e 74 65 78 74 22 20 69  "test context" i
1fb50 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70 65  nformation is pe
1fb60 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20 20 20 20  r-thread...     
1fb70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
1fb80 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1fb90 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
1fba0 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ts]} then {..   
1fbb0 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
1fbc0 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 24 3a  t_constraints $:
1fbd0 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 63 6f 6e  :eagle_tests(con
1fbe0 73 74 72 61 69 6e 74 73 29 0d 0a 20 20 20 20 20  straints)..     
1fbf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1fc00 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1fc10 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 61 66 74  E: Load the "aft
1fc20 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  er-constraints" 
1fc30 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
1fc40 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
1fc50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1fc60 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
1fc70 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
1fc80 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
1fc90 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
1fca0 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
1fcb0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
1fcc0 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  after]....      
1fcd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1fce0 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72  OTE: If necessar
1fcf0 79 2c 20 65 6e 61 62 6c 65 20 73 68 61 72 65 64  y, enable shared
1fd00 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e  -cache mode now.
1fd10 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1fd20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
1fd30 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65  timeOption share
1fd40 64 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d  dCache]} then {.
1fd50 0a 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c  .          enabl
1fd60 65 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a  eSharedCache $::
1fd70 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
1fd80 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
1fd90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fda0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
1fdb0 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
1fdc0 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
1fdd0 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
1fde0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1fdf0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1fe00 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1fe10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1fe20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
1fe30 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
1fe40 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
1fe50 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
1fe60 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
1fe70 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
1fe80 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1fe90 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
1fea0 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65 20 7b 7d  FilesPrologue {}
1feb0 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76 65   {..      upleve
1fec0 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  l 1 {..        #
1fed0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1fee0 3a 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69  : Setup the vari
1fef0 61 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72  ables that refer
1ff00 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
1ff10 6e 6f 6e 2d 64 61 74 61 20 66 69 6c 65 73 0d 0a  non-data files..
1ff20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1ff30 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1ff40 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69  tests in this fi
1ff50 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
1ff60 20 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69          set enti
1ff70 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69  tyFrameworkDllFi
1ff80 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
1ff90 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
1ffa0 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65 77  ame EntityFramew
1ffb0 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  ork.dll]....    
1ffc0 20 20 20 20 73 65 74 20 69 6e 73 74 61 6c 6c 65      set installe
1ffd0 72 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69  rExeFile [getBui
1ffe0 6c 64 46 69 6c 65 4e 61 6d 65 20 49 6e 73 74 61  ldFileName Insta
1fff0 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20 20 20 20 20  ller.exe]..     
20000 20 20 20 73 65 74 20 73 71 6c 69 74 65 44 65 73     set sqliteDes
20010 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5b 67 65  ignerDllFile [ge
20020 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53  tBuildFileName S
20030 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64  QLite.Designer.d
20040 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
20050 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
20060 69 74 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  iteDllFile \..  
20070 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
20080 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
20090 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
200a0 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
200b0 65 74 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c  et systemDataSQL
200c0 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 5c  iteLinqDllFile \
200d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
200e0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
200f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20100 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 0d 0a 0d 0a  te.Linq.dll]....
20110 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73 74          set syst
20120 65 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44  emDataSQLiteEf6D
20130 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
20140 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
20150 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
20160 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
20170 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  ll]....        s
20180 65 74 20 74 65 73 74 45 78 65 46 69 6c 65 20 5b  et testExeFile [
20190 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65  getBuildFileName
201a0 20 74 65 73 74 2e 65 78 65 5d 0d 0a 20 20 20 20   test.exe]..    
201b0 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71      set testLinq
201c0 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
201d0 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 6c 69  dFileName testli
201e0 6e 71 2e 65 78 65 5d 0d 0a 20 20 20 20 20 20 20  nq.exe]..       
201f0 20 73 65 74 20 74 65 73 74 45 66 36 45 78 65 46   set testEf6ExeF
20200 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
20210 65 4e 61 6d 65 20 74 65 73 74 65 66 36 2e 65 78  eName testef6.ex
20220 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  e]....        #.
20230 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
20240 20 53 65 74 75 70 20 74 68 65 20 76 61 72 69 61   Setup the varia
20250 62 6c 65 73 20 74 68 61 74 20 72 65 66 65 72 20  bles that refer 
20260 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20 64  to the various d
20270 61 74 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ata files..     
20280 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
20290 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
202a0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
202b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
202c0 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e 71 4f     set testLinqO
202d0 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  utFile [file nat
202e0 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
202f0 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
20300 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
20310 44 61 74 61 50 61 74 68 5d 20 74 65 73 74 6c 69  DataPath] testli
20320 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a 20 20 20 20  nq.out]]....    
20330 20 20 20 20 73 65 74 20 6e 6f 72 74 68 77 69 6e      set northwin
20340 64 45 66 44 62 46 69 6c 65 20 5b 66 69 6c 65 20  dEfDbFile [file 
20350 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
20360 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
20370 20 20 20 20 20 5b 66 69 6c 65 20 64 69 72 6e 61       [file dirna
20380 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  me [file dirname
20390 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
203a0 61 74 61 50 61 74 68 5d 5d 5d 20 5c 0d 0a 20 20  ataPath]]] \..  
203b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6c 69            testli
203c0 6e 71 20 6e 6f 72 74 68 77 69 6e 64 45 46 2e 64  nq northwindEF.d
203d0 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  b]]....        s
203e0 65 74 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 20  et nonWalDbFile 
203f0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
20400 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
20410 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
20420 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
20430 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a  h] nonWal.db]]..
20440 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 77 61  ..        set wa
20450 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  lDbFile [file na
20460 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
20470 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
20480 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
20490 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c 2e 64  tDataPath] wal.d
204a0 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  b]]....        #
204b0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
204c0 3a 20 54 68 65 20 76 61 72 69 6f 75 73 20 69 6e  : The various in
204d0 73 74 61 6c 6c 2f 75 6e 69 6e 73 74 61 6c 6c 20  stall/uninstall 
204e0 6c 6f 67 20 66 69 6c 65 73 20 75 73 65 64 20 74  log files used t
204f0 6f 20 74 65 73 74 20 74 68 65 0d 0a 20 20 20 20  o test the..    
20500 20 20 20 20 23 20 20 20 20 20 20 20 64 65 73 69      #       desi
20510 67 6e 2d 74 69 6d 65 20 63 6f 6d 70 6f 6e 65 6e  gn-time componen
20520 74 20 69 6e 73 74 61 6c 6c 65 72 2e 0d 0a 20 20  t installer...  
20530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20540 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
20550 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 20 5b 66  Vs2005LogFile [f
20560 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
20570 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
20580 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
20590 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
205a0 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
205b0 56 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2005.log]]....
205c0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
205d0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
205e0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
205f0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
20600 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20610 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
20620 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65  taPath] Installe
20630 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f  r_Test_Vs2008.lo
20640 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
20650 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
20660 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2010LogFile [fil
20670 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
20680 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
20690 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
206a0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
206b0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
206c0 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2010.log]]....  
206d0 20 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e        set testIn
206e0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
206f0 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
20700 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
20710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
20720 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
20730 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
20740 54 65 73 74 5f 56 73 32 30 31 32 2e 6c 6f 67 5d  Test_Vs2012.log]
20750 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  ]....        set
20760 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
20770 31 33 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  13LogFile [file 
20780 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
20790 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
207a0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
207b0 65 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73  estDataPath] Ins
207c0 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
207d0 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  13.log]]....    
207e0 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
207f0 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69  stallVs2005LogFi
20800 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
20810 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
20820 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
20830 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
20840 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
20850 72 5f 54 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f  r_Test_Vs2005.lo
20860 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  g]]....        s
20870 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c  et testUninstall
20880 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5b 66  Vs2008LogFile [f
20890 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
208a0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
208b0 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
208c0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
208d0 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73   Uninstaller_Tes
208e0 74 5f 56 73 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2008.log]]..
208f0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
20900 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31  stUninstallVs201
20910 30 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  0LogFile [file n
20920 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
20930 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
20940 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
20950 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
20960 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
20970 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
20980 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
20990 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46  nstallVs2012LogF
209a0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
209b0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
209c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
209d0 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
209e0 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c  aPath] Uninstall
209f0 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e 6c  er_Test_Vs2012.l
20a00 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og]]....        
20a10 73 65 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  set testUninstal
20a20 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b  lVs2013LogFile [
20a30 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
20a40 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20  [file join \..  
20a50 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51            [getSQ
20a60 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68  LiteTestDataPath
20a70 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65  ] Uninstaller_Te
20a80 73 74 5f 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d  st_Vs2013.log]].
20a90 0a 0d 0a 20 20 20 20 20 20 20 20 23 23 23 23 23  ...        #####
20aa0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20ab0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20ac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20ad0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20ae0 23 23 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ##....        if
20af0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
20b00 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
20b10 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
20b20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
20b30 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
20b40 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  llFile]]]} then 
20b50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  {..          che
20b60 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
20b70 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74 79 46  channel $entityF
20b80 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65 0d  rameworkDllFile.
20b90 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
20ba0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
20bb0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
20bc0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
20be0 65 20 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65  e tail $installe
20bf0 72 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  rExeFile]]]} the
20c00 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
20c10 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
20c20 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73 74 61  t_channel $insta
20c30 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e 73 74  llerExeFile Inst
20c40 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20 20 20  aller.exe..     
20c50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20c60 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
20c70 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
20c80 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
20c90 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
20ca0 20 24 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72   $sqliteDesigner
20cb0 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  DllFile]]]} then
20cc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68   {..          ch
20cd0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
20ce0 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69 74 65  _channel $sqlite
20cf0 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 0d  DesignerDllFile.
20d00 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
20d10 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
20d20 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
20d30 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
20d40 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
20d50 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
20d60 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d  taSQLiteDllFile]
20d70 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
20d80 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
20d90 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
20da0 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
20db0 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20 20 20  teDllFile..     
20dc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20dd0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
20de0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
20df0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
20e00 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
20e10 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
20e20 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d  teLinqDllFile]]]
20e30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20e40 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
20e50 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
20e60 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
20e70 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  LinqDllFile..   
20e80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20e90 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
20ea0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
20eb0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
20ec0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
20ed0 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  il $systemDataSQ
20ee0 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d  LiteEf6DllFile]]
20ef0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
20f00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
20f10 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
20f20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  $systemDataSQLit
20f30 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  eEf6DllFile..   
20f40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20f50 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
20f60 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
20f70 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
20f80 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
20f90 69 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 5d  il $testExeFile]
20fa0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
20fb0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
20fc0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
20fd0 20 24 74 65 73 74 45 78 65 46 69 6c 65 20 74 65   $testExeFile te
20fe0 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20  st.exe..        
20ff0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
21000 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  {![haveConstrain
21010 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
21020 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le_ \..         
21030 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74     [file tail $t
21040 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d  estLinqExeFile]]
21050 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21060 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21070 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21080 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65  $testLinqExeFile
21090 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d 0a 20   testlinq.exe.. 
210a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
210b0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
210c0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
210d0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
210e0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
210f0 74 61 69 6c 20 24 74 65 73 74 45 66 36 45 78 65  tail $testEf6Exe
21100 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
21110 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
21120 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
21130 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36 45 78  annel $testEf6Ex
21140 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e 65 78  eFile testef6.ex
21150 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
21160 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
21170 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
21180 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
21190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
211a0 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69  ile tail $testLi
211b0 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68  nqOutFile]]]} th
211c0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
211d0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
211e0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74  st_channel $test
211f0 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20 20 20  LinqOutFile..   
21200 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21210 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21220 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21230 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21240 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21250 69 6c 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44  il $northwindEfD
21260 62 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  bFile]]]} then {
21270 0d 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  ..          chec
21280 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63  kForFile $test_c
21290 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77 69 6e  hannel $northwin
212a0 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20 20 20  dEfDbFile..     
212b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
212c0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
212d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
212e0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
212f0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
21300 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d   $nonWalDbFile]]
21310 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21320 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21330 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21340 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d 0a 20  $nonWalDbFile.. 
21350 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21360 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21370 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21380 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21390 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
213a0 74 61 69 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d  tail $walDbFile]
213b0 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ]]} then {..    
213c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
213d0 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
213e0 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20 20 20   $walDbFile..   
213f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21400 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21410 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21420 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21430 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21440 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
21450 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2005LogFile]]]}
21460 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21470 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
21480 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
21490 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 35  estInstallVs2005
214a0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
214b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
214c0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
214d0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
214e0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
214f0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
21500 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
21510 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  8LogFile]]]} the
21520 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21530 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21540 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
21550 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
21560 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
21570 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
21580 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
21590 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
215a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
215b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
215c0 49 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67  InstallVs2010Log
215d0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
215e0 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
215f0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
21600 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
21610 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 0d  llVs2010LogFile.
21620 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21630 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21640 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21650 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21660 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
21670 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
21680 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
21690 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
216a0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
216b0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
216c0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
216d0 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
216e0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
216f0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21700 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21710 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21720 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21730 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
21740 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2013LogFile]]]}
21750 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21760 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
21770 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
21780 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33  estInstallVs2013
21790 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
217a0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
217b0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
217c0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
217d0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
217e0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
217f0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
21800 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
21810 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21820 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21830 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21840 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35  tUninstallVs2005
21850 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
21860 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
21870 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
21880 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21890 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
218a0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
218b0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
218c0 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  008LogFile]]]} t
218d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
218e0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
218f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21900 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
21910 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
21920 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
21930 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
21940 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21950 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
21960 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
21970 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
21980 30 31 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  010LogFile]]]} t
21990 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
219a0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
219b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
219c0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30  tUninstallVs2010
219d0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
219e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
219f0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
21a00 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21a10 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
21a20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
21a30 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
21a40 30 31 32 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  012LogFile]]]} t
21a50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21a60 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21a70 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21a80 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
21a90 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
21aa0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
21ab0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
21ac0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21ad0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
21ae0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
21af0 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
21b00 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
21b10 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
21b20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
21b30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
21b40 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33  tUninstallVs2013
21b50 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
21b60 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
21b70 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
21b80 72 75 6e 53 51 4c 69 74 65 54 65 73 74 46 69 6c  runSQLiteTestFil
21b90 65 73 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d  esEpilogue {} {.
21ba0 0a 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31  .      uplevel 1
21bb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65   {..        unse
21bc0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
21bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
21be0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 33  tUninstallVs2013
21bf0 4c 6f 67 46 69 6c 65 20 74 65 73 74 55 6e 69 6e  LogFile testUnin
21c00 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
21c10 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
21c20 20 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56    testUninstallV
21c30 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 74 65 73  s2010LogFile tes
21c40 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
21c50 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
21c60 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73         testUnins
21c70 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
21c80 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  e testInstallVs2
21c90 30 31 33 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20  013LogFile \..  
21ca0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e            testIn
21cb0 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69  stallVs2012LogFi
21cc0 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  le testInstallVs
21cd0 32 30 31 30 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2010LogFile \.. 
21ce0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 49             testI
21cf0 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46  nstallVs2008LogF
21d00 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56  ile testInstallV
21d10 73 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a  s2005LogFile....
21d20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
21d30 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
21d40 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68 77 69           northwi
21d50 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73 74 4c  ndEfDbFile testL
21d60 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a 20 20  inqOutFile \..  
21d70 20 20 20 20 20 20 20 20 20 20 77 61 6c 44 62 46            walDbF
21d80 69 6c 65 20 6e 6f 6e 57 61 6c 44 62 46 69 6c 65  ile nonWalDbFile
21d90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
21da0 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
21db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
21dc0 74 45 66 36 45 78 65 46 69 6c 65 20 74 65 73 74  tEf6ExeFile test
21dd0 4c 69 6e 71 45 78 65 46 69 6c 65 20 5c 0d 0a 20  LinqExeFile \.. 
21de0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 45             testE
21df0 78 65 46 69 6c 65 20 73 79 73 74 65 6d 44 61 74  xeFile systemDat
21e00 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c  aSQLiteEf6DllFil
21e10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
21e20 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
21e30 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 20 73 79 73  eLinqDllFile sys
21e40 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
21e50 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
21e60 20 20 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e      sqliteDesign
21e70 65 72 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c  erDllFile instal
21e80 6c 65 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20  lerExeFile \..  
21e90 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79            entity
21ea0 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
21eb0 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
21ec0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 75  .....    proc ru
21ed0 6e 53 51 4c 69 74 65 54 65 73 74 45 70 69 6c 6f  nSQLiteTestEpilo
21ee0 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  gue {} {..      
21ef0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
21f00 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75   Skip running ou
21f10 72 20 63 75 73 74 6f 6d 20 65 70 69 6c 6f 67 75  r custom epilogu
21f20 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 6f 6e  e if the main on
21f30 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20  e has been..    
21f40 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
21f50 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
21f60 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
21f70 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69 6c 6f 67  ists ::no(epilog
21f80 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68 65 6e  ue.eagle)]} then
21f90 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
21fa0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
21fb0 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
21fc0 74 73 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 65  ts actually ende
21fd0 64 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  d (now)...      
21fe0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
21ff0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
22000 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
22010 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
22020 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
22030 53 51 4c 69 74 65 20 74 65 73 74 73 20 65 6e 64  SQLite tests end
22040 65 64 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  ed at " \..     
22050 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
22060 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
22070 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  nds]] \n]....   
22080 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22090 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
220a0 20 22 65 70 69 6c 6f 67 75 65 22 20 63 75 73 74   "epilogue" cust
220b0 6f 6d 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f  om per-user and/
220c0 6f 72 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74  or per-host test
220d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
220e0 20 20 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d    settings now..
220f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
22100 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c      uplevel 1 [l
22110 69 73 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65  ist loadSQLiteTe
22120 73 74 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65  stSettings $::te
22130 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 65 70 69 6c  st_channel .epil
22140 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ogue]....       
22150 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 42 55   #..        # BU
22160 47 46 49 58 3a 20 42 65 66 6f 72 65 20 63 68 65  GFIX: Before che
22170 63 6b 69 6e 67 20 74 68 65 20 66 69 6e 61 6c 20  cking the final 
22180 72 65 73 6f 75 72 63 65 73 20 69 6e 20 75 73 65  resources in use
22190 20 62 79 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65   by SQLite, make
221a0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
221b0 20 20 20 20 73 75 72 65 20 62 6f 74 68 20 6f 66      sure both of
221c0 20 74 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61   the PRAGMA rela
221d0 74 65 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61  ted directory na
221e0 6d 65 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a  mes are freed...
221f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22200 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
22210 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a  eDirectories $::
22220 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
22230 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
22240 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
22250 41 6c 73 6f 20 72 65 70 6f 72 74 20 74 68 65 20  Also report the 
22260 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 61  resource usage a
22270 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
22280 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
22290 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f   #..        repo
222a0 72 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65  rtSQLiteResource
222b0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
222c0 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
222d0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
222e0 52 65 70 6f 72 74 20 74 68 65 20 63 72 69 74 69  Report the criti
222f0 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74  cal handle count
22300 73 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20  s after running 
22310 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  the tests...    
22320 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 67      #..        g
22330 65 74 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f  etSQLiteHandleCo
22340 75 6e 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  unts $::test_cha
22350 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
22360 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
22370 45 3a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c  E: If necessary,
22380 20 64 69 73 61 62 6c 65 20 73 68 61 72 65 64 2d   disable shared-
22390 63 61 63 68 65 20 6d 6f 64 65 20 6e 6f 77 2e 0d  cache mode now..
223a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
223b0 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
223c0 69 6d 65 4f 70 74 69 6f 6e 20 73 68 61 72 65 64  imeOption shared
223d0 43 61 63 68 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Cache]} then {..
223e0 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65            enable
223f0 53 68 61 72 65 64 43 61 63 68 65 20 24 3a 3a 74  SharedCache $::t
22400 65 73 74 5f 63 68 61 6e 6e 65 6c 20 66 61 6c 73  est_channel fals
22410 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
22420 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
22430 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
22440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22480 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
22490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
224a0 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e  ### END Eagle ON
224b0 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
224c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
224d0 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
224e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
224f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22500 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22510 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22520 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ##..  }....  #..
22530 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
22540 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
22550 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
22560 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a  ing this file...
22570 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66    #..  if {![inf
22580 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f  o exists common_
22590 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
225a0 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   {..    set comm
225b0 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69  on_directory [fi
225c0 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
225d0 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a   script]]..  }..
225e0 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
225f0 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73   Provide the Sys
22600 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
22610 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20  test package to 
22620 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
22630 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65  ..  #..  package
22640 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e   provide System.
22650 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74  Data.SQLite.Test
22660 20 31 2e 30 0d 0a 7d 0d 0a                        1.0..}..