System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 73f127713c0116522b0fad8b32652e9915aa1d91:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 20 28 69 2e 65 2e  test years (i.e.
1170: 20 61 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20 20   all)...        
1180: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
1190: 6e 20 5b 6c 69 73 74 20 32 30 30 35 20 32 30 30  n [list 2005 200
11a0: 38 20 32 30 31 30 20 32 30 31 32 20 32 30 31 33  8 2010 2012 2013
11b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
11c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
11d0: 65 74 42 75 69 6c 64 4e 65 74 46 78 20 7b 7d 20  etBuildNetFx {} 
11e0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
11f0: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
1200: 20 74 68 65 20 74 65 73 74 20 2e 4e 45 54 20 46   the test .NET F
1210: 72 61 6d 65 77 6f 72 6b 20 73 65 74 74 69 6e 67  ramework setting
1220: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69   has been overri
1230: 64 64 65 6e 20 62 79 0d 0a 20 20 20 20 20 20 23  dden by..      #
1240: 20 20 20 20 20 20 20 74 68 65 20 75 73 65 72 20         the user 
1250: 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d  (e.g. on the com
1260: 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20  mand line)...   
1270: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1280: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
1290: 65 73 74 5f 6e 65 74 5f 66 78 5d 20 26 26 20 5c  est_net_fx] && \
12a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
12b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
12c0: 73 74 5f 6e 65 74 5f 66 78 5d 20 3e 20 30 7d 20  st_net_fx] > 0} 
12d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12f0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1300: 66 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46  fied test .NET F
1310: 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
1320: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1330: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 65 74  turn $::test_net
1340: 5f 66 78 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  _fx..      } els
1350: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  e {..        set
1360: 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c 64 59   year [getBuildY
1370: 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ear]....        
1380: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
1390: 20 24 79 65 61 72 20 7b 0d 0a 20 20 20 20 20 20   $year {..      
13a0: 20 20 20 20 32 30 30 35 20 7b 0d 0a 20 20 20 20      2005 {..    
13b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
13c0: 65 74 46 78 32 30 0d 0a 20 20 20 20 20 20 20 20  etFx20..        
13d0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
13e0: 30 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  008 {..         
13f0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
1400: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1410: 20 20 20 20 20 20 20 20 20 20 32 30 31 30 20 7b            2010 {
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1430: 74 75 72 6e 20 6e 65 74 46 78 34 30 0d 0a 20 20  turn netFx40..  
1440: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1450: 20 20 20 20 20 32 30 31 32 20 7b 0d 0a 20 20 20       2012 {..   
1460: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1470: 6e 65 74 46 78 34 35 0d 0a 20 20 20 20 20 20 20  netFx45..       
1480: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1490: 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20 20  2013 {..        
14a0: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
14b0: 34 35 31 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  451..          }
14c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 66 61  ..          defa
14d0: 75 6c 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ult {..         
14e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 33     return netFx3
14f0: 35 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20  5; # TODO: Good 
1500: 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75  "fallback" defau
1510: 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lt?..          }
1520: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
1530: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
1540: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
1550: 64 50 6c 61 74 66 6f 72 6d 20 7b 20 6e 61 74 69  dPlatform { nati
1560: 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ve } {..      if
1570: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
1580: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20  :test_platform] 
1590: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
15a0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
15b0: 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 5d  ::test_platform]
15c0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
15d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15e0: 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65   # NOTE: Use the
15f0: 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20   specified test 
1600: 70 6c 61 74 66 6f 72 6d 2e 20 20 49 66 20 74 68  platform.  If th
1610: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e  is variable is n
1620: 6f 74 20 73 65 74 2c 0d 0a 20 20 20 20 20 20 20  ot set,..       
1630: 20 23 20 20 20 20 20 20 20 74 68 65 20 64 65 66   #       the def
1640: 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20  ault value will 
1650: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
1660: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1670: 74 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ture...        #
1680: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1690: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
16a0: 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  ? $::test_platfo
16b0: 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20  rm : ""}]..     
16c0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
16d0: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d   exists ::test_m
16e0: 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20  achine] && \..  
16f0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
1700: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d  length $::test_m
1710: 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65  achine] > 0} the
1720: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1730: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1740: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
1750: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
1760: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
1770: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
1780: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1790: 65 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61  e test machine a
17a0: 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68  rchitecture; oth
17b0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
17c0: 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  n empty..       
17d0: 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e   #       string.
17e0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17f0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1800: 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 24  r {..          $
1810: 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e  native ? [machin
1820: 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74  eToPlatform $::t
1830: 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22  est_machine] : "
1840: 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20  "..        }].. 
1850: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
1860: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
1870: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
1880: 6e 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ne)]} then {..  
1890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18a0: 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74   # NOTE: For nat
18b0: 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75  ive builds, retu
18c0: 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  rn the platform 
18d0: 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  name correspondi
18e0: 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23  ng to..        #
18f0: 20 20 20 20 20 20 20 74 68 65 20 6d 61 63 68 69         the machi
1900: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 3b  ne architecture;
1910: 20 6f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   otherwise, retu
1920: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
1930: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ng...        #..
1940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1950: 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20  expr {..        
1960: 20 20 24 6e 61 74 69 76 65 20 3f 20 5b 6d 61 63    $native ? [mac
1970: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
1980: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
1990: 61 63 68 69 6e 65 29 5d 20 3a 20 22 22 0d 0a 20  achine)] : "".. 
19a0: 20 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20         }]..     
19b0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19d0: 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65  NOTE: No machine
19e0: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 69 73   architecture is
19f0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
1a00: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
1a10: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ng...        #  
1a20: 20 20 20 20 20 49 74 20 69 73 20 69 6d 70 6f 72       It is impor
1a30: 74 61 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 61  tant to return a
1a40: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 68  n empty string h
1a50: 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65 0d  ere because the.
1a60: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1a70: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
1a80: 70 72 6f 63 65 64 75 72 65 20 6d 61 79 20 62 65  procedure may be
1a90: 20 75 73 65 64 20 77 69 74 68 20 5b 66 69 6c 65   used with [file
1aa0: 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20 20 20 20   join]...       
1ab0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
1ac0: 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn ""..      }..
1ad0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1ae0: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
1af0: 67 75 72 61 74 69 6f 6e 20 7b 7d 20 7b 0d 0a 20  guration {} {.. 
1b00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1b10: 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65  NOTE: See if the
1b20: 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22   "configuration"
1b30: 20 73 65 74 74 69 6e 67 20 68 61 73 20 62 65 65   setting has bee
1b40: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20  n overridden by 
1b50: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1b60: 20 20 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e     user (e.g. on
1b70: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b80: 65 29 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  e).  This helps 
1b90: 63 6f 6e 74 72 6f 6c 20 65 78 61 63 74 6c 79 0d  control exactly.
1ba0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
1bb0: 68 69 63 68 20 73 65 74 20 6f 66 20 62 69 6e 61  hich set of bina
1bc0: 72 69 65 73 20 77 65 20 61 72 65 20 74 65 73 74  ries we are test
1bd0: 69 6e 67 20 28 69 2e 65 2e 20 74 68 6f 73 65 20  ing (i.e. those 
1be0: 62 75 69 6c 74 20 69 6e 20 74 68 65 0d 0a 20 20  built in the..  
1bf0: 20 20 20 20 23 20 20 20 20 20 20 20 22 44 65 62      #       "Deb
1c00: 75 67 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22  ug" or "Release"
1c10: 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61   build configura
1c20: 74 69 6f 6e 73 29 2e 20 20 54 6f 20 6f 76 65 72  tions).  To over
1c30: 72 69 64 65 20 74 68 69 73 0d 0a 20 20 20 20 20  ride this..     
1c40: 20 23 20 20 20 20 20 20 20 76 61 6c 75 65 20 76   #       value v
1c50: 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  ia the command l
1c60: 69 6e 65 2c 20 65 6e 74 65 72 20 61 20 63 6f 6d  ine, enter a com
1c70: 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f 20  mand similar to 
1c80: 6f 6e 65 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  one of..      # 
1c90: 20 20 20 20 20 20 74 68 65 20 66 6f 6c 6c 6f 77        the follow
1ca0: 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20  ing (all on one 
1cb0: 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d  line):..      #.
1cc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1cd0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
1ce0: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
1cf0: 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  t test_configura
1d00: 74 69 6f 6e 20 44 65 62 75 67 22 0d 0a 20 20 20  tion Debug"..   
1d10: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
1d20: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
1d30: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
1d40: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
1d50: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
1d60: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
1d70: 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  t test_configura
1d80: 74 69 6f 6e 20 52 65 6c 65 61 73 65 22 0d 0a 20  tion Release".. 
1d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
1da0: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
1db0: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
1dc0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
1dd0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
1de0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
1df0: 61 6c 6c 2e 65 61 67 6c 65 20 2d 70 72 65 54 65  all.eagle -preTe
1e00: 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
1e10: 20 20 20 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f      "unset -noco
1e20: 6d 70 6c 61 69 6e 20 74 65 73 74 5f 63 6f 6e 66  mplain test_conf
1e30: 69 67 75 72 61 74 69 6f 6e 22 0d 0a 20 20 20 20  iguration"..    
1e40: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1e50: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1e60: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1e70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1e80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
1e90: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
1ea0: 72 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65  ration] > 0} the
1eb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1ec0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1ed0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
1ee0: 64 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61  d test configura
1ef0: 74 69 6f 6e 2e 20 20 54 68 65 20 64 65 66 61 75  tion.  The defau
1f00: 6c 74 20 76 61 6c 75 65 20 75 73 65 64 0d 0a 20  lt value used.. 
1f10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66         #       f
1f20: 6f 72 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  or this variable
1f30: 20 69 73 20 74 79 70 69 63 61 6c 6c 79 20 22 52   is typically "R
1f40: 65 6c 65 61 73 65 22 2c 20 61 73 20 73 65 74 20  elease", as set 
1f50: 62 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20  by the test..   
1f60: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69       #       sui
1f70: 74 65 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20  te itself...    
1f80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1f90: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f  eturn $::test_co
1fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20  nfiguration..   
1fb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1fc0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fd0: 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d 61 6c 6c 79  # NOTE: Normally
1fe0: 2c 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  , we will never 
1ff0: 68 69 74 20 74 68 69 73 20 63 61 73 65 20 62 65  hit this case be
2000: 63 61 75 73 65 20 74 68 65 20 76 61 6c 75 65 20  cause the value 
2010: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  of the..        
2020: 23 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e  #       test con
2030: 66 69 67 75 72 61 74 69 6f 6e 20 76 61 72 69 61  figuration varia
2040: 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 73 65  ble is always se
2050: 74 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  t by the test su
2060: 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ite..        #  
2070: 20 20 20 20 20 69 74 73 65 6c 66 3b 20 68 6f 77       itself; how
2080: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 62 65 20  ever, it can be 
2090: 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67  overridden using
20a0: 20 74 68 65 20 75 6e 73 65 74 20 63 6f 6d 6d 61   the unset comma
20b0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
20c0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 2d 70 72      from the -pr
20d0: 65 54 65 73 74 20 6f 70 74 69 6f 6e 20 74 6f 20  eTest option to 
20e0: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
20f0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2100: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 65 61      return $::ea
2110: 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 63 6f 6e  gle_platform(con
2120: 66 69 67 75 72 61 74 69 6f 6e 29 0d 0a 20 20 20  figuration)..   
2130: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
2140: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
2150: 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20  dConfigurations 
2160: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
2170: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
2180: 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   if the list of 
2190: 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69  test configurati
21a0: 6f 6e 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ons has been ove
21b0: 72 72 69 64 64 65 6e 20 62 79 0d 0a 20 20 20 20  rridden by..    
21c0: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 73    #       the us
21d0: 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20  er (e.g. on the 
21e0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a  command line)...
21f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
2200: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2210: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
2220: 74 69 6f 6e 73 5d 20 26 26 20 5c 0d 0a 20 20 20  tions] && \..   
2230: 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20         [llength 
2240: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
2250: 61 74 69 6f 6e 73 5d 20 3e 20 30 7d 20 74 68 65  ations] > 0} the
2260: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2280: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
2290: 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  d list of test c
22a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a  onfigurations...
22b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22c0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
22d0: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
22e0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
22f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2300: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
2310: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73   the default lis
2320: 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67  t of test config
2330: 75 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20  urations...     
2340: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
2350: 74 75 72 6e 20 5b 6c 69 73 74 20 44 65 62 75 67  turn [list Debug
2360: 20 52 65 6c 65 61 73 65 5d 0d 0a 20 20 20 20 20   Release]..     
2370: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
2380: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42    proc getBuildB
2390: 61 73 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  aseDirectory {} 
23a0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
23b0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
23c0: 20 6f 75 74 20 74 68 65 20 62 61 73 65 20 64 69   out the base di
23d0: 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c  rectory where al
23e0: 6c 20 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f  l the builds sho
23f0: 75 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20  uld be..      # 
2400: 20 20 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20        located.  
2410: 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
2420: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
2430: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74  contains the act
2440: 75 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ual..      #    
2450: 20 20 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20     build output 
2460: 64 69 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20  directory (e.g. 
2470: 70 61 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29  parent of "bin")
2480: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
2490: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
24a0: 74 73 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f  ts ::build_base_
24b0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
24c0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
24d0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69  ng length $::bui
24e0: 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72  ld_base_director
24f0: 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  y] > 0} then {..
2500: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2510: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c     # NOTE: The l
2520: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62  ocation of the b
2530: 75 69 6c 64 20 62 61 73 65 20 64 69 72 65 63 74  uild base direct
2540: 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ory has been ove
2550: 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20  rridden;..      
2560: 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66    #       theref
2570: 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72 62  ore, use it verb
2580: 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23  atim...        #
2590: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
25a0: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
25b0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
25c0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
25d0: 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f  exists ::common_
25e0: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
25f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
2600: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d  ng length $::com
2610: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  mon_directory] >
2620: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2630: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2640: 20 4e 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c   NOTE: Next, fal
2650: 6c 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72  lback to the par
2660: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66  ent directory of
2670: 20 74 68 65 20 6f 6e 65 20 63 6f 6e 74 61 69 6e   the one contain
2680: 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ing..        #  
2690: 20 20 20 20 20 74 68 69 73 20 66 69 6c 65 20 28       this file (
26a0: 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67  i.e. "common.eag
26b0: 6c 65 22 29 2c 20 69 66 20 61 76 61 69 6c 61 62  le"), if availab
26c0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
26d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
26e0: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a  file dirname $::
26f0: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
2700: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  ]..      } elsei
2710: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2720: 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a 20 20  ::path] && \..  
2730: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2740: 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74 68 5d 20  length $::path] 
2750: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2760: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2770: 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c 79 2c  # NOTE: Finally,
2780: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68 65   fallback to the
2790: 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
27a0: 79 20 6f 66 20 74 68 65 20 45 61 67 6c 65 54 65  y of the EagleTe
27b0: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
27c0: 20 20 20 20 70 61 74 68 2e 20 20 54 68 65 20 45      path.  The E
27d0: 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61 67 65  agleTest package
27e0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
27f0: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 0d 0a   this variable..
2800: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2810: 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
2820: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
2830: 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 72 73  taining the firs
2840: 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20 20 20  t file to..     
2850: 20 20 20 23 20 20 20 20 20 20 20 65 78 65 63 75     #       execu
2860: 74 65 20 74 68 65 20 5b 72 75 6e 54 65 73 74 50  te the [runTestP
2870: 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70 74 20  rologue] script 
2880: 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75 72  library procedur
2890: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
28a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
28b0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a 3a 70  ile dirname $::p
28c0: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ath]..      } el
28d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
28e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28f0: 20 4e 6f 20 70 61 74 68 20 69 73 20 61 76 61 69   No path is avai
2900: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e  lable, return an
2910: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
2920: 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20 20 20  This point..    
2930: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
2940: 6c 64 20 6e 6f 74 20 62 65 20 72 65 61 63 68 65  ld not be reache
2950: 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
2960: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22         return ""
2970: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2980: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
2990: 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c  MixedModeAssembl
29a0: 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 76 61  y { fileName {va
29b0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
29c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
29d0: 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 6d 61 6b  NOTE: First, mak
29e0: 65 20 73 75 72 65 20 74 68 65 20 74 65 73 74 20  e sure the test 
29f0: 73 75 69 74 65 20 69 6e 66 72 61 73 74 72 75 63  suite infrastruc
2a00: 74 75 72 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ture is allowed 
2a10: 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  to..      #     
2a20: 20 20 75 73 65 20 74 68 65 20 5b 65 78 65 63 5d    use the [exec]
2a30: 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20 20 20 20 20   command...     
2a40: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
2a50: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2a60: 28 65 78 65 63 29 5d 20 26 26 20 21 5b 69 6e 66  (exec)] && ![inf
2a70: 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
2a80: 72 46 6c 61 67 73 29 5d 7d 20 74 68 65 6e 20 7b  rFlags)]} then {
2a90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2aa0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
2ab0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  the location of 
2ac0: 43 6f 72 46 6c 61 67 73 20 69 73 20 70 72 65 73  CorFlags is pres
2ad0: 65 6e 74 20 69 6e 20 74 68 65 20 65 6e 76 69 72  ent in the envir
2ae0: 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20 20 20 20 20  onment,..       
2af0: 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 3b   #       use it;
2b00: 20 6f 74 68 65 72 77 69 73 65 20 61 73 73 75 6d   otherwise assum
2b10: 65 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 50  e it is in the P
2b20: 41 54 48 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ATH...        #.
2b30: 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 72  .        set cor
2b40: 46 6c 61 67 73 20 5b 65 78 70 72 20 7b 0d 0a 20  Flags [expr {.. 
2b50: 20 20 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65           [info e
2b60: 78 69 73 74 73 20 3a 3a 65 6e 76 28 43 6f 72 46  xists ::env(CorF
2b70: 6c 61 67 73 29 5d 20 3f 20 24 3a 3a 65 6e 76 28  lags)] ? $::env(
2b80: 43 6f 72 46 6c 61 67 73 29 20 3a 20 22 43 6f 72  CorFlags) : "Cor
2b90: 46 6c 61 67 73 22 0d 0a 20 20 20 20 20 20 20 20  Flags"..        
2ba0: 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  }]....        #.
2bb0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2bc0: 20 41 74 74 65 6d 70 74 20 74 6f 20 65 78 65 63   Attempt to exec
2bd0: 75 74 65 20 43 6f 72 46 6c 61 67 73 20 6f 6e 20  ute CorFlags on 
2be0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2bf0: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  le...        #..
2c00: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
2c10: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2c20: 65 78 65 63 20 2d 2d 20 24 63 6f 72 46 6c 61 67  exec -- $corFlag
2c30: 73 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  s [file nativena
2c40: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  me $fileName].. 
2c50: 20 20 20 20 20 20 20 7d 20 65 78 65 63 5d 20 3d         } exec] =
2c60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
2c70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 72      # NOTE: If r
2c90: 65 71 75 65 73 74 65 64 20 62 79 20 6f 75 72 20  equested by our 
2ca0: 63 61 6c 6c 65 72 2c 20 61 74 74 65 6d 70 74 20  caller, attempt 
2cb0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
2cd0: 20 20 20 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72      platform for
2ce0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
2cf0: 69 6c 65 20 61 73 20 77 65 6c 6c 2e 0d 0a 20 20  ile as well...  
2d00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2d10: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
2d20: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
2d30: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2d40: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2d50: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2d60: 3a 20 53 74 6f 72 65 20 74 68 65 20 70 6c 61 74  : Store the plat
2d70: 66 6f 72 6d 20 69 6e 20 74 68 65 20 6e 61 6d 65  form in the name
2d80: 64 20 76 61 72 69 61 62 6c 65 20 69 6e 20 74 68  d variable in th
2d90: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
2da0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20 6f         context o
2db0: 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  f our caller... 
2dc0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2dd0: 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20            upvar 
2de0: 31 20 24 76 61 72 4e 61 6d 65 20 70 6c 61 74 66  1 $varName platf
2df0: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  orm....         
2e00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2e10: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
2e20: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
2e30: 20 50 45 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68   PE line from th
2e40: 65 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20  e captured..    
2e50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2e60: 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68 69 73  output.  If this
2e70: 20 76 61 6c 75 65 20 69 73 20 22 50 45 33 32 22   value is "PE32"
2e80: 20 6f 72 20 22 50 45 33 32 2b 22 2c 20 74 68 65   or "PE32+", the
2e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2ea0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 66        assembly f
2eb0: 69 6c 65 20 69 73 20 33 32 2d 62 69 74 20 6f 72  ile is 32-bit or
2ec0: 20 36 34 2d 62 69 74 2c 20 72 65 73 70 65 63 74   64-bit, respect
2ed0: 69 76 65 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20  ively;..        
2ee0: 20 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65      #       othe
2ef0: 72 77 69 73 65 2c 20 69 74 73 20 74 79 70 65 20  rwise, its type 
2f00: 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d 0a 20 20 20  is unknown...   
2f10: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
2f20: 20 20 20 20 20 20 20 20 73 65 74 20 70 61 74 74          set patt
2f30: 65 72 6e 20 7b 5e 50 45 20 20 20 20 20 20 20 20  ern {^PE        
2f40: 3a 20 28 50 45 33 32 7c 50 45 33 32 5c 2b 29 5c  : (PE32|PE32\+)\
2f50: 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s+$}....        
2f60: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
2f70: 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65 72  -line -- $patter
2f80: 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 70 65  n $exec dummy pe
2f90: 33 32 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  32]} then {..   
2fa0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 48 41              # HA
2fc0: 43 4b 3a 20 54 68 69 73 20 5b 73 77 69 74 63 68  CK: This [switch
2fd0: 5d 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 33  ] assumes that 3
2fe0: 32 2d 62 69 74 20 65 78 65 63 75 74 61 62 6c 65  2-bit executable
2ff0: 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
3000: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6c 77       #       alw
3010: 61 79 73 20 78 38 36 20 61 6e 64 20 74 68 61 74  ays x86 and that
3020: 20 36 34 2d 62 69 74 20 65 78 65 63 75 74 61 62   64-bit executab
3030: 6c 65 73 20 61 72 65 20 61 6c 77 61 79 73 0d 0a  les are always..
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
3050: 20 20 20 20 20 20 78 36 34 2e 0d 0a 20 20 20 20        x64...    
3060: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
3070: 20 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63             switc
3080: 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 70 65 33  h -exact -- $pe3
3090: 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2 {..           
30a0: 20 20 20 20 20 50 45 33 32 20 7b 0d 0a 20 20 20       PE32 {..   
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30c0: 65 74 20 70 6c 61 74 66 6f 72 6d 20 57 69 6e 33  et platform Win3
30d0: 32 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2..             
30e0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
30f0: 20 20 20 20 20 20 50 45 33 32 2b 20 7b 0d 0a 20        PE32+ {.. 
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 78 36   set platform x6
3120: 34 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4..             
3130: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
3140: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
3150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3160: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
3170: 22 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ""..            
3180: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3190: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
31a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
31c0: 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20 20  platform ""..   
31d0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
31e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
31f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3200: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
3210: 74 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  t to extract the
3220: 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65 20 66 72 6f   ILONLY line fro
3230: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
3240: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
3250: 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68    output.  If th
3260: 69 73 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  is value is zero
3270: 2c 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  , the specified 
3280: 66 69 6c 65 20 6d 75 73 74 0d 0a 20 20 20 20 20  file must..     
3290: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
32a0: 61 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  a mixed-mode ass
32b0: 65 6d 62 6c 79 3b 20 6f 74 68 65 72 77 69 73 65  embly; otherwise
32c0: 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  , it contains on
32d0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
32e0: 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 63 6f        managed co
32f0: 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20 20 20 20 20  mponents...     
3300: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
3310: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
3320: 49 4c 4f 4e 4c 59 20 20 20 20 3a 20 28 30 7c 31  ILONLY    : (0|1
3330: 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20 20 20  )\s+$}....      
3340: 20 20 20 20 69 66 20 7b 21 5b 72 65 67 65 78 70      if {![regexp
3350: 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61 74 74 65   -line -- $patte
3360: 72 6e 20 24 65 78 65 63 20 64 75 6d 6d 79 20 69  rn $exec dummy i
3370: 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  lOnly]} then {..
3380: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3390: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
33a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
33b0: 20 20 20 69 66 20 7b 21 24 69 6c 4f 6e 6c 79 7d     if {!$ilOnly}
33c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
33d0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
33e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
33f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3400: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
3410: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
3420: 68 65 20 74 65 73 74 20 73 75 69 74 65 20 63 61  he test suite ca
3430: 6e 6e 6f 74 20 75 73 65 20 5b 65 78 65 63 5d 20  nnot use [exec] 
3440: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  or execution of 
3450: 43 6f 72 46 6c 61 67 73 0d 0a 20 20 20 20 20 20  CorFlags..      
3460: 23 20 20 20 20 20 20 20 66 61 69 6c 65 64 2c 20  #       failed, 
3470: 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0d 0a 20  return false... 
3480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
3490: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
34a0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69  }.....    proc i
34b0: 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
34c0: 7b 20 6e 61 74 69 76 65 20 64 69 72 65 63 74 6f  { native directo
34d0: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
34e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
34f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
3500: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
3510: 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20  ified file name 
3520: 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
3530: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
3540: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69  #       containi
3550: 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  ng the System.Da
3560: 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65  ta.SQLite manage
3570: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20 49  d components.  I
3580: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
3590: 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64   should be noted
35a0: 20 74 68 61 74 20 74 68 69 73 20 61 73 73 65 6d   that this assem
35b0: 62 6c 79 20 66 69 6c 65 20 6d 61 79 20 61 6c 73  bly file may als
35c0: 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 0d 0a 20  o contain the.. 
35d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
35e0: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20  ive components, 
35f0: 69 66 20 61 20 6e 61 74 69 76 65 20 62 75 69 6c  if a native buil
3600: 64 20 69 73 20 69 6e 20 75 73 65 2e 0d 0a 20 20  d is in use...  
3610: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
3620: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3630: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
3640: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
3650: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 79   \..          Sy
3660: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
3670: 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .dll]]....      
3680: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
3690: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
36a0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
36b0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
36c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
36d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
36e0: 74 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74  tempt to automat
36f0: 69 63 61 6c 6c 79 20 64 65 74 65 63 74 20 69 66  ically detect if
3700: 20 74 68 65 20 70 72 69 6d 61 72 79 20 61 73 73   the primary ass
3710: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 23 20 20  embly..      #  
3720: 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e       contains an
3730: 79 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  y native compone
3740: 6e 74 73 2c 20 69 66 20 6e 65 63 65 73 73 61 72  nts, if necessar
3750: 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
3760: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3770: 65 6e 67 74 68 20 24 6e 61 74 69 76 65 5d 20 3d  ength $native] =
3780: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
3790: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
37a0: 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
37b0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
37c0: 20 20 20 20 20 20 20 20 20 75 70 76 61 72 20 31           upvar 1
37d0: 20 24 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61   $varName $varNa
37e0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  me..        }...
37f0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 74  .        set nat
3800: 69 76 65 20 5b 69 73 4d 69 78 65 64 4d 6f 64 65  ive [isMixedMode
3810: 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
3820: 6d 65 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20  me $varName]..  
3830: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
3840: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3850: 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 61  If the primary a
3860: 73 73 65 6d 62 6c 79 20 61 6c 73 6f 20 63 6f 6e  ssembly also con
3870: 74 61 69 6e 73 20 74 68 65 20 6e 61 74 69 76 65  tains the native
3880: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 0d 0a 20 20   components,..  
3890: 20 20 20 20 23 20 20 20 20 20 20 20 77 65 20 68      #       we h
38a0: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
38b0: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
38c0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74  ..      if {$nat
38d0: 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ive} then {..   
38e0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
38f0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3900: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3910: 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
3920: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69  lly qualified fi
3930: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le name for the 
3940: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
3950: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3960: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53  containing the S
3970: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
3980: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
3990: 6e 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20  nts.  If this.. 
39a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
39b0: 65 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f  e exists, we sho
39c0: 75 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68  uld have everyth
39d0: 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20  ing we need...  
39e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
39f0: 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20   fileName [file 
3a00: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
3a10: 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79   join $directory
3a20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 53 51   \..          SQ
3a30: 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
3a40: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  ]]....      if {
3a50: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
3a60: 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
3a70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3a80: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
3a90: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3aa0: 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68  # NOTE: Build th
3ab0: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
3ac0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20  d file name for 
3ad0: 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d  the SQLite core.
3ae0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c  .      #       l
3af0: 69 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73  ibrary.  If this
3b00: 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65   file exists, we
3b10: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65   should have eve
3b20: 72 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20  rything we..    
3b30: 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d    #       need..
3b40: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3b50: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
3b60: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
3b70: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
3b80: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
3b90: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
3ba0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
3bb0: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
3bc0: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
3bd0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
3be0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
3bf0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3c00: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
3c10: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
3c20: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
3c30: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
3c40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
3c50: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
3c60: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
3c70: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
3c80: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
3c90: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
3ca0: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
3cb0: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
3cc0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
3cd0: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
3ce0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
3cf0: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
3d00: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
3d10: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3d20: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
3d30: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69  Available "" $di
3d40: 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65  rectory $varName
3d50: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
3d60: 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44   proc joinBuildD
3d70: 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76  irectory { nativ
3d80: 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74  e path year plat
3d90: 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69  form configurati
3da0: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
3db0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
3dc0: 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68  igure out and th
3dd0: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75  en return the fu
3de0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61  lly qualified pa
3df0: 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d  th to the build.
3e00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
3e10: 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f  irectory based o
3e20: 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65  n all the argume
3e30: 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  nts provided by 
3e40: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
3e50: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3e60: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
3e70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3e80: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
3e90: 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74   bin $year $plat
3ea0: 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74  form $configurat
3eb0: 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ion]..      } el
3ec0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
3ed0: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
3ee0: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
3ef0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62  $configuration b
3f00: 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  in]..      }..  
3f10: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
3f20: 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f   getBuildDirecto
3f30: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
3f40: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
3f50: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
3f60: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
3f70: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
3f80: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
3f90: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3fa0: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
3fb0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
3fc0: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
3fd0: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
3fe0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3ff0: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
4000: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
4010: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4020: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
4030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
4040: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
4050: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
4060: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
4070: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
4080: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
4090: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
40a0: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
40b0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
40c0: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
40d0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
40e0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
40f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4100: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
4110: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
4120: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
4130: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
4140: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
4150: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
4160: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
4170: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
4180: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
4190: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
41a0: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
41b0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
41c0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
41d0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
41e0: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
41f0: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
4200: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
4210: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
4220: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
4230: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
4240: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
4250: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
4260: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
4270: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
4280: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
4290: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
42a0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
42b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
42c0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
42d0: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
42e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
42f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4300: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
4310: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
4320: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
4330: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
4340: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4350: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4360: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
4370: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4380: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
4390: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
43a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
43b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
43c0: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
43d0: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
43e0: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
43f0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4400: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
4410: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
4420: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
4430: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
4440: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
4450: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
4460: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
4470: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
4480: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
4490: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
44a0: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
44b0: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
44c0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
44d0: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
44e0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
44f0: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
4500: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
4510: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
4520: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
4530: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
4540: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
4550: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
4560: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
4570: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
4580: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
4590: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
45a0: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
45b0: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
45c0: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
45d0: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
45e0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
45f0: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
4600: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
4610: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
4620: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
4630: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4640: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
4650: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
4660: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
4670: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
4680: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4690: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
46a0: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
46b0: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
46c0: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
46d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
46e0: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
46f0: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
4700: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
4710: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
4720: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4730: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
4740: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4750: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
4760: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
4770: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
4780: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
4790: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
47a0: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
47b0: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
47c0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
47d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
47e0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
47f0: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
4800: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
4810: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4820: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
4830: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
4840: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
4850: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
4860: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4870: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
4880: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
4890: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
48a0: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
48b0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
48c0: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
48d0: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
48e0: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
48f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4900: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
4910: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
4920: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
4930: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
4940: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
4950: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4960: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
4970: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
4980: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
49a0: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
49b0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
49c0: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
49d0: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
49e0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
49f0: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
4a00: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
4a10: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
4a20: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
4a30: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
4a40: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
4a50: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
4a60: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
4a70: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
4a80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4a90: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
4aa0: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
4ab0: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
4ac0: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
4ad0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4ae0: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
4af0: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
4b00: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
4b10: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
4b20: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
4b30: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
4b40: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
4b50: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
4b60: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
4b70: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
4b80: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
4b90: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
4ba0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4bb0: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
4bc0: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
4bd0: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
4be0: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
4bf0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4c00: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
4c10: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
4c20: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
4c30: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
4c40: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4c50: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
4c60: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
4c70: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
4c80: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
4c90: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
4ca0: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
4cb0: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
4cc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4cd0: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73   set native [has
4ce0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
4cf0: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
4d00: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69   return [joinBui
4d10: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
4d20: 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73  ive [getBuildBas
4d30: 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  eDirectory] \.. 
4d40: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
4d50: 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75  uildYear] [getBu
4d60: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
4d70: 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f  ive] [getBuildCo
4d80: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20  nfiguration]].. 
4d90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4da0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
4db0: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
4dc0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
4dd0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
4de0: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
4df0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
4e00: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
4e10: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
4e20: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
4e30: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
4e40: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
4e50: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
4e60: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
4e70: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
4e80: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
4e90: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
4ea0: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
4eb0: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
4ec0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4ed0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
4ee0: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
4ef0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
4f00: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
4f10: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
4f20: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
4f30: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
4f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4f50: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
4f60: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
4f70: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
4f80: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
4f90: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
4fa0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
4fb0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
4fc0: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
4fd0: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
4fe0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
4ff0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
5000: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
5010: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5020: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
5030: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
5040: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
5050: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
5060: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5070: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
5080: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
5090: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
50a0: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
50b0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
50c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
50d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
50e0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
50f0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5100: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5110: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5120: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
5130: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
5140: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
5150: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
5160: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
5170: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
5180: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
5190: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
51a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
51b0: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61   return [file na
51c0: 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20  tivename \..    
51d0: 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e        [file join
51e0: 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63 74   [getBuildDirect
51f0: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b  ory] $platform [
5200: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
5210: 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ame]]]..    }...
5220: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78  ..    proc getEx
5230: 74 65 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20  ternalDirectory 
5240: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
5250: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
5260: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
5270: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
5280: 79 20 77 68 65 72 65 20 74 68 65 20 65 78 74 65  y where the exte
5290: 72 6e 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20  rnal binary..   
52a0: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
52b0: 20 61 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20   are located... 
52c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
52d0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
52e0: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e  ename [file dirn
52f0: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
5300: 65 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d  e [info binary]]
5310: 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ]]..    }.....  
5320: 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79    proc getBinary
5330: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
5340: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
5350: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
5360: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
5370: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
5380: 65 20 74 68 65 20 74 65 73 74 20 61 70 70 6c 69  e the test appli
5390: 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  cation..      # 
53a0: 20 20 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e        itself (i.
53b0: 65 2e 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  e. the Eagle she
53c0: 6c 6c 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20  ll) is located. 
53d0: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73   This will be us
53e0: 65 64 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20  ed as..      #  
53f0: 20 20 20 20 20 74 68 65 20 64 65 73 74 69 6e 61       the destina
5400: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70  tion for the cop
5410: 69 65 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ied System.Data.
5420: 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e  SQLite native an
5430: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
5440: 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
5450: 69 65 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73  ies (i.e. becaus
5460: 65 20 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66  e this is one of
5470: 20 74 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d   the few places.
5480: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
5490: 68 65 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c  here the CLR wil
54a0: 6c 20 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20  l actually find 
54b0: 61 6e 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72  and load them pr
54c0: 6f 70 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20  operly)...      
54d0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
54e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61  fo exists ::bina
54f0: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
5500: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
5510: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
5520: 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79  binary_directory
5530: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5540: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5550: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
5560: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69  cation of the bi
5570: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 68  nary directory h
5580: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
5590: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
55a0: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
55b0: 75 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e  use it verbatim.
55c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
55d0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62       return $::b
55e0: 69 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  inary_directory.
55f0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
5600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5610: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20  [info binary].. 
5620: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
5630: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 45 78  ..    proc getEx
5640: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b  ternalFileName {
5650: 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20   fileName } {.. 
5660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
5670: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
5680: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
5690: 20 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77   name as if it w
56a0: 65 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74  ere located in t
56b0: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
56c0: 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74    directory cont
56d0: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72  aining the exter
56e0: 6e 61 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20  nal binaries... 
56f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
5700: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
5710: 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
5720: 20 5b 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72   [getExternalDir
5730: 65 63 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d  ectory] $fileNam
5740: 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  e]]..    }..... 
5750: 20 20 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72     proc getBinar
5760: 79 46 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65  yFileName { file
5770: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
5780: 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  "} } {..      #.
5790: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
57a0: 65 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69  eturns the speci
57b0: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61  fied file name a
57c0: 73 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63  s if it were loc
57d0: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
57e0: 20 20 20 23 20 20 20 20 20 20 20 62 69 6e 61 72     #       binar
57f0: 79 20 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73  y directory, dis
5800: 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65  carding any dire
5810: 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  ctory informatio
5820: 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20  n present..     
5830: 20 23 20 20 20 20 20 20 20 69 6e 20 74 68 65 20   #       in the 
5840: 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f  file name as pro
5850: 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c  vided by our cal
5860: 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ler...      #.. 
5870: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
5880: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
5890: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
58a0: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
58b0: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
58c0: 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  orm [file tail $
58d0: 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20  fileName]]]..   
58e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
58f0: 67 65 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c  getCoreBinaryFil
5900: 65 4e 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72  eName { {platfor
5910: 6d 20 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20  m ""} {standard 
5920: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
5930: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
5940: 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 66  E: Returns the f
5950: 75 6c 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65  ull path for the
5960: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
5970: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
5980: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5990: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 63  native library c
59a0: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61  ode for this pla
59b0: 74 66 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63  tform.  First, c
59c0: 68 65 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d  heck and see if.
59d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
59e0: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e  he SQLite core n
59f0: 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 68 61  ative library ha
5a00: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c  s already been l
5a10: 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20  oaded.  Next,.. 
5a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 61 6c       #       fal
5a30: 6c 62 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68  lback to what th
5a40: 65 20 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75  e full path shou
5a50: 6c 64 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20  ld be, based on 
5a60: 77 68 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20  whether the..   
5a70: 20 20 20 23 20 20 20 20 20 20 20 6d 69 78 65 64     #       mixed
5a80: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69  -mode assembly i
5a90: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64  s being used and
5aa0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5ab0: 20 63 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20   current..      
5ac0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
5ad0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5ae0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
5af0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
5b00: 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
5b10: 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
5b20: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
5b30: 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
5b40: 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53  NativeMethods _S
5b50: 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c  QLiteNativeModul
5b60: 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  eFileName..     
5b70: 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20   } fileName] == 
5b80: 30 20 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e  0 && [string len
5b90: 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e  gth $fileName] >
5ba0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
5bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5bc0: 20 4e 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74   NOTE: The SQLit
5bd0: 65 20 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69  e core native li
5be0: 62 72 61 72 79 20 68 61 73 20 61 6c 72 65 61 64  brary has alread
5bf0: 79 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69  y been loaded vi
5c00: 61 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  a..        #    
5c10: 20 20 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69     the native li
5c20: 62 72 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72  brary pre-loader
5c30: 2e 20 20 52 65 74 75 72 6e 20 74 68 61 74 20 66  .  Return that f
5c40: 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20  ile name now... 
5c50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
5c60: 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61    return $fileNa
5c70: 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  me..      }.... 
5c80: 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
5c90: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
5ca0: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
5cb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5cc0: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
5cd0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
5ce0: 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e  embly file name.
5cf0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
5d00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c       return [fil
5d10: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
5d30: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72  e join [getBinar
5d40: 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61  yDirectory] $pla
5d50: 74 66 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74  tform System.Dat
5d60: 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a  a.SQLite.dll]]..
5d70: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5d80: 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20  $standard} then 
5d90: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5da0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
5db0: 74 75 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d  turn the native-
5dc0: 6f 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51  only standard SQ
5dd0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 66 69 6c  Lite library fil
5de0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
5df0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
5e00: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
5e10: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
5e20: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
5e30: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
5e40: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c  y] $platform sql
5e50: 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20  ite3.dll]]..    
5e60: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
5e70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5e80: 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68   NOTE: Return th
5e90: 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e  e native-only in
5ea0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66  terop assembly f
5eb0: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
5ec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
5ed0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
5ee0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
5ef0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
5f00: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
5f10: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53  ory] $platform S
5f20: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
5f30: 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  l]]..      }..  
5f40: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
5f50: 20 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74   getCommonDirect
5f60: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
5f70: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5f80: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
5f90: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
5fa0: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
5fb0: 74 65 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20  test scripts..  
5fc0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5fd0: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
5fe0: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
5ff0: 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 74 68   just returns th
6000: 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  e Eagle..      #
6010: 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64 69         binary di
6020: 72 65 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20  rectory...      
6030: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
6040: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d  fo exists ::comm
6050: 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  on_directory] &&
6060: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6070: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6080: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
6090: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
60a0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
60b0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f    # NOTE: The lo
60c0: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  cation of the co
60d0: 6d 6d 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68  mmon directory h
60e0: 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20  as been set;..  
60f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
6100: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
6110: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6120: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63       return $::c
6130: 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d  ommon_directory.
6140: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
6150: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6160: 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79  vendor_directory
6170: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6180: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
6190: 20 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63   $::vendor_direc
61a0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
61b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
61c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
61d0: 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  e location of th
61e0: 65 20 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f  e vendor directo
61f0: 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b  ry has been set;
6200: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6210: 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65    therefore, use
6220: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d   it...        #.
6230: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6240: 24 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74  $::vendor_direct
6250: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
6260: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
6270: 73 20 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d  s ::tcl_library]
6280: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
6290: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
62a0: 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20  $::tcl_library] 
62b0: 3e 20 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  > 0 && \..      
62c0: 20 20 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65      [file isdire
62d0: 63 74 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62  ctory $::tcl_lib
62e0: 72 61 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rary]} then {.. 
62f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6300: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61    # NOTE: The va
6310: 72 69 61 62 6c 65 20 77 69 74 68 20 74 68 65 20  riable with the 
6320: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
6330: 73 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 69  script library i
6340: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
6350: 20 20 20 73 65 74 20 61 6e 64 20 61 70 70 65 61     set and appea
6360: 72 73 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20  rs to be a real 
6370: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20  directory (i.e. 
6380: 6e 6f 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20  not embedded..  
6390: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69        #       wi
63a0: 74 68 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68  thin a file); th
63b0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
63c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
63d0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
63e0: 63 6c 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20  cl_library..    
63f0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
6400: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6410: 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20   NOTE: Fallback 
6420: 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
6430: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6440: 65 78 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20  executable...   
6450: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6460: 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e  return [info bin
6470: 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ary]..      }.. 
6480: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
6490: 63 20 67 65 74 44 61 74 61 62 61 73 65 44 69 72  c getDatabaseDir
64a0: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
64b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
64c0: 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75  TE: This procedu
64d0: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 64  re returns the d
64e0: 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74  irectory where t
64f0: 68 65 20 74 65 73 74 20 64 61 74 61 62 61 73 65  he test database
6500: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
6510: 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74   should be locat
6520: 65 64 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  ed.  By default,
6530: 20 74 68 69 73 20 6a 75 73 74 20 75 73 65 73 20   this just uses 
6540: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  the temporary.. 
6550: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
6560: 65 63 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65  ectory configure
6570: 64 20 66 6f 72 20 74 68 69 73 20 73 79 73 74 65  d for this syste
6580: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
6590: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
65a0: 73 74 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64  sts ::database_d
65b0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
65c0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
65d0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61  g length $::data
65e0: 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  base_directory] 
65f0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6610: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
6620: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
6630: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68  base directory h
6640: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
6650: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
6660: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
6670: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
6680: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6690: 72 6e 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64  rn $::database_d
66a0: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
66b0: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20  } elseif {[info 
66c0: 65 78 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68  exists ::scratch
66d0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
66e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
66f0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63  ing length $::sc
6700: 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d  ratch_directory]
6710: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
6720: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6730: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
6740: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72  ation of the scr
6750: 61 74 63 68 20 64 69 72 65 63 74 6f 72 79 20 68  atch directory h
6760: 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64  as been overridd
6770: 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20  en;..        #  
6780: 20 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20       therefore, 
6790: 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
67a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
67b0: 72 6e 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69  rn $::scratch_di
67c0: 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d  rectory..      }
67d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
67e0: 20 72 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70   return [getTemp
67f0: 6f 72 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20  oraryPath]..    
6800: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
6810: 20 20 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f     proc getTempo
6820: 72 61 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d  raryDirectory {}
6830: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6840: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6850: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
6860: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
6870: 77 68 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72  where the tempor
6880: 61 72 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20  ary files..     
6890: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
68a0: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20  be located.  By 
68b0: 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75  default, this ju
68c0: 73 74 20 75 73 65 73 20 74 68 65 20 74 65 6d 70  st uses the temp
68d0: 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  orary..      #  
68e0: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
68f0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
6900: 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20  is system...    
6910: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
6920: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
6930: 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
6940: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
6950: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
6960: 68 20 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64  h $::temporary_d
6970: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
6980: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
6990: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
69a0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
69b0: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  f the temporary 
69c0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
69d0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
69e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
69f0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6a00: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
6a10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
6a20: 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63  :temporary_direc
6a30: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
6a40: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
6a50: 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  ts ::scratch_dir
6a60: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
6a70: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
6a80: 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63  length $::scratc
6a90: 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  h_directory] > 0
6aa0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6ab0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6ac0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
6ad0: 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68  n of the scratch
6ae0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
6af0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
6b00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6b10: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
6b20: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
6b30: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
6b40: 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74  ::scratch_direct
6b50: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
6b60: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  e {..        ret
6b70: 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72  urn [getTemporar
6b80: 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d  yPath]..      }.
6b90: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
6ba0: 72 6f 63 20 67 65 74 54 65 73 74 4f 76 65 72 72  roc getTestOverr
6bb0: 69 64 65 73 50 72 65 61 6d 62 6c 65 20 7b 20 7b  idesPreamble { {
6bc0: 65 78 74 72 61 56 61 72 4e 61 6d 65 73 20 22 22  extraVarNames ""
6bd0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
6be0: 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69 73 74 5d   varNames [list]
6bf0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
6c00: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76     # NOTE: If av
6c10: 61 69 6c 61 62 6c 65 2c 20 73 74 61 72 74 20 77  ailable, start w
6c20: 69 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 6c  ith the master l
6c30: 69 73 74 20 6f 66 20 74 65 73 74 20 6f 76 65 72  ist of test over
6c40: 72 69 64 65 0d 0a 20 20 20 20 20 20 23 20 20 20  ride..      #   
6c50: 20 20 20 20 76 61 72 69 61 62 6c 65 73 2e 0d 0a      variables...
6c60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
6c70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6c80: 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73  ::test_overrides
6c90: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6ca0: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65    [llength $::te
6cb0: 73 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 3e 20  st_overrides] > 
6cc0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
6cd0: 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
6ce0: 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74 65 73 74  varNames $::test
6cf0: 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20 20 20 20  _overrides..    
6d00: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
6d10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
6d20: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 6f 75   requested by ou
6d30: 72 20 63 61 6c 6c 65 72 2c 20 61 64 64 20 61 6e  r caller, add an
6d40: 79 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 61 72  y additional var
6d50: 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  iable..      #  
6d60: 20 20 20 20 20 6e 61 6d 65 73 20 74 6f 20 63 6f       names to co
6d70: 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23  py now...      #
6d80: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65  ..      if {[lle
6d90: 6e 67 74 68 20 24 65 78 74 72 61 56 61 72 4e 61  ngth $extraVarNa
6da0: 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  mes] > 0} then {
6db0: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
6dc0: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
6dd0: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 0d 0a  $extraVarNames..
6de0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
6df0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
6e00: 3a 20 42 75 69 6c 64 20 74 68 65 20 73 63 72 69  : Build the scri
6e10: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 62  pt fragment to b
6e20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 72  e returned by pr
6e30: 6f 63 65 73 73 69 6e 67 20 65 61 63 68 0d 0a 20  ocessing each.. 
6e40: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
6e50: 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 61  iable name and a
6e60: 64 64 69 6e 67 20 74 68 65 20 6e 65 63 65 63 65  dding the necece
6e70: 73 73 61 72 79 20 73 63 72 69 70 74 20 66 72 61  ssary script fra
6e80: 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20 20 20 20  gments for..    
6e90: 20 20 23 20 20 20 20 20 20 20 65 61 63 68 20 6f    #       each o
6ea0: 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ne...      #..  
6eb0: 20 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 22      set result "
6ec0: 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61  "....      forea
6ed0: 63 68 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e  ch varName $varN
6ee0: 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
6ef0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6f00: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 71 75 61  E: Build the qua
6f10: 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c 20 76 61  lified global va
6f20: 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  riable name...  
6f30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6f40: 20 73 65 74 20 66 75 6c 6c 56 61 72 4e 61 6d 65   set fullVarName
6f50: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 3a 3a 20   [appendArgs :: 
6f60: 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  $varName]....   
6f70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6f80: 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 74 68 65  # NOTE: Does the
6f90: 20 76 61 72 69 61 62 6c 65 20 65 78 69 73 74 20   variable exist 
6fa0: 69 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65  in this interpre
6fb0: 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d 0a 20 20  ter context?..  
6fc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6fd0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
6fe0: 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 7d  s $fullVarName]}
6ff0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7000: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
7010: 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e 64 20 61  # NOTE: Append a
7020: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
7030: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 74   to the result t
7040: 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 65 63 74  hat will correct
7050: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ly..          # 
7060: 20 20 20 20 20 20 63 6f 70 79 20 61 6e 79 20 63        copy any c
7070: 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75 65 20 74  ontained value t
7080: 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74 65 72 70  o another interp
7090: 72 65 74 65 72 20 63 6f 6e 74 65 78 74 2e 0d 0a  reter context...
70a0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
70b0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
70c0: 73 75 6c 74 20 5c 6e 20 22 73 65 74 20 22 20 24  sult \n "set " $
70d0: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22 20 5c 7b  fullVarName " \{
70e0: 22 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e  " [set $fullVarN
70f0: 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  ame] \}..       
7100: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
7110: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7120: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
7130: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
7140: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
7150: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
7160: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
7170: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
7180: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
7190: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
71a0: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
71b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
71c0: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
71d0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
71e0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
71f0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
7200: 6f 63 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50  oc getAppDomainP
7210: 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69  reamble { {prefi
7220: 78 20 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22  x ""} {suffix ""
7230: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
7240: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
7250: 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
7260: 75 72 6e 73 20 61 20 74 65 73 74 20 73 65 74 75  urns a test setu
7270: 70 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e  p script fragmen
7280: 74 20 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a  t suitable for..
7290: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 76        #       ev
72a0: 61 6c 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69  aluation by an i
72b0: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
72c0: 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65  ed in an isolate
72d0: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20  d application.. 
72e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d       #       dom
72f0: 61 69 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74  ain.  The script
7300: 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20   fragment being 
7310: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
7320: 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a   surrounded by..
7330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
7340: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 75 66  e prefix and suf
7350: 66 69 78 20 22 73 63 72 69 70 74 20 66 72 61 67  fix "script frag
7360: 6d 65 6e 74 73 22 20 73 70 65 63 69 66 69 65 64  ments" specified
7370: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d   by our caller,.
7380: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
7390: 66 20 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69  f any.  The enti
73a0: 72 65 20 73 63 72 69 70 74 20 62 65 69 6e 67 20  re script being 
73b0: 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
73c0: 20 73 75 62 73 74 69 74 75 74 65 64 20 76 69 61   substituted via
73d0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
73e0: 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20  [subst], in the 
73f0: 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63  context of our c
7400: 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65  aller, before be
7410: 69 6e 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20  ing returned... 
7420: 20 20 20 20 20 23 20 20 20 20 20 20 20 54 68 69       #       Thi
7430: 73 20 73 74 65 70 20 69 73 20 6e 65 63 65 73 73  s step is necess
7440: 61 72 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65  ary so that some
7450: 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74   limited context
7460: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20   information,.. 
7470: 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72 69       #       pri
7480: 6d 61 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74  marily related t
7490: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 64 69  o the testing di
74a0: 72 65 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62  rectories, can b
74b0: 65 20 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20  e transferred.. 
74c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
74d0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
74e0: 69 6e 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  in the isolated 
74f0: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61  application doma
7500: 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20  in, making it.. 
7510: 20 20 20 20 20 23 20 20 20 20 20 20 20 61 62 6c       #       abl
7520: 65 20 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  e to successfull
7530: 79 20 72 75 6e 20 74 65 73 74 73 20 74 68 61 74  y run tests that
7540: 20 72 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20   require one or 
7550: 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20  more of the..   
7560: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 73     #       files
7570: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   in one of the t
7580: 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69  esting directori
7590: 65 73 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f  es.  Callers sho
75a0: 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20  uld keep in..   
75b0: 20 20 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20     #       mind 
75c0: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 73 63  that the test sc
75d0: 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65  ript fragment be
75e0: 69 6e 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e  ing returned can
75f0: 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20  not rely on..   
7600: 20 20 20 23 20 20 20 20 20 20 20 61 6e 79 20 73     #       any s
7610: 63 72 69 70 74 20 6c 69 62 72 61 72 79 20 70 72  cript library pr
7620: 6f 63 65 64 75 72 65 73 20 74 68 61 74 20 61 72  ocedures that ar
7630: 65 20 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62  e not provided b
7640: 79 20 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20  y the Eagle..   
7650: 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72 61     #       libra
7660: 72 79 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e  ry package (i.e.
7670: 20 22 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20   "init.eagle"), 
7680: 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20  including those 
7690: 70 72 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20  provided by..   
76a0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 45     #       the E
76b0: 61 67 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67  agle test packag
76c0: 65 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69  e, unless the fi
76d0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
76e0: 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  em is loaded..  
76f0: 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75      #       manu
7700: 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74  ally via some ot
7710: 68 65 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65  her mechanism (e
7720: 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67  .g. by including
7730: 20 61 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20   appropriate..  
7740: 20 20 20 20 23 20 20 20 20 20 20 20 5b 70 61 63      #       [pac
7750: 6b 61 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72  kage require] or
7760: 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e   [source] comman
7770: 64 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  ds in the prefix
7780: 20 6f 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20   or suffix..    
7790: 20 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74    #       script
77a0: 20 66 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c   fragments).  Al
77b0: 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65  so, all variable
77c0: 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
77d0: 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20  all nested..    
77e0: 20 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e    #       comman
77f0: 64 73 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69  ds (i.e. those i
7800: 6e 20 73 71 75 61 72 65 20 62 72 61 63 6b 65 74  n square bracket
7810: 73 29 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  s) contained in 
7820: 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20  the final..     
7830: 20 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20   #       script 
7840: 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e  fragment will en
7850: 64 20 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75  d up being evalu
7860: 61 74 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  ated in the cont
7870: 65 78 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  ext of the..    
7880: 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e    #       callin
7890: 67 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e  g interpreter an
78a0: 64 20 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74  d not the target
78b0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72 65   interpreter cre
78c0: 61 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20  ated in the..   
78d0: 20 20 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61     #       isola
78e0: 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ted application 
78f0: 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68  domain unless th
7900: 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61  e dollar signs a
7910: 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20  nd/or square..  
7920: 20 20 20 20 23 20 20 20 20 20 20 20 62 72 61 63      #       brac
7930: 6b 65 74 73 20 61 72 65 20 73 70 65 63 69 61 6c  kets are special
7940: 6c 79 20 71 75 6f 74 65 64 20 77 69 74 68 20 62  ly quoted with b
7950: 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20  ackslashes...   
7960: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
7970: 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c  rn [uplevel 1 [l
7980: 69 73 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e  ist subst [appen
7990: 64 41 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d  dArgs $prefix {.
79a0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
79b0: 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  sRuntimeOption n
79c0: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
79d0: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
79e0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
79f0: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
7a00: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
7a10: 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 7d  ative..        }
7a20: 0d 0a 20 20 20 20 20 20 7d 20 5b 67 65 74 54 65  ..      } [getTe
7a30: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
7a40: 62 6c 65 20 5b 6c 69 73 74 20 70 61 74 68 20 74  ble [list path t
7a50: 65 73 74 5f 63 68 61 6e 6e 65 6c 5d 5d 20 24 73  est_channel]] $s
7a60: 75 66 66 69 78 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  uffix]]]..    }.
7a70: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
7a80: 43 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65  CopyExternalFile
7a90: 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61   { fileName {pla
7aa0: 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69  tform ""} {newFi
7ab0: 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a  leName ""} } {..
7ac0: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
7ad0: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74  FileName [getExt
7ae0: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66  ernalFileName $f
7af0: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
7b00: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
7b10: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
7b20: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
7b30: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
7b40: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
7b50: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
7b60: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
7b70: 70 70 65 64 20 63 6f 70 79 69 6e 67 20 65 78 74  pped copying ext
7b80: 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22 20 24  ernal file \"" $
7b90: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
7ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
7bb0: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
7bc0: 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  xist\n"]....    
7bd0: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
7be0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
7bf0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
7c00: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
7c10: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7c20: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
7c30: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
7c40: 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c  FileName $newFil
7c50: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
7c60: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
7c70: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
7c80: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
7c90: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
7ca0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
7cb0: 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  orm]..      }...
7cc0: 0a 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65  .      set targe
7cd0: 74 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65  tDirectory [file
7ce0: 20 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74   dirname $target
7cf0: 46 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  FileName]....   
7d00: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
7d10: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66  .        if {![f
7d20: 69 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67  ile exists $targ
7d30: 65 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68  etDirectory]} th
7d40: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
7d50: 66 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67  file mkdir $targ
7d60: 65 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  etDirectory..   
7d70: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7d80: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
7d90: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
7da0: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
7db0: 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
7dc0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7dd0: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
7de0: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
7df0: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
7e00: 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65    "---- copied e
7e10: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  xternal file fro
7e20: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
7e30: 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22  eName "\" to \""
7e40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7e50: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
7e60: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
7e70: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
7e80: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
7e90: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
7ea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
7eb0: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
7ec0: 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69  copy external fi
7ed0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
7ee0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
7ef0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 74             "\" t
7f00: 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c  o \"" $targetFil
7f10: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
7f20: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
7f30: 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79      proc tryCopy
7f40: 42 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c  BinaryFile { fil
7f50: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
7f60: 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65  ""} {newFileName
7f70: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
7f80: 73 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61  set sourceFileNa
7f90: 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  me [getBinaryFil
7fa0: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
7fb0: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20  $platform]....  
7fc0: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
7fd0: 78 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c  xists $sourceFil
7fe0: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
7ff0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8000: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
8010: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8020: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
8030: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62  kipped copying b
8040: 69 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24  inary file \"" $
8050: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
8060: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
8070: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
8080: 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  xist\n"]....    
8090: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
80a0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
80b0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
80c0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20  $newFileName] > 
80d0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
80e0: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
80f0: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
8100: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
8110: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
8120: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8130: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
8140: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
8150: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66  BuildFileName $f
8160: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8170: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
8180: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
8190: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
81a0: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
81b0: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
81c0: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
81d0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
81e0: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
81f0: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
8200: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
8210: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
8220: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
8230: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
8240: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
8250: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
8260: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
8270: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
8280: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
8290: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
82a0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
82b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
82c0: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e  "---- copied bin
82d0: 61 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ary file from \"
82e0: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
82f0: 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a  e "\" to \"" \..
8300: 20 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72              $tar
8310: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
8320: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
8330: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
8340: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
8350: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
8360: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
8370: 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79  - failed to copy
8380: 20 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f   binary file fro
8390: 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  m \"" $sourceFil
83a0: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
83b0: 20 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20       "\" to \"" 
83c0: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20  $targetFileName 
83d0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  \"\n]..      }..
83e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
83f0: 6f 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46  oc tryCopyBuildF
8400: 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b  ile { fileName {
8410: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65  platform ""} {ne
8420: 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20  wFileName ""} } 
8430: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75  {..      set sou
8440: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  rceFileName [get
8450: 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66  BuildFileName $f
8460: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
8470: 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  m]....      if {
8480: 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 73  ![file exists $s
8490: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20  ourceFileName]} 
84a0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
84b0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
84c0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
84d0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
84e0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
84f0: 6f 70 79 69 6e 67 20 62 75 69 6c 64 20 66 69 6c  opying build fil
8500: 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c  e \"" $sourceFil
8510: 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
8520: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
8530: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
8540: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
8550: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
8560: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
8570: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
8580: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
8590: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
85a0: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
85b0: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
85c0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
85d0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
85e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
85f0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8600: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
8610: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
8620: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
8630: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
8640: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
8650: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
8660: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
8670: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
8680: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
8690: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
86a0: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
86b0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
86c0: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
86d0: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
86e0: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  ry..        }.. 
86f0: 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
8700: 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46   -force $sourceF
8710: 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46  ileName $targetF
8720: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
8730: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
8740: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8750: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
8760: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8770: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
8780: 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69 6c 65  opied build file
8790: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
87a0: 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f  eFileName "\" to
87b0: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
87c0: 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e      $targetFileN
87d0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
87e0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
87f0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
8800: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
8810: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
8820: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
8830: 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64 20 66   to copy build f
8840: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
8850: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
8860: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
8870: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
8880: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
8890: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
88a0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c  .    proc tryDel
88b0: 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 7b 20  eteBinaryFile { 
88c0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
88d0: 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20  rm ""} } {..    
88e0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
88f0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
8900: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61  e $fileName $pla
8910: 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20  tform]....      
8920: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
8930: 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
8940: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
8950: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
8960: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
8970: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
8980: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
8990: 65 74 69 6e 67 20 62 69 6e 61 72 79 20 66 69 6c  eting binary fil
89a0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
89b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
89c0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
89d0: 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  exist\n"]....   
89e0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
89f0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
8a00: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
8a10: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
8a20: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
8a30: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
8a40: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
8a50: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
8a60: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
8a70: 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69  eleted binary fi
8a80: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
8a90: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
8aa0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
8ab0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
8ac0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8ad0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
8ae0: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
8af0: 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66   delete binary f
8b00: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
8b10: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
8b20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8b30: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75  proc tryDeleteBu
8b40: 69 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61  ildFile { fileNa
8b50: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
8b60: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
8b70: 66 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69  fileName [getBui
8b80: 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ldFileName $file
8b90: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
8ba0: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
8bb0: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
8bc0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8bd0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8be0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8bf0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8c00: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
8c10: 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 62  ipped deleting b
8c20: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
8c30: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
8c40: 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64         "\", it d
8c50: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22  oes not exist\n"
8c60: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ]....        ret
8c70: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
8c80: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
8c90: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
8ca0: 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20  ileName}] == 0} 
8cb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8cc0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
8cd0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
8ce0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
8cf0: 20 22 2d 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62   "---- deleted b
8d00: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
8d10: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
8d30: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8d40: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8d50: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8d60: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61          "---- fa
8d70: 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62  iled to delete b
8d80: 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 66  uild file \"" $f
8d90: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
8da0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
8db0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
8dc0: 70 79 41 73 73 65 6d 62 6c 79 20 7b 20 66 69 6c  pyAssembly { fil
8dd0: 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20  eName {platform 
8de0: 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20 7d  ""} {pdb true} }
8df0: 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 43 6f 70   {..      tryCop
8e00: 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65  yBuildFile $file
8e10: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  Name $platform..
8e20: 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62  ..      if {$pdb
8e30: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
8e40: 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69    tryCopyBuildFi
8e50: 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  le [appendArgs \
8e60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
8e70: 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69  ile rootname $fi
8e80: 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20 24 70  leName] .pdb] $p
8e90: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 7d  latform..      }
8ea0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
8eb0: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73  proc tryDeleteAs
8ec0: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
8ed0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8ee0: 7b 70 64 62 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  {pdb true} } {..
8ef0: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
8f00: 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e  inaryFile $fileN
8f10: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 0d  ame $platform...
8f20: 0a 20 20 20 20 20 20 69 66 20 7b 24 70 64 62 7d  .      if {$pdb}
8f30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8f40: 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
8f50: 46 69 6c 65 20 5b 61 70 70 65 6e 64 41 72 67 73  File [appendArgs
8f60: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8f70: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
8f80: 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64 62 5d 20  fileName] .pdb] 
8f90: 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
8fa0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
8fb0: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
8fc0: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
8fd0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
8fe0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
8ff0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
9000: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
9010: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
9020: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
9030: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
9040: 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a  et assembly [obj
9050: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
9060: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
9070: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
9080: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
9090: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
90a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
90b0: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
90c0: 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ary test constra
90d0: 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  int...        #.
90e0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
90f0: 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f  traint [file roo
9100: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
9110: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a   $fileName]]....
9120: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
9130: 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
9140: 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  the image runtim
9150: 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74  e version from t
9160: 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61  he assembly beca
9170: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  use..        #  
9180: 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73       several tes
9190: 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61  ts rely on it ha
91a0: 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76  ving a certain v
91b0: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
91c0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
91d0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
91e0: 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  rgs [file tail $
91f0: 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20  fileName] _ \.. 
9200: 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73             [$ass
9210: 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69  embly ImageRunti
9220: 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20  meVersion]].... 
9230: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
9240: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
9250: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f   the full path o
9260: 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c  f the loaded fil
9270: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
9280: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
9290: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
92a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
92b0: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
92c0: 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65     proc isSQLite
92d0: 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  Ready {} {..    
92e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
92f0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
9300: 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  e must return no
9310: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74  n-zero only if t
9320: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
9330: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
9340: 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20  library and the 
9350: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
9360: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
9370: 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a  bly are loaded..
9380: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
9390: 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
93a0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
93b0: 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  e.  Currently, t
93c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  his procedure.. 
93d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
93e0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
93f0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72  ly after the [tr
9400: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70  yLoadAssembly] p
9410: 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20  rocedure has..  
9420: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
9430: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
9440: 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e   for the System.
9450: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
9460: 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ged assembly..  
9470: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
9480: 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c  the [checkForSQL
9490: 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68  ite] procedure h
94a0: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
94b0: 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20  o probe for..   
94c0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
94d0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
94e0: 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c  rary; otherwise,
94f0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
9500: 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20  will simply..   
9510: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
9520: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a  s return zero...
9530: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9540: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
9550: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
9560: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
9570: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
9580: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
9590: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
95a0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
95b0: 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65  roc matchMachine
95c0: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
95d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
95e0: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
95f0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
9600: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
9610: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
9620: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
9630: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
9640: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
9650: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
9660: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
9670: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9680: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
9690: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
96a0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
96b0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
96c0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
96d0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
96e0: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
96f0: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
9700: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
9710: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
9720: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
9730: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
9740: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
9750: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
9760: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
9770: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
9780: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
9790: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
97a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
97b0: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
97c0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
97d0: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
97e0: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
97f0: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
9800: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
9810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
9820: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
9830: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
9840: 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75  checkForSQLiteBu
9850: 69 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ilds { channel {
9860: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
9870: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
9880: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
9890: 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
98a0: 6c 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61  le valid combina
98b0: 74 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75  tion of values u
98c0: 73 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20  sed when..      
98d0: 23 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67  #       locating
98e0: 20 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f   out the build o
98f0: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c  utput directory,
9900: 20 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76   showing each av
9910: 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23  ailable..      #
9920: 20 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72         build var
9930: 69 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65  iation along the
9940: 20 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   way...      #..
9950: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
9960: 74 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65  tive [list false
9970: 20 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20   true] {..      
9980: 20 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b    foreach year [
9990: 67 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b  getBuildYears] {
99a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
99b0: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
99c0: 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  n [getBuildConfi
99d0: 67 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20  gurations] {..  
99e0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
99f0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9a00: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
9a10: 65 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20  effective build 
9a20: 70 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20  platform.  This 
9a30: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
9a40: 23 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e  #       based on
9a50: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
9a60: 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61  a [primarily] na
9a70: 74 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20  tive build..    
9a80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
9a90: 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20  is being used.  
9aa0: 46 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20  For [primarily] 
9ab0: 6e 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64  non-native build
9ac0: 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s,..            
9ad0: 23 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c  #       this wil
9ae0: 6c 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  l be an empty st
9af0: 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  ring...         
9b00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
9b10: 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
9b20: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
9b30: 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20   $native]....   
9b40: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
9b50: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
9b60: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
9b70: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
9b80: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
9b90: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69  .Data.SQLite bui
9ba0: 6c 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a  ld \"" [expr \..
9bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bc0: 7b 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69  {$native ? "nati
9bd0: 76 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70  ve/" : ""}] [exp
9be0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
9bf0: 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
9c00: 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20       $platform] 
9c10: 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67  > 0 ? [appendArg
9c20: 73 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a  s $platform /] :
9c30: 20 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20   ""}] $year \.. 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c50: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
9c60: 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20  "\"... "]....   
9c70: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
9c80: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9c90: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
9ca0: 71 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74  qualified direct
9cb0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65  ory where the ne
9cc0: 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20  cessary..       
9cd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
9ce0: 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
9cf0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
9d00: 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
9d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
9d30: 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
9d40: 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
9d50: 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
9d60: 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69           [getBui
9d70: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
9d80: 20 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d   $year $platform
9d90: 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d   $configuration]
9da0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9db0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
9dc0: 20 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65   NOTE: Do the ne
9dd0: 63 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78  cessary files ex
9de0: 69 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c  ist?  Currently,
9df0: 20 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d   no other steps.
9e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20  .            #  
9e10: 20 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74       are taken t
9e20: 6f 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75  o verify this bu
9e30: 69 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ild is actually 
9e40: 76 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  viable...       
9e50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9e60: 20 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64      if {[isBuild
9e70: 41 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76  Available $nativ
9e80: 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  e $directory]} t
9e90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
9ea0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9eb0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68        # NOTE: Wh
9ec0: 65 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d  en in "select" m
9ed0: 6f 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c  ode, automatical
9ee0: 6c 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69  ly select the fi
9ef0: 72 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rst..           
9f00: 20 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c     #       avail
9f10: 61 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79  able build of Sy
9f20: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9f30: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
9f40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9f50: 23 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74  #       immediat
9f60: 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ely...          
9f70: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9f80: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
9f90: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
9fa0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
9fb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9fc0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
9fd0: 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
9fe0: 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69   Manually overri
9ff0: 64 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64  de all the build
a000: 20 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63   directory selec
a010: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  tion..          
a020: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
a030: 6c 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69  lated test setti
a040: 6e 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ngs in order to 
a050: 66 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64  force this build
a060: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a070: 20 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73    #       of Sys
a080: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
a090: 74 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20  to be used...   
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
a0d0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
a0e0: 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  ive [expr {$nati
a0f0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
a100: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64              "Add
a110: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a  RuntimeOption" :
a120: 20 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f   "RemoveRuntimeO
a130: 70 74 69 6f 6e 22 7d 5d 20 20 6e 61 74 69 76 65  ption"}]  native
a140: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a150: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79      set ::test_y
a160: 65 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20  ear $year..     
a170: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
a180: 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
a190: 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
a1a0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
a1b0: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
a1c0: 6f 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f  on $configuratio
a1d0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
a1e0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
a1f0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
a200: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
a210: 20 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c         "yes, sel
a220: 65 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b  ected (" [expr {
a230: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
a240: 65 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20  e/" : ""}] \..  
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67    [expr {[string
a270: 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
a280: 6d 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64  m] > 0 ? [append
a290: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61              $pla
a2b0: 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20  tform /] : ""}] 
a2c0: 24 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75  $year / $configu
a2d0: 72 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d  ration ")\n"]...
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2f0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
a310: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
a320: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
a330: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
a340: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
a350: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
a360: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a370: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a380: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
a390: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
a3a0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
a3b0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
a3c0: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
a3d0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
a3e0: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c  heckForSQLiteRel
a3f0: 65 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20  eases { channel 
a400: 7b 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d  {select false} }
a410: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
a420: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
a430: 20 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73   for past releas
a440: 65 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74  es of System.Dat
a450: 61 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20  a.SQLite in the 
a460: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
a470: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
a480: 65 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65  ed in the "Syste
a490: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65  m.Data.SQLite" e
a4a0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
a4b0: 62 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23  ble, if..      #
a4c0: 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d         present..
a4d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a4e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
a4f0: 20 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61   ::env(System.Da
a500: 74 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c  ta.SQLite)] && \
a510: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
a520: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e  ing length $::en
a530: 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  v(System.Data.SQ
a540: 4c 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e  Lite)] > 0} then
a550: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a560: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
a570: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
a580: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
a590: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
a5a0: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
a5b0: 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e  #       componen
a5c0: 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ts for System.Da
a5d0: 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  ta.SQLite should
a5e0: 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20   be found...    
a5f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
a600: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69  et directory [fi
a610: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
a620: 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
a630: 20 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53          $::env(S
a640: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a650: 65 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65  e) [getReleaseVe
a660: 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20  rsion]]]....    
a670: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a680: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
a690: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
a6a0: 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
a6b0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
a6c0: 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20  ite release \"" 
a6d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
a6e0: 64 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e  directory "\"...
a6f0: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69   "]....        i
a700: 66 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61  f {[isReleaseAva
a710: 69 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72  ilable $director
a720: 79 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65  y platform]} the
a730: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
a740: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
a750: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20  h $platform] == 
a760: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
a770: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
a780: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
a790: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
a7a0: 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
a7b0: 74 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69  t && [matchMachi
a7c0: 6e 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74  ne $platform]} t
a7d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a7e0: 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64     set ::build_d
a7f0: 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74  irectory $direct
a800: 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ory....         
a810: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
a820: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
a830: 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20  es, selected (" 
a840: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
a850: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a860: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
a870: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
a880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
a890: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
a8a0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
a8b0: 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d  $platform ")\n"]
a8c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
a8d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
a8e0: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
a8f0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
a900: 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
a910: 61 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20  ach path [lsort 
a920: 2d 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c  -decreasing [fil
a930: 65 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72  e list $director
a940: 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20  y *]] {..       
a950: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
a960: 78 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20  xists $path] && 
a970: 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
a980: 79 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b  y $path]} then {
a990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a9a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
a9b0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
a9e0: 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
a9f0: 51 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22  QLite release \"
aa00: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
aa10: 20 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22         $path "\"
aa20: 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
aa30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52          if {[isR
aa40: 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20  eleaseAvailable 
aa50: 24 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d  $path platform]}
aa60: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
aa70: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
aa80: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
aa90: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
aaa0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
aab0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
aac0: 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  orm unknown..   
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
aae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
aaf0: 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26    if {$select &&
ab00: 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24   [matchMachine $
ab10: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
ab20: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ab30: 20 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64       set ::build
ab40: 5f 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68  _directory $path
ab50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ab60: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ab70: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
ab80: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
ab90: 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c  (" $platform ")\
aba0: 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
abb0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
abc0: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
abd0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ac00: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
ac10: 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22  s (" $platform "
ac20: 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  )\n"]..         
ac30: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
ac40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
ac50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ac60: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
ac70: 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
ac80: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ac90: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
aca0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
acb0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
acc0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
acd0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
ace0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
acf0: 20 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65   "---- environme
ad00: 6e 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79  nt variable \"Sy
ad10: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
ad20: 5c 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20  \" is not " \.. 
ad30: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c             "set,
ad40: 20 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20   skipping check 
ad50: 66 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c  for releases...\
ad60: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n"]..      }....
ad70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
ad80: 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  se..    }.....  
ad90: 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53    proc checkForS
ada0: 51 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63  QLiteLibrary { c
adb0: 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20  hannel } {..    
adc0: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
add0: 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
ade0: 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20  for SQLite core 
adf0: 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a  library... "....
ae00: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
ae10: 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
ae20: 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
ae30: 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
ae40: 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
ae50: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
ae60: 4c 69 74 65 33 20 53 51 4c 69 74 65 56 65 72 73  Lite3 SQLiteVers
ae70: 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
ae80: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
ae90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
aea0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
aeb0: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
aec0: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
aed0: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
aee0: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
aef0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
af00: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
af10: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
af20: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
af30: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
af40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
af50: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
af60: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
af70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
af80: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
af90: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
afa0: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
afb0: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
afc0: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
afd0: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
afe0: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
aff0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
b000: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
b010: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
b020: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
b030: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b040: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b050: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c  Lite.SQLite3 SQL
b060: 69 74 65 53 6f 75 72 63 65 49 64 0d 0a 20 20 20  iteSourceId..   
b070: 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64 5d       } sourceId]
b080: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b090: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
b0a0: 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c   # NOTE: We fail
b0b0: 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ed to query the 
b0c0: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
b0d0: 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20 20  entifier...     
b0e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b0f0: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 75    set sourceId u
b100: 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20  nknown..        
b110: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
b120: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b130: 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74  Check if the ret
b140: 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f 75  urned Fossil sou
b150: 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  rce identifier w
b160: 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20  as null.  If..  
b170: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6f        #       so
b180: 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20 74  , make it easy t
b190: 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20  o spot...       
b1a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
b1b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
b1c0: 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
b1d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b1e0: 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
b1f0: 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ull..        }..
b200: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b210: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
b220: 2c 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72  , the SQLite cor
b230: 65 20 6c 69 62 72 61 72 79 20 61 70 70 65 61 72  e library appear
b240: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
b250: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
b260: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
b270: 61 69 6e 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20  aint SQLite.... 
b280: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
b290: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
b2a0: 73 20 22 79 65 73 20 28 22 20 24 76 65 72 73 69  s "yes (" $versi
b2b0: 6f 6e 20 22 20 22 20 24 73 6f 75 72 63 65 49 64  on " " $sourceId
b2c0: 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d   ")\n"]..      }
b2d0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
b2e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
b2f0: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
b300: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
b310: 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
b320: 49 6e 74 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65  Interop { channe
b330: 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  l } {..      tpu
b340: 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
b350: 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
b360: 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
b370: 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  sembly... ".... 
b380: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
b390: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
b3a0: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
b3b0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
b3c0: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
b3d0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
b3e0: 69 74 65 33 20 49 6e 74 65 72 6f 70 56 65 72 73  ite3 InteropVers
b3f0: 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 76 65 72  ion..      } ver
b400: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
b410: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b420: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
b430: 68 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75  heck if the retu
b440: 72 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73  rned version was
b450: 20 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d   null.  If so, m
b460: 61 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20  ake it easy..   
b470: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
b480: 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  spot...        #
b490: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
b4a0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
b4b0: 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
b4c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
b4d0: 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d  et version null.
b4e0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
b4f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b500: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
b510: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f   to query the Fo
b520: 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e  ssil source iden
b530: 74 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53  tifier for the S
b540: 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23  QLite..        #
b550: 20 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72         core libr
b560: 61 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ary...        #.
b570: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
b580: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
b590: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
b5a0: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
b5b0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
b5c0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b5d0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
b5e0: 65 72 6f 70 53 6f 75 72 63 65 49 64 0d 0a 20 20  eropSourceId..  
b5f0: 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
b600: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
b610: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b620: 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 66 61 69    # NOTE: We fai
b630: 6c 65 64 20 74 6f 20 71 75 65 72 79 20 74 68 65  led to query the
b640: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
b650: 64 65 6e 74 69 66 69 65 72 2e 0d 0a 20 20 20 20  dentifier...    
b660: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b670: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
b680: 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20  unknown..       
b690: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
b6a0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
b6b0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 72 65   Check if the re
b6c0: 74 75 72 6e 65 64 20 46 6f 73 73 69 6c 20 73 6f  turned Fossil so
b6d0: 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20  urce identifier 
b6e0: 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20  was null.  If.. 
b6f0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
b700: 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79 20  o, make it easy 
b710: 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20 20 20  to spot...      
b720: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
b730: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
b740: 24 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d  $sourceId] == 0}
b750: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b760: 20 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20     set sourceId 
b770: 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
b780: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b790: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65        # NOTE: Ye
b7a0: 73 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  s, the SQLite in
b7b0: 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61  terop assembly a
b7c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61  ppears to be ava
b7d0: 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
b7e0: 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
b7f0: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
b800: 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20 20 20 20  Interop....     
b810: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
b820: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
b830: 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22  es (" $version "
b840: 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c   " $sourceId ")\
b850: 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  n"]..      } els
b860: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
b870: 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
b880: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
b890: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
b8a0: 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65 66 69  eckForSQLiteDefi
b8b0: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 63 68 61  neConstant { cha
b8c0: 6e 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20  nnel name } {.. 
b8d0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b8e0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b8f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d  \..          "--
b900: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
b910: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
b920: 74 65 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  te define consta
b930: 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 5c 0d 0a  nt \"" $name \..
b940: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
b950: 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20   "]....      if 
b960: 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
b970: 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
b980: 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
b990: 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
b9a0: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
b9b0: 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65 66  Lite.SQLite3 Def
b9c0: 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  ineConstants..  
b9d0: 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
b9e0: 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
b9f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
ba00: 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
ba10: 20 2d 6e 6f 63 61 73 65 20 24 64 65 66 69 6e 65   -nocase $define
ba20: 43 6f 6e 73 74 61 6e 74 73 20 24 6e 61 6d 65 5d  Constants $name]
ba30: 20 21 3d 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a   != -1} then {..
ba40: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
ba50: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59         # NOTE: Y
ba60: 65 73 2c 20 74 68 69 73 20 64 65 66 69 6e 65 20  es, this define 
ba70: 63 6f 6e 73 74 61 6e 74 20 77 61 73 20 65 6e 61  constant was ena
ba80: 62 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6d 61  bled when the ma
ba90: 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20  naged..         
baa0: 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c   #       assembl
bab0: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d  y was compiled..
bac0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
bad0: 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
bae0: 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
baf0: 73 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  s defineConstant
bb00: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
bb10: 69 74 65 2e 20 24 6e 61 6d 65 5d 0d 0a 0d 0a 20  ite. $name].... 
bb20: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
bb30: 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
bb40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
bb50: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
bb60: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
bb70: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
bb80: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
bb90: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
bba0: 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20 20 20  l error\n..     
bbb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
bbc0: 20 20 70 72 6f 63 20 67 65 74 44 61 74 65 54 69    proc getDateTi
bbd0: 6d 65 46 6f 72 6d 61 74 20 7b 7d 20 7b 0d 0a 20  meFormat {} {.. 
bbe0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
bbf0: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
bc00: 64 75 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75  dure simply retu
bc10: 72 6e 73 20 74 68 65 20 22 64 65 66 61 75 6c 74  rns the "default
bc20: 22 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  " DateTime forma
bc30: 74 20 75 73 65 64 0d 0a 20 20 20 20 20 20 23 20  t used..      # 
bc40: 20 20 20 20 20 20 62 79 20 74 68 65 20 74 65 73        by the tes
bc50: 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
bc60: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
bc70: 66 6f 20 65 78 69 73 74 73 20 3a 3a 64 61 74 65  fo exists ::date
bc80: 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20 26 26 20  time_format] && 
bc90: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
bca0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64  ring length $::d
bcb0: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 5d 20  atetime_format] 
bcc0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
bcd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
bce0: 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74  # NOTE: Return t
bcf0: 68 65 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72  he manually over
bd00: 72 69 64 64 65 6e 20 76 61 6c 75 65 20 66 6f 72  ridden value for
bd10: 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 66 6f   the DateTime fo
bd20: 72 6d 61 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  rmat...        #
bd30: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
bd40: 20 24 3a 3a 64 61 74 65 74 69 6d 65 5f 66 6f 72   $::datetime_for
bd50: 6d 61 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mat..      } els
bd60: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
bd70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
bd80: 52 65 74 75 72 6e 20 61 6e 20 49 53 4f 38 36 30  Return an ISO860
bd90: 31 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61  1 DateTime forma
bda0: 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  t compatible wit
bdb0: 68 20 53 51 4c 69 74 65 2c 0d 0a 20 20 20 20 20  h SQLite,..     
bdc0: 20 20 20 23 20 20 20 20 20 20 20 53 79 73 74 65     #       Syste
bdd0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2c 20 61  m.Data.SQLite, a
bde0: 6e 64 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  nd suitable for 
bdf0: 72 6f 75 6e 64 2d 74 72 69 70 70 69 6e 67 20 77  round-tripping w
be00: 69 74 68 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ith the..       
be10: 20 23 20 20 20 20 20 20 20 44 61 74 65 54 69 6d   #       DateTim
be20: 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 66  e class of the f
be30: 72 61 6d 65 77 6f 72 6b 2e 20 20 49 66 20 74 68  ramework.  If th
be40: 69 73 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  is value is chan
be50: 67 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ged,..        # 
be60: 20 20 20 20 20 20 76 61 72 69 6f 75 73 20 74 65        various te
be70: 73 74 73 20 6d 61 79 20 66 61 69 6c 2e 0d 0a 20  sts may fail... 
be80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
be90: 20 20 72 65 74 75 72 6e 20 22 79 79 79 79 2d 4d    return "yyyy-M
bea0: 4d 2d 64 64 20 48 48 3a 6d 6d 3a 73 73 2e 46 46  M-dd HH:mm:ss.FF
beb0: 46 46 46 46 46 4b 22 0d 0a 20 20 20 20 20 20 7d  FFFFFK"..      }
bec0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
bed0: 70 72 6f 63 20 65 6e 75 6d 65 72 61 62 6c 65 54  proc enumerableT
bee0: 6f 4c 69 73 74 20 7b 20 65 6e 75 6d 65 72 61 62  oList { enumerab
bef0: 6c 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  le } {..      se
bf00: 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
bf10: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
bf20: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 6e 75  ring length $enu
bf30: 6d 65 72 61 62 6c 65 5d 20 3d 3d 20 30 20 7c 7c  merable] == 0 ||
bf40: 20 24 65 6e 75 6d 65 72 61 62 6c 65 20 65 71 20   $enumerable eq 
bf50: 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
bf60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
bf70: 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d  result..      }.
bf80: 0a 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20  ...      object 
bf90: 66 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 69  foreach -alias i
bfa0: 74 65 6d 20 24 65 6e 75 6d 65 72 61 62 6c 65 20  tem $enumerable 
bfb0: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {..        if {[
bfc0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 69  string length $i
bfd0: 74 65 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  tem] > 0} then {
bfe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70  ..          lapp
bff0: 65 6e 64 20 72 65 73 75 6c 74 20 5b 24 69 74 65  end result [$ite
c000: 6d 20 54 6f 53 74 72 69 6e 67 5d 0d 0a 20 20 20  m ToString]..   
c010: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
c020: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
c030: 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
c040: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63  ...    proc catc
c050: 68 41 6e 64 52 65 74 75 72 6e 20 7b 20 73 63 72  hAndReturn { scr
c060: 69 70 74 20 7b 73 74 61 63 6b 54 72 61 63 65 20  ipt {stackTrace 
c070: 66 61 6c 73 65 7d 20 7b 73 74 72 69 63 74 20 74  false} {strict t
c080: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
c090: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
c0a0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73 63   Evaluate the sc
c0b0: 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
c0c0: 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20 74   our caller in t
c0d0: 68 65 69 72 20 63 6f 6e 74 65 78 74 2c 0d 0a 20  heir context,.. 
c0e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 70       #       cap
c0f0: 74 75 72 69 6e 67 20 62 6f 74 68 20 74 68 65 20  turing both the 
c100: 72 65 73 75 6c 74 20 61 6e 64 20 74 68 65 20 72  result and the r
c110: 65 74 75 72 6e 20 63 6f 64 65 2e 0d 0a 20 20 20  eturn code...   
c120: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
c130: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c  code [catch {upl
c140: 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20  evel 1 $script} 
c150: 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20 20 20 20 20  result]....     
c160: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
c170: 3a 20 44 69 64 20 74 68 65 20 73 63 72 69 70 74  : Did the script
c180: 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72   provided by our
c190: 20 63 61 6c 6c 65 72 20 4e 4f 54 20 72 61 69 73   caller NOT rais
c1a0: 65 20 61 6e 20 65 72 72 6f 72 3f 0d 0a 20 20 20  e an error?..   
c1b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
c1c0: 24 73 74 72 69 63 74 20 26 26 20 24 63 6f 64 65  $strict && $code
c1d0: 20 3d 3d 20 30 20 7c 7c 20 21 24 73 74 72 69 63   == 0 || !$stric
c1e0: 74 20 26 26 20 24 63 6f 64 65 20 21 3d 20 31 7d  t && $code != 1}
c1f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c200: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c210: 54 45 3a 20 53 75 63 63 65 73 73 2e 20 20 52 65  TE: Success.  Re
c220: 74 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68  turn a list with
c230: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
c240: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 2e   and the result.
c250: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
c260: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
c270: 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74 5d  t $code $result]
c280: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
c290: 20 7b 24 73 74 61 63 6b 54 72 61 63 65 7d 20 74   {$stackTrace} t
c2a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
c2b0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
c2c0: 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75 72 20  : Failure.  Our 
c2d0: 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61 20 66  caller wants a f
c2e0: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
c2f0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
c300: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
c310: 20 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20    return a list 
c320: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
c330: 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
c340: 75 6c 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20  ult verbatim... 
c350: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c360: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
c370: 63 6f 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20  code $result].. 
c380: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
c390: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c3a0: 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72    # NOTE: Failur
c3b0: 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72 20 64  e.  Our caller d
c3c0: 6f 65 73 20 6e 6f 74 20 77 61 6e 74 20 61 20 66  oes not want a f
c3d0: 75 6c 6c 20 73 74 61 63 6b 20 74 72 61 63 65 20  ull stack trace 
c3e0: 28 69 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20  (if..        #  
c3f0: 20 20 20 20 20 61 70 70 6c 69 63 61 62 6c 65 29       applicable)
c400: 2c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  , return a list 
c410: 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
c420: 63 6f 64 65 2c 20 74 68 65 20 65 72 72 6f 72 0d  code, the error.
c430: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
c440: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
c450: 74 65 72 70 72 65 74 65 72 2c 20 61 6e 64 20 74  terpreter, and t
c460: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
c470: 20 75 70 20 74 6f 20 74 68 65 0d 0a 20 20 20 20   up to the..    
c480: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69 6e      #       poin
c490: 74 20 77 68 65 72 65 20 74 68 65 20 73 74 61 63  t where the stac
c4a0: 6b 20 74 72 61 63 65 20 73 68 6f 75 6c 64 20 73  k trace should s
c4b0: 74 61 72 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  tart...        #
c4c0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 69 6e  ..        set in
c4d0: 64 65 78 20 5b 73 74 72 69 6e 67 20 66 69 72 73  dex [string firs
c4e0: 74 20 22 20 20 20 61 74 20 22 20 24 72 65 73 75  t "   at " $resu
c4f0: 6c 74 5d 3b 20 23 20 48 41 43 4b 3a 20 52 65 6c  lt]; # HACK: Rel
c500: 69 61 62 6c 65 3f 0d 0a 0d 0a 20 20 20 20 20 20  iable?....      
c510: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24    return [list $
c520: 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 43 6f 64  code $::errorCod
c530: 65 20 5b 65 78 70 72 20 7b 24 69 6e 64 65 78 20  e [expr {$index 
c540: 21 3d 20 2d 31 20 3f 20 5c 0d 0a 20 20 20 20 20  != -1 ? \..     
c550: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 74         [string t
c560: 72 69 6d 20 5b 73 74 72 69 6e 67 20 72 61 6e 67  rim [string rang
c570: 65 20 24 72 65 73 75 6c 74 20 30 20 24 69 6e 64  e $result 0 $ind
c580: 65 78 5d 5d 20 3a 20 24 72 65 73 75 6c 74 7d 5d  ex]] : $result}]
c590: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
c5a0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
c5b0: 6f 6d 70 69 6c 65 43 53 68 61 72 70 57 69 74 68  ompileCSharpWith
c5c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c5d0: 74 65 78 74 20 6d 65 6d 6f 72 79 20 73 79 6d 62  text memory symb
c5e0: 6f 6c 73 20 73 74 72 69 63 74 20 72 65 73 75 6c  ols strict resul
c5f0: 74 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72 73  tsVarName errors
c600: 56 61 72 4e 61 6d 65 20 66 69 6c 65 4e 61 6d 65  VarName fileName
c610: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  s..            a
c620: 72 67 73 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  rgs } {..      #
c630: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
c640: 53 69 6e 63 65 20 77 65 20 61 72 65 20 67 6f 69  Since we are goi
c650: 6e 67 20 74 6f 20 75 73 65 20 74 68 69 73 20 6d  ng to use this m
c660: 65 74 68 6f 64 20 6e 61 6d 65 20 61 20 6c 6f 74  ethod name a lot
c670: 2c 20 61 73 73 69 67 6e 20 69 74 20 74 6f 20 61  , assign it to a
c680: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
c690: 76 61 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d  variable first..
c6a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c6b0: 73 65 74 20 61 64 64 20 52 65 66 65 72 65 6e 63  set add Referenc
c6c0: 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41 64 64  edAssemblies.Add
c6d0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
c6e0: 20 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74     # NOTE: Creat
c6f0: 65 20 74 68 65 20 62 61 73 65 20 63 6f 6d 6d 61  e the base comma
c700: 6e 64 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  nd to evaluate a
c710: 6e 64 20 61 64 64 20 74 68 65 20 70 72 6f 70 65  nd add the prope
c720: 72 74 79 20 73 65 74 74 69 6e 67 73 0d 0a 20 20  rty settings..  
c730: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
c740: 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
c750: 79 73 20 6e 65 65 64 65 64 20 62 79 20 6f 75 72  ys needed by our
c760: 20 75 6e 69 74 20 74 65 73 74 73 20 28 69 2e 65   unit tests (i.e
c770: 2e 20 74 68 65 20 53 79 73 74 65 6d 0d 0a 20 20  . the System..  
c780: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
c790: 53 79 73 74 65 6d 2e 44 61 74 61 20 61 73 73 65  System.Data asse
c7a0: 6d 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 29  mbly references)
c7b0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
c7c0: 20 20 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c    set command [l
c7d0: 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
c7e0: 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24   compileCSharp $
c7f0: 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79  text $memory $sy
c800: 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65  mbols $strict re
c810: 73 75 6c 74 73 20 65 72 72 6f 72 73 20 5c 0d 0a  sults errors \..
c820: 20 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53            $add S
c830: 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64 20 53  ystem.dll $add S
c840: 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c 20 24  ystem.Data.dll $
c850: 61 64 64 20 53 79 73 74 65 6d 2e 54 72 61 6e 73  add System.Trans
c860: 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 5c 0d 0a 20  actions.dll \.. 
c870: 20 20 20 20 20 20 20 20 20 24 61 64 64 20 53 79           $add Sy
c880: 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d  stem.Xml.dll]...
c890: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c8a0: 23 20 4e 4f 54 45 3a 20 41 64 64 20 61 6c 6c 20  # NOTE: Add all 
c8b0: 74 68 65 20 70 72 6f 76 69 64 65 64 20 66 69 6c  the provided fil
c8c0: 65 20 6e 61 6d 65 73 20 61 73 20 61 73 73 65 6d  e names as assem
c8d0: 62 6c 79 20 72 65 66 65 72 65 6e 63 65 73 2e 0d  bly references..
c8e0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c8f0: 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
c900: 20 24 66 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20   $fileNames {.. 
c910: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63         lappend c
c920: 6f 6d 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74  ommand $add [get
c930: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
c940: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
c950: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
c960: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64       # NOTE: Add
c970: 20 74 68 65 20 65 78 74 72 61 20 61 72 67 75 6d   the extra argum
c980: 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ents, if any, to
c990: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
c9a0: 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20  evaluate...     
c9b0: 20 23 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 6c   #..      eval l
c9c0: 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64 20 24  append command $
c9d0: 61 72 67 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  args....      #.
c9e0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
c9f0: 6c 69 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 65  lias the compile
ca00: 72 20 6c 6f 63 61 6c 20 72 65 73 75 6c 74 73 20  r local results 
ca10: 61 6e 64 20 65 72 72 6f 72 73 20 76 61 72 69 61  and errors varia
ca20: 62 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  bles to the..   
ca30: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
ca40: 62 6c 65 20 6e 61 6d 65 73 20 70 72 6f 76 69 64  ble names provid
ca50: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
ca60: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ca70: 20 20 75 70 76 61 72 20 31 20 24 72 65 73 75 6c    upvar 1 $resul
ca80: 74 73 56 61 72 4e 61 6d 65 20 72 65 73 75 6c 74  tsVarName result
ca90: 73 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  s..      upvar 1
caa0: 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d 65 20   $errorsVarName 
cab0: 65 72 72 6f 72 73 0d 0a 0d 0a 20 20 20 20 20 20  errors....      
cac0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
cad0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f   Evaluate the co
cae0: 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69  nstructed [compi
caf0: 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e  leCSharp] comman
cb00: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
cb10: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
cb20: 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23  result...      #
cb30: 0d 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f  ..      eval $co
cb40: 6d 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  mmand..    }....
cb50: 0a 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f  .    proc isMemo
cb60: 72 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  ryDb { fileName 
cb70: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
cb80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74      # NOTE: Is t
cb90: 68 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74  he specified dat
cba0: 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
cbb0: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d  really an in-mem
cbc0: 6f 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20  ory database?.. 
cbd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
cbe0: 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c  turn [expr {$fil
cbf0: 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72  eName eq ":memor
cc00: 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  y:" || \..      
cc10: 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67      [string rang
cc20: 65 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32  e $fileName 0 12
cc30: 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f  ] eq "file::memo
cc40: 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c  ry:"}]..    }...
cc50: 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62  ..    proc isTab
cc60: 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76  leInDb { name {v
cc70: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
cc80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
cc90: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
cca0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
ccb0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
ccc0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
ccd0: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
cce0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
ccf0: 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   It contains the
cd00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
cd10: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74  tion handle that
cd20: 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20   will be..      
cd30: 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20  #       used to 
cd40: 65 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72  execute the quer
cd50: 79 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  y used to determ
cd60: 69 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ine if the named
cd70: 20 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20   table is..     
cd80: 20 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74   #       present
cd90: 20 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73   in that databas
cda0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
cdb0: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
cdc0: 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20  ame db....      
cdd0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
cde0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f   Use the sqlite_
cdf0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20  master table to 
ce00: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
ce10: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d   named table is.
ce20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
ce30: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61  resent in the da
ce40: 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
ce50: 0d 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20  ..      set sql 
ce60: 7b 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  {..        SELEC
ce70: 54 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20  T COUNT(*) FROM 
ce80: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
ce90: 45 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c  ERE type = 'tabl
cea0: 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b  e' AND name = ?;
ceb0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cec0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
ced0: 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  TE: Return non-z
cee0: 65 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ero if the named
cef0: 20 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e   table is presen
cf00: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
cf10: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
cf20: 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20  {..        [sql 
cf30: 65 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65  execute -execute
cf40: 20 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c   scalar $db $sql
cf50: 20 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74   [list param1 St
cf60: 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30  ring $name]] > 0
cf70: 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20  ..      }]..    
cf80: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
cf90: 72 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b  rimSql { sql } {
cfa0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
cfb0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b  regsub -all -- {
cfc0: 5c 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69  \s+} [string tri
cfd0: 6d 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20  m $sql] " "]..  
cfe0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
cff0: 20 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71   executeSql { sq
d000: 6c 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d  l {execute none}
d010: 20 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b   {format none} {
d020: 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  fileName ""} } {
d030: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
d040: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
d050: 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
d060: 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a   {set fileName :
d070: 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20  memory:}..      
d080: 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  setupDb $fileNam
d090: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
d0a0: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
d0b0: 73 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65  se false db true
d0c0: 0d 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d  ....      try {.
d0d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d0e0: 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
d0f0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d100: 73 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65  sql execute -exe
d110: 63 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66  cute $execute -f
d120: 6f 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64  ormat $format $d
d130: 62 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20  b $sql]]..      
d140: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20  } finally {..   
d150: 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24       cleanupDb $
d160: 66 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73  fileName db fals
d170: 65 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20  e false false.. 
d180: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
d190: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f  ..    proc getCo
d1a0: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20  nnectionFlags { 
d1b0: 66 69 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b  fileName flags {
d1c0: 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
d1d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
d1e0: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
d1f0: 6f 75 74 20 77 68 69 63 68 20 64 61 74 61 62 61  out which databa
d200: 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20  se file name or 
d210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
d220: 67 20 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23  g these..      #
d230: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
d240: 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74  n flags will act
d250: 75 61 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20  ually apply to. 
d260: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63   This is not nec
d270: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20  essary..      # 
d280: 20 20 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d        in quiet m
d290: 6f 64 65 20 62 65 63 61 75 73 65 20 74 68 69 73  ode because this
d2a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d2b0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  only used for lo
d2c0: 67 67 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20  gging..      #  
d2d0: 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69       and reporti
d2e0: 6e 67 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20  ng purposes...  
d2f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
d300: 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
d310: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73  ..        if {[s
d320: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69  tring length $fi
d330: 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  leName] > 0} the
d340: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
d350: 65 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70  et database [app
d360: 65 6e 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61  endArgs "file na
d370: 6d 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  me \"" $fileName
d380: 20 5c 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20   \"]..        } 
d390: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
d3a0: 69 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63  ists ::dataSourc
d3b0: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
d3c0: 20 20 20 20 20 21 5b 61 72 72 61 79 20 65 78 69       ![array exi
d3d0: 73 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65  sts ::dataSource
d3e0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
d3f0: 20 20 20 20 20 73 65 74 20 64 61 74 61 62 61 73       set databas
d400: 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64  e [appendArgs "d
d410: 61 74 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24  ata source \"" $
d420: 3a 3a 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d  ::dataSource \"]
d430: 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
d440: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
d450: 74 20 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e  t database <unkn
d460: 6f 77 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d  own>..        }.
d470: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d480: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
d490: 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67  E: Show (and log
d4a0: 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  ) the local conn
d4b0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64  ection flags and
d4c0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0d   the associated.
d4d0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
d4e0: 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66 69  ata source or fi
d4f0: 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  le name...      
d500: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  #..      if {!$q
d510: 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
d520: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
d530: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
d540: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
d550: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 63         "---- loc
d560: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  al connection fl
d570: 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
d580: 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
d590: 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78 70     " are: " [exp
d5a0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
d5b0: 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f 20  h $flags] > 0 ? 
d5c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
d5d0: 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66  appendArgs \" $f
d5e0: 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
d5f0: 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
d600: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
d610: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
d620: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c  there are any gl
d630: 6f 62 61 6c 20 28 70 65 72 20 74 65 73 74 20 72  obal (per test r
d640: 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  un) connection f
d650: 6c 61 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a  lags currently..
d660: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
d670: 74 2c 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20  t, use them now 
d680: 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69  (i.e. by combini
d690: 6e 67 20 74 68 65 6d 20 77 69 74 68 20 74 68 65  ng them with the
d6a0: 20 6f 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a   ones for this..
d6b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
d6c0: 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20  nnection)...    
d6d0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
d6e0: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f  info exists ::co
d6f0: 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20  nnection_flags] 
d700: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
d710: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
d720: 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61  ::connection_fla
d730: 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  gs] > 0} then {.
d740: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d750: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
d760: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 64   (and log) the d
d770: 65 74 65 63 74 65 64 20 67 6c 6f 62 61 6c 20 63  etected global c
d780: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e  onnection flags.
d790: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d7a0: 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
d7b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d7c0: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
d7d0: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
d7e0: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
d7f0: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f         "---- glo
d800: 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
d810: 6c 61 67 73 20 64 65 74 65 63 74 65 64 3a 20 22  lags detected: "
d820: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d830: 20 20 5b 65 78 70 72 20 7b 5b 69 6e 66 6f 20 65    [expr {[info e
d840: 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69  xists ::connecti
d850: 6f 6e 5f 66 6c 61 67 73 5d 20 26 26 20 5c 0d 0a  on_flags] && \..
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
d870: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
d880: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
d890: 5d 20 3e 20 30 20 3f 20 5c 0d 0a 20 20 20 20 20  ] > 0 ? \..     
d8a0: 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
d8b0: 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e 65  Args \" $::conne
d8c0: 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d 20  ction_flags \"] 
d8d0: 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
d8e0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
d8f0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d900: 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e    # NOTE: Combin
d910: 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65  e and/or replace
d920: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
d930: 66 6c 61 67 73 20 61 6e 64 20 74 68 65 6e 20 73  flags and then s
d940: 68 6f 77 20 74 68 65 0d 0a 20 20 20 20 20 20 20  how the..       
d950: 20 23 20 20 20 20 20 20 20 6e 65 77 20 76 61 6c   #       new val
d960: 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ue...        #..
d970: 20 20 20 20 20 20 20 20 73 65 74 20 66 6c 61 67          set flag
d980: 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20  s [combineFlags 
d990: 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63  $flags $::connec
d9a0: 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20  tion_flags].... 
d9b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d9c0: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
d9d0: 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6e 65 77  and log) the new
d9e0: 20 65 66 66 65 63 74 69 76 65 20 63 6f 6e 6e 65   effective conne
d9f0: 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20  ction flags...  
da00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
da10: 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
da20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
da30: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
da40: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
da50: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
da60: 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e 65     "---- combine
da70: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  d connection fla
da80: 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61  gs for " $databa
da90: 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  se \..          
daa0: 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
dab0: 70 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  pr {[string leng
dac0: 74 68 20 24 66 6c 61 67 73 5d 20 3e 20 30 20 3f  th $flags] > 0 ?
dad0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
dae0: 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
daf0: 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c   $flags \"] : "<
db00: 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  none>"}] \n]..  
db10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
db20: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
db30: 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d 0a   $flags..    }..
db40: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 46  ...    proc getF
db50: 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20 7b  lagsProperty { {
db60: 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65 74  flags ""} {quiet
db70: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
db80: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
db90: 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  TE: Determine wh
dba0: 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  at the combined 
dbb0: 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63 61  (global and loca
dbc0: 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  l) connection.. 
dbd0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c 61       #       fla
dbe0: 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70 6f  gs should be, po
dbf0: 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e 0d  ssibly quietly..
dc00: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
dc10: 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f  set flags [getCo
dc20: 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22 22  nnectionFlags ""
dc30: 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d   $flags $quiet].
dc40: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
dc50: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 20    # NOTE: If no 
dc60: 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c 20  global or local 
dc70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
dc80: 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64 2c   were specified,
dc90: 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
dca0: 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e      default conn
dcb0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68 6f  ection flags sho
dcc0: 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68 65  uld be used; the
dcd0: 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d 0a  refore, return..
dce0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
dcf0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 6e   empty string in
dd00: 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20 20   that case...   
dd10: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
dd20: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
dd30: 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  flags] == 0} the
dd40: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
dd50: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
dd60: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
dd70: 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72 64    # NOTE: In ord
dd80: 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  er to check if t
dd90: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65  he default conne
dda0: 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 20  ction flags are 
ddb0: 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20 20  being used..    
ddc0: 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73 20    #       it is 
ddd0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74 74  necessary to att
dde0: 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69 6f  empt a conversio
ddf0: 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c 20  n to the actual 
de00: 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20 20  enumerated..    
de10: 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e 20    #       type. 
de20: 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20 74   Failing that, t
de30: 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73 74  he check against
de40: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
de50: 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20  ue will be..    
de60: 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70 65    #       skippe
de70: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
de80: 20 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c     set error nul
de90: 6c 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 20 20  l; # IGNORED..  
dea0: 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6f      set value [o
deb0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
dec0: 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
ded0: 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
dee0: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
def0: 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
df00: 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20  ConnectionFlags 
df10: 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c 20 74  "" $flags null t
df20: 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rue \..         
df30: 20 65 72 72 6f 72 5d 0d 0a 0d 0a 20 20 20 20 20   error]....     
df40: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
df50: 3a 20 49 66 20 74 68 65 20 63 6f 6d 62 69 6e 65  : If the combine
df60: 64 20 66 6c 61 67 73 20 73 74 72 69 6e 67 20 63  d flags string c
df70: 6f 75 6c 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ould not actuall
df80: 79 20 62 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a  y be converted..
df90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
dfa0: 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20   the enumerated 
dfb0: 74 79 70 65 20 69 74 20 69 73 20 74 68 65 20 64  type it is the d
dfc0: 65 66 61 75 6c 74 20 76 61 6c 75 65 2c 20 74 68  efault value, th
dfd0: 65 6e 20 6a 75 73 74 20 75 73 65 0d 0a 20 20 20  en just use..   
dfe0: 20 20 20 23 20 20 20 20 20 20 20 69 74 20 76 65     #       it ve
dff0: 72 62 61 74 69 6d 3b 20 6f 74 68 65 72 77 69 73  rbatim; otherwis
e000: 65 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61  e, just return a
e010: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
e020: 20 49 6e 20 74 68 61 74 0d 0a 20 20 20 20 20 20   In that..      
e030: 23 20 20 20 20 20 20 20 63 61 73 65 2c 20 74 68  #       case, th
e040: 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63  e default connec
e050: 74 69 6f 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20  tion flags will 
e060: 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20  be used...      
e070: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
e080: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
e090: 75 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c  ue] == 0 || $val
e0a0: 75 65 20 6e 65 20 22 44 65 66 61 75 6c 74 22 7d  ue ne "Default"}
e0b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
e0c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 57 41   #..        # WA
e0d0: 52 4e 49 4e 47 3a 20 54 68 69 73 20 72 65 74 75  RNING: This retu
e0e0: 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 76  rns the string v
e0f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 63 6f 6d 62  alue of the comb
e100: 69 6e 65 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d  ined flags, not.
e110: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
e120: 20 20 20 20 74 68 65 20 65 6e 75 6d 65 72 61 74      the enumerat
e130: 65 64 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ed value.  This 
e140: 69 73 20 62 79 20 64 65 73 69 67 6e 20 61 6e 64  is by design and
e150: 20 73 68 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20   should not..   
e160: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20       #          
e170: 62 65 20 63 68 61 6e 67 65 64 20 77 69 74 68 6f  be changed witho
e180: 75 74 20 63 61 72 65 66 75 6c 20 63 6f 6e 73 69  ut careful consi
e190: 64 65 72 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69  deration (e.g. i
e1a0: 74 20 77 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20  t would..       
e1b0: 20 23 20 20 20 20 20 20 20 20 20 20 70 72 65 76   #          prev
e1c0: 65 6e 74 20 74 68 65 20 53 51 4c 69 74 65 43 6f  ent the SQLiteCo
e1d0: 6e 6e 65 63 74 69 6f 6e 20 63 6c 61 73 73 20 66  nnection class f
e1e0: 72 6f 6d 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76  rom allowing inv
e1f0: 61 6c 69 64 0d 0a 20 20 20 20 20 20 20 20 23 20  alid..        # 
e200: 20 20 20 20 20 20 20 20 20 5b 22 6d 61 67 69 63           ["magic
e210: 61 6c 22 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29  al"] meta-flags)
e220: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
e230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 61 70        return [ap
e240: 70 65 6e 64 41 72 67 73 20 22 46 6c 61 67 73 3d  pendArgs "Flags=
e250: 22 20 24 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20  " $flags \;]..  
e260: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
e270: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d  eturn ""..    }.
e280: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74  ....    proc set
e290: 75 70 44 62 20 7b 0d 0a 20 20 20 20 20 20 20 20  upDb {..        
e2a0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f      fileName {mo
e2b0: 64 65 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  de ""} {dateTime
e2c0: 46 6f 72 6d 61 74 20 22 22 7d 20 7b 64 61 74 65  Format ""} {date
e2d0: 54 69 6d 65 4b 69 6e 64 20 22 22 7d 20 7b 66 6c  TimeKind ""} {fl
e2e0: 61 67 73 20 22 22 7d 0d 0a 20 20 20 20 20 20 20  ags ""}..       
e2f0: 20 20 20 20 20 7b 65 78 74 72 61 20 22 22 7d 20       {extra ""} 
e300: 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d 20 7b  {qualify true} {
e310: 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7b 75 72  delete true} {ur
e320: 69 20 66 61 6c 73 65 7d 0d 0a 20 20 20 20 20 20  i false}..      
e330: 20 20 20 20 20 20 7b 74 65 6d 70 6f 72 61 72 79        {temporary
e340: 20 74 72 75 65 7d 20 7b 76 61 72 4e 61 6d 65 20   true} {varName 
e350: 64 62 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  db} {quiet false
e360: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
e370: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69        # NOTE: Fi
e380: 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20  rst, see if our 
e390: 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65  caller has reque
e3a0: 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sted an in-memor
e3b0: 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20  y database...   
e3c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
e3d0: 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f  isMemory [isMemo
e3e0: 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ryDb $fileName].
e3f0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
e400: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
e410: 77 2c 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61  w, all test data
e420: 62 61 73 65 73 20 75 73 65 64 20 62 79 20 74 68  bases used by th
e430: 65 20 74 65 73 74 20 73 75 69 74 65 20 61 72 65  e test suite are
e440: 20 70 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23   placed..      #
e450: 20 20 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20         into the 
e460: 64 61 74 61 62 61 73 65 20 64 69 72 65 63 74 6f  database directo
e470: 72 79 2e 20 20 45 61 63 68 20 64 61 74 61 62 61  ry.  Each databa
e480: 73 65 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66  se and related f
e490: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
e4a0: 20 20 20 20 75 73 65 64 20 62 79 20 61 20 74 65      used by a te
e4b0: 73 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65  st should be cle
e4c0: 61 6e 65 64 20 75 70 20 62 79 20 74 68 61 74 20  aned up by that 
e4d0: 74 65 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a  test using the..
e4e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 63        #       "c
e4f0: 6c 65 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64  leanupDb" proced
e500: 75 72 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20  ure, below...   
e510: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e520: 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71  !$isMemory && $q
e530: 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a  ualify} then {..
e540: 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65          set file
e550: 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
e560: 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65  [getDatabaseDire
e570: 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69  ctory] [file tai
e580: 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20  l $fileName]].. 
e590: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
e5a0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
e5b0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c   By default, del
e5c0: 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
e5d0: 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
e5e0: 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
e5f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
e600: 6e 61 6d 65 20 69 66 20 69 74 20 63 75 72 72 65  name if it curre
e610: 6e 74 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20  ntly exists...  
e620: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
e630: 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
e640: 64 65 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20  delete && [file 
e650: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
e660: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
e670: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
e680: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
e690: 20 64 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d   delete any pre-
e6a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
e6b0: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
e6c0: 66 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  file..        # 
e6d0: 20 20 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20        name...   
e6e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e6f0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65  if {[catch {file
e700: 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
e710: 65 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20  e} error]} then 
e720: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
e730: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
e740: 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69  : We somehow fai
e750: 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68  led to delete th
e760: 65 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77  e file, report w
e770: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
e780: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
e790: 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
e7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
e7b0: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
e7c0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
e7d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e7e0: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
e7f0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
e800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e810: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d  \"" $fileName \.
e820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e830: 20 22 5c 22 20 64 75 72 69 6e 67 20 73 65 74 75   "\" during setu
e840: 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
e850: 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
e860: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
e870: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
e880: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e890: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
e8a0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
e8b0: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
e8c0: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
e8d0: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
e8e0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
e8f0: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
e900: 68 65 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61  he opened databa
e910: 73 65 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  se will be store
e920: 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
e930: 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
e940: 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a   $varName db....
e950: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e960: 20 4e 4f 54 45 3a 20 53 74 61 72 74 20 62 75 69   NOTE: Start bui
e970: 6c 64 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  lding the connec
e980: 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 54 68  tion string.  Th
e990: 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  e only required 
e9a0: 70 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23  portion..      #
e9b0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
e9c0: 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
e9d0: 69 73 20 74 68 65 20 64 61 74 61 20 73 6f 75 72  is the data sour
e9e0: 63 65 2c 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ce, which contai
e9f0: 6e 73 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ns the..      # 
ea00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
ea10: 69 6c 65 20 6e 61 6d 65 20 69 74 73 65 6c 66 2e  ile name itself.
ea20: 20 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20    If our caller 
ea30: 77 61 6e 74 73 20 74 6f 20 75 73 65 20 61 20 55  wants to use a U
ea40: 52 49 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20  RI as..      #  
ea50: 20 20 20 20 20 74 68 65 20 64 61 74 61 20 73 6f       the data so
ea60: 75 72 63 65 2c 20 75 73 65 20 74 68 65 20 46 75  urce, use the Fu
ea70: 6c 6c 55 72 69 20 63 6f 6e 6e 65 63 74 69 6f 6e  llUri connection
ea80: 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79   string property
ea90: 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   to..      #    
eaa0: 20 20 20 70 72 65 76 65 6e 74 20 74 68 65 20 64     prevent the d
eab0: 61 74 61 20 73 6f 75 72 63 65 20 73 74 72 69 6e  ata source strin
eac0: 67 20 66 72 6f 6d 20 62 65 69 6e 67 20 6d 61 6e  g from being man
ead0: 67 6c 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  gled...      #..
eae0: 20 20 20 20 20 20 69 66 20 7b 24 75 72 69 7d 20        if {$uri} 
eaf0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
eb00: 73 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  set connection {
eb10: 46 75 6c 6c 55 72 69 3d 24 7b 66 69 6c 65 4e 61  FullUri=${fileNa
eb20: 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  me}}..      } el
eb30: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
eb40: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 44 61  t connection {Da
eb50: 74 61 20 53 6f 75 72 63 65 3d 24 7b 66 69 6c 65  ta Source=${file
eb60: 4e 61 6d 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d  Name}}..      }.
eb70: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
eb80: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
eb90: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 68  this procedure h
eba0: 61 73 20 6e 6f 20 73 70 65 63 69 61 6c 20 6b 6e  as no special kn
ebb0: 6f 77 6c 65 64 67 65 20 6f 66 20 77 68 61 74 20  owledge of what 
ebc0: 74 68 65 20 64 65 66 61 75 6c 74 0d 0a 20 20 20  the default..   
ebd0: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69     #       setti
ebe0: 6e 67 20 69 73 20 66 6f 72 20 74 68 65 20 54 6f  ng is for the To
ebf0: 46 75 6c 6c 50 61 74 68 20 63 6f 6e 6e 65 63 74  FullPath connect
ec00: 69 6f 6e 20 73 74 72 69 6e 67 20 70 72 6f 70 65  ion string prope
ec10: 72 79 2c 20 61 6c 77 61 79 73 0d 0a 20 20 20 20  ry, always..    
ec20: 20 20 23 20 20 20 20 20 20 20 61 64 64 20 74 68    #       add th
ec30: 65 20 76 61 6c 75 65 20 77 65 20 6b 6e 6f 77 20  e value we know 
ec40: 61 62 6f 75 74 20 74 6f 20 74 68 65 20 63 6f 6e  about to the con
ec50: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e 0d  nection string..
ec60: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ec70: 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f  append connectio
ec80: 6e 20 7b 3b 54 6f 46 75 6c 6c 50 61 74 68 3d 24  n {;ToFullPath=$
ec90: 7b 71 75 61 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20  {qualify}}....  
eca0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ecb0: 4f 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c  OTE: If our call
ecc0: 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20 6a  er specified a j
ecd0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 61 64 64  ournal mode, add
ece0: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
ecf0: 6f 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ortion..      # 
ed00: 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e        of the con
ed10: 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
ed20: 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
ed30: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
ed40: 6c 65 6e 67 74 68 20 24 6d 6f 64 65 5d 20 3e 20  length $mode] > 
ed50: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
ed60: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
ed70: 74 69 6f 6e 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d  tion {;Journal M
ed80: 6f 64 65 3d 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20  ode=${mode}}..  
ed90: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
eda0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
edb0: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
edc0: 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69  ecified a DateTi
edd0: 6d 65 20 66 6f 72 6d 61 74 2c 20 61 64 64 20 74  me format, add t
ede0: 68 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20  he necessary..  
edf0: 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 72 74      #       port
ee00: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
ee10: 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77  ction string now
ee20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ee30: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
ee40: 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 46 6f  ngth $dateTimeFo
ee50: 72 6d 61 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20  rmat] > 0} then 
ee60: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
ee70: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44  d connection {;D
ee80: 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 3d 24 7b  ateTimeFormat=${
ee90: 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 7d 7d  dateTimeFormat}}
eea0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
eeb0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
eec0: 54 45 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65  TE: If our calle
eed0: 72 20 73 70 65 63 69 66 69 65 64 20 61 20 44 61  r specified a Da
eee0: 74 65 54 69 6d 65 4b 69 6e 64 2c 20 61 64 64 20  teTimeKind, add 
eef0: 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 6f  the necessary po
ef00: 72 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  rtion..      #  
ef10: 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e       of the conn
ef20: 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f  ection string no
ef30: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
ef40: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
ef50: 65 6e 67 74 68 20 24 64 61 74 65 54 69 6d 65 4b  ength $dateTimeK
ef60: 69 6e 64 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ind] > 0} then {
ef70: 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ..        append
ef80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61   connection {;Da
ef90: 74 65 54 69 6d 65 4b 69 6e 64 3d 24 7b 64 61 74  teTimeKind=${dat
efa0: 65 54 69 6d 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20  eTimeKind}}..   
efb0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
efc0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
efd0: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
efe0: 68 65 20 66 69 6e 61 6c 20 66 6c 61 67 73 20 66  he final flags f
eff0: 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  or this connecti
f000: 6f 6e 20 6e 65 65 64 20 74 6f 20 62 65 2e 0d 0a  on need to be...
f010: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
f020: 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43 6f 6e  et flags [getCon
f030: 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 24 66 69  nectionFlags $fi
f040: 6c 65 4e 61 6d 65 20 24 66 6c 61 67 73 20 24 71  leName $flags $q
f050: 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23  uiet]....      #
f060: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f070: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
f080: 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c  ecified some SQL
f090: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
f0a0: 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20  gs, add the..   
f0b0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73     #       neces
f0c0: 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20  sary portion of 
f0d0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
f0e0: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
f0f0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
f100: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
f110: 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  lags] > 0} then 
f120: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
f130: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46  d connection {;F
f140: 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a  lags=${flags}}..
f150: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f160: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f170: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
f180: 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74  specified an ext
f190: 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68  ra payload to th
f1a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
f1b0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
f1c0: 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f  ng, append it no
f1d0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
f1e0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
f1f0: 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20  ength $extra] > 
f200: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f210: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
f220: 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a  tion \; $extra..
f230: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f240: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f250: 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62  : Open the datab
f260: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  ase connection n
f270: 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20  ow, placing the 
f280: 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61  opaque handle va
f290: 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  lue..      #    
f2a0: 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69     into the vari
f2b0: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
f2c0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
f2d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
f2e0: 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
f2f0: 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62  type SQLite [sub
f300: 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d  st $connection]]
f310: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
f320: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69     # NOTE: Confi
f330: 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  gure the tempora
f340: 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  ry directory for
f350: 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65   the newly opene
f360: 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  d database..    
f370: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
f380: 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20  tion now unless 
f390: 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69  our caller forbi
f3a0: 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ds it...      #.
f3b0: 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70  .      if {$temp
f3c0: 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20  orary && ![info 
f3d0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54  exists ::no(setT
f3e0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
f3f0: 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
f400: 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
f410: 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73   $db [appendArgs
f420: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f430: 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f  "PRAGMA temp_sto
f440: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c  re_directory = \
f450: 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  "" [getTemporary
f460: 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d  Directory] \"\;]
f470: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
f480: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
f490: 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
f4a0: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
f4b0: 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
f4c0: 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
f4d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
f4e0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
f4f0: 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
f500: 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
f510: 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
f520: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
f530: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
f540: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
f550: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
f560: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
f570: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
f580: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
f590: 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
f5a0: 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
f5b0: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
f5c0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
f5d0: 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
f5e0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
f5f0: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
f600: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
f610: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
f620: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
f630: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
f640: 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
f650: 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
f660: 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
f670: 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
f680: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
f690: 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
f6a0: 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
f6b0: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
f6c0: 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
f6d0: 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
f6e0: 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
f6f0: 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
f700: 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
f710: 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
f720: 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
f730: 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
f740: 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
f750: 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
f760: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f770: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
f780: 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
f790: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
f7a0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
f7b0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
f7c0: 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
f7d0: 2d 6f 62 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f  -objectflags +No
f7e0: 44 69 73 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c  Dispose -alias \
f7f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f800: 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
f810: 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e  ctive.connection
f820: 73 20 49 74 65 6d 20 24 64 62 0d 0a 20 20 20 20  s Item $db..    
f830: 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d      } result] ==
f840: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f850: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f860: 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63 65     # NOTE: Succe
f870: 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6f  ss, return the o
f880: 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
f890: 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  dle...          
f8a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
f8b0: 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
f8c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
f8d0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
f8e0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
f8f0: 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77 68  ilure, report wh
f900: 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  y...          #.
f910: 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
f920: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f930: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
f950: 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
f960: 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65  led to get conne
f970: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
f980: 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c 0d   database \"" \.
f990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24  .              $
f9a0: 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
f9b0: 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
f9c0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
f9d0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
f9e0: 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44 62  .    proc freeDb
f9f0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76 61  Connection { {va
fa00: 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  rName connection
fa10: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
fa20: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
fa30: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
fa40: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
fa50: 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 22  .g. "connection"
fa60: 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  ) in the..      
fa70: 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 20  #       context 
fa80: 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20 20  of our caller.  
fa90: 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65 63  The opaque objec
faa0: 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20  t handle for an 
fab0: 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20 23  ADO.NET..      #
fac0: 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
fad0: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 74  n previously ret
fae0: 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62 43  urned by [getDbC
faf0: 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75 6c  onnection] shoul
fb00: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
fb10: 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72 65      stored there
fb20: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
fb30: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
fb40: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d  me connection...
fb50: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fb60: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
fb70: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 70  to remove the op
fb80: 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
fb90: 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  le from the inte
fba0: 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 23  rpreter..      #
fbb0: 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68 69         now.  Thi
fbc0: 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  s [object dispos
fbd0: 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  e] call will not
fbe0: 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f 73   actually dispos
fbf0: 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  e of the..      
fc00: 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79 69  #       underlyi
fc10: 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75 73  ng object becaus
fc20: 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73 65  e the +NoDispose
fc30: 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
fc40: 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20   it..      #    
fc50: 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74 69     during creati
fc60: 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75 65  on of the opaque
fc70: 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d   object handle..
fc80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fc90: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
fca0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26 20   connection] && 
fcb0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63 61  \..          [ca
fcc0: 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70  tch {object disp
fcd0: 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d  ose $connection}
fce0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
fcf0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fd00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
fd10: 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
fd20: 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e 64   remove the hand
fd30: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
fd40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
fd50: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
fd60: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
fd70: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
fd80: 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
fd90: 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
fda0: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
fdb0: 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e 6e  handle \"" $conn
fdc0: 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ection \..      
fdd0: 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f 72        "\", error
fde0: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
fdf0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  \n]..      }..  
fe00: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
fe10: 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f 6e   addDbConnection
fe20: 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76   { connection {v
fe30: 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a  arName db} } {..
fe40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
fe50: 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
fe60: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
fe70: 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
fe80: 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
fe90: 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
fea0: 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 0d  #       caller..
feb0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
fec0: 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65  upvar 1 $varName
fed0: 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a   db....      #..
fee0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 72        # NOTE: Cr
fef0: 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c 79  eate a correctly
ff00: 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65 20   formatted name 
ff10: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
ff20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a   connection to..
ff30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
ff40: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
ff50: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
ff60: 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72 65  e Eagle interpre
ff70: 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ter...      #.. 
ff80: 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62 6a       set db [obj
ff90: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
ffa0: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
ffb0: 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 2e            Eagle.
ffc0: 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69 76  _Components.Priv
ffd0: 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44 61  ate.FormatOps Da
ffe0: 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d 65  tabaseObjectName
fff0: 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a   $connection \..
10000 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
10010 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a 65  Connection [obje
10020 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70  ct invoke Interp
10030 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 20  reter.GetActive 
10040 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20  NextId]]....    
10050 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10060 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61 62  E: Add the datab
10070 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
10080 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
10090 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69 73  aller to the lis
100a0 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
100b0 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20   of those known 
100c0 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74  to the Eagle int
100d0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
100e0 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74   #..      object
100f0 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
10100 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70  NonPublic Interp
10110 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e  reter.GetActive.
10120 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64 20  connections Add 
10130 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64 62  \..          $db
10140 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20   $connection..  
10150 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
10160 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69 6c   cleanupDb { fil
10170 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20 64  eName {varName d
10180 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65  b} {collect true
10190 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65 7d  } {qualify true}
101a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
101b0 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20 74         {delete t
101c0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
101d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
101e0 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63   Attempt to forc
101f0 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22 67  e all pending "g
10200 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73 20  arbage" objects 
10210 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64 2c  to be collected,
10220 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10230 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74 65  including SQLite
10240 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64 20   statements and 
10250 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b 20  backup objects; 
10260 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  this should allo
10270 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  w..      #      
10280 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
10290 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
102a0 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20 20   be deleted...  
102b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
102c0 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e 20  {$collect} then 
102d0 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c 65  {..        colle
102e0 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65 73  ctGarbage $::tes
102f0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
10300 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
10310 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
10320 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
10330 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
10340 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
10350 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
10360 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
10370 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
10380 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
10390 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
103a0 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
103b0 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
103c0 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
103d0 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
103e0 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
103f0 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
10400 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
10410 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10420 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20 63  OTE: Close the c
10430 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
10440 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20 20   database now.  
10450 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c 6f  This should allo
10460 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20 20  w us..      #   
10470 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74 68      to delete th
10480 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
10490 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20 20  abase file...   
104a0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
104b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d  [info exists db]
104c0 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c 20   && [catch {sql 
104d0 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f 72  close $db} error
104e0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
104f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
10500 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77  NOTE: We somehow
10510 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65   failed to close
10520 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 72   the database, r
10530 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
10540 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
10550 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10560 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10570 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10580 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10590 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 64  ailed to close d
105a0 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62 20  atabase \"" $db 
105b0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  "\", error: " \.
105c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
105d0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
105e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
105f0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
10600 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f 75  First, see if ou
10610 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65 71  r caller has req
10620 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65 6d  uested an in-mem
10630 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  ory database... 
10640 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
10650 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d 65  t isMemory [isMe
10660 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d 65  moryDb $fileName
10670 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
10680 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
10690 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  d the full path 
106a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
106b0 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72 20  file name.  For 
106c0 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a 20  now, all test.. 
106d0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
106e0 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20  abase files are 
106f0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74 65  stored in the te
10700 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
10710 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  y...      #..   
10720 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
10730 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20 74  y && $qualify} t
10740 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  hen {..        s
10750 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
10760 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61 62  e join [getDatab
10770 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b 66  aseDirectory] [f
10780 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61  ile tail $fileNa
10790 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  me]]..      }...
107a0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
107b0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
107c0 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20   the file still 
107d0 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23  exists...      #
107e0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
107f0 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74  Memory && $delet
10800 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74  e && [file exist
10810 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  s $fileName]} th
10820 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
10830 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10840 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20 64   Skip deleting d
10850 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69 66  atabase files if
10860 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
10870 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20  he global..     
10880 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
10890 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20 69  ble to prevent i
108a0 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
108b0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
108c0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c  o exists ::no(cl
108d0 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20 74  eanupDbFile)]} t
108e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
108f0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
10900 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
10910 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73 74   delete the test
10920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
10930 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
10940 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
10950 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
10960 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
10970 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
10980 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10990 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
109a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
109b0 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
109c0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
109d0 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
109e0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
109f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
10a00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
10a10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
10a40 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
10a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
10a60 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10a80 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75  \" during cleanu
10a90 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  p, error: " \n\t
10aa0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
10ab0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10ac0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
10ad0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10ae0 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
10af0 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20  that we skipped 
10b00 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
10b10 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
10b20 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63  .          set c
10b30 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20  ode 0....       
10b40 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
10b50 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
10b60 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
10b70 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
10b80 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c  ING: skipped del
10b90 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  eting database f
10ba0 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
10bb0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
10bc0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
10bd0 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
10be0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
10bf0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
10c00 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
10c10 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
10c20 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
10c30 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
10c40 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
10c50 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
10c60 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
10c70 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
10c80 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74 65  proc setupDbInte
10c90 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b 20  rruptCallback { 
10ca0 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b 0d  channel log } {.
10cb0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
10cc0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74 74  annel "---- sett
10cd0 69 6e 67 20 75 70 20 64 65 62 75 67 67 65 72 20  ing up debugger 
10ce0 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62 61  interrupt callba
10cf0 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  ck... "....     
10d00 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
10d10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
10d20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73    # NOTE: Make s
10d30 75 72 65 20 74 68 65 20 73 63 72 69 70 74 20 64  ure the script d
10d40 65 62 75 67 67 65 72 20 61 6e 64 20 74 68 65 20  ebugger and the 
10d50 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
10d60 65 74 65 72 20 61 72 65 0d 0a 20 20 20 20 20 20  eter are..      
10d70 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
10d80 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
10d90 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
10da0 20 20 20 20 20 20 20 64 65 62 75 67 20 73 65 74         debug set
10db0 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d 0a  up true true....
10dc0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10dd0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
10de0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70 61  the necessary pa
10df0 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65 20  ckages into the 
10e00 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72  isolated interpr
10e10 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 23  eter...        #
10e20 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10e30 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20  eval {..        
10e40 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69 72    package requir
10e50 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20  e Eagle..       
10e60 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
10e70 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79  re Eagle.Library
10e80 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63 6b  ..          pack
10e90 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67 6c  age require Eagl
10ea0 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20  e.Test..        
10eb0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
10ec0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10ed0 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73 61  Copy the necessa
10ee0 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74  ry variables int
10ef0 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 69  o the isolated i
10f00 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
10f10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10f20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20 73  debug invoke 0 s
10f30 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  et ::test_channe
10f40 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f  l $channel; # NO
10f50 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d 2e  TE: For [tputs].
10f60 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67 20  ..        debug 
10f70 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74  invoke 0 set ::t
10f80 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20  est_log $log; # 
10f90 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d  NOTE: For [tlog]
10fa0 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .....        #..
10fb0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10fc0 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c 6c  Install the call
10fd0 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20 62  back script to b
10fe0 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 74  e evaluated in t
10ff0 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20 20  he isolated..   
11000 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74       #       int
11010 65 72 70 72 65 74 65 72 20 77 68 65 6e 20 74 68  erpreter when th
11020 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 69  is interpreter i
11030 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 62 79  s interrupted by
11040 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20 20   script..       
11050 20 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c 6c   #       cancell
11060 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20 20  ation, etc...   
11070 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11080 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61  debug callback a
11090 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d  pply {{sender e}
110a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
110b0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
110c0 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  E: Check if this
110d0 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 65   callback is one
110e0 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61 62   that we care ab
110f0 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  out...          
11100 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
11110 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20 5b  {"Canceled" in [
11120 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72 72  split [$e Interr
11130 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d 20  uptType] ", "]} 
11140 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11150 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11160 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61     # NOTE: Itera
11170 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64  te through all d
11180 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11190 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65  ons known to the
111a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
111b0 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e 74        parent int
111c0 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20  erpreter...     
111d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
111e0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
111f0 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72  each -alias pair
11200 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11210 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f      [object invo
11220 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
11230 62 6c 69 63 20 24 65 20 49 6e 74 65 72 70 72 65  blic $e Interpre
11240 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  ter.connections]
11250 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
11260 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
11270 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
11280 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79  pt to cancel any
11290 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20   SQL queries in 
112a0 70 72 6f 67 72 65 73 73 20 6f 6e 20 74 68 69 73  progress on this
112b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
112c0 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
112d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20 20   connection...  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
11300 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20 56  {[catch {$pair V
11310 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72 72  alue.Cancel} err
11320 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
11340 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
11350 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
11360 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
11370 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
11380 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
11390 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20 66  o cancel query f
113a0 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22  or connection \"
113b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
113c0 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72 20           [$pair 
113d0 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Key] "\", error:
113e0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
113f0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
11400 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11410 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
11420 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20  .        }}..   
11430 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
11440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11450 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
11460 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  interruptCallbac
11470 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20 20  k.sqlite3....   
11480 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
11490 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
114a0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
114b0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
114c0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6e  l [appendArgs "n
114d0 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  o, error: " \n\t
114e0 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
114f0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
11500 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75 70      proc cleanup
11510 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  File { fileName 
11520 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b  {collect true} {
11530 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20 7b  force false} } {
11540 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11550 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
11560 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70 65   to force all pe
11570 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22 20  nding "garbage" 
11580 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63 6f  objects to be co
11590 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20 20  llected,..      
115a0 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69 6e  #       includin
115b0 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d 65  g SQLite stateme
115c0 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20 6f  nts and backup o
115d0 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68 6f  bjects; this sho
115e0 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20 20  uld allow..     
115f0 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e 64   #       the und
11600 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
11610 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
11620 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ted...      #.. 
11630 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63       if {$collec
11640 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
11650 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67     collectGarbag
11660 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  e $::test_channe
11670 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  l..      }....  
11680 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
11690 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
116a0 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  e file still exi
116b0 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  sts...      #.. 
116c0 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
116d0 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
116e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
116f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
11700 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74 69  OTE: Skip deleti
11710 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69 66  ng test files if
11720 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20 74   somebody sets t
11730 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
11740 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
11750 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20 69      to prevent i
11760 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
11770 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63         if {$forc
11780 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69 73  e || ![info exis
11790 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 46  ts ::no(cleanupF
117a0 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ile)]} then {.. 
117b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
117c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
117d0 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65 20  tempt to delete 
117e0 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e 6f  the test file no
117f0 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  w...          #.
11800 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
11810 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
11820 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69  {file delete $fi
11830 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d 7d  leName} error]]}
11840 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11850 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11860 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
11870 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
11880 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
11890 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
118a0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
118b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
118c0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
118d0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
118f0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
11900 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 74  iled to delete t
11910 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66 69  est file \"" $fi
11920 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
11930 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
11940 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72  ring cleanup, er
11950 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
11960 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
11970 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
11980 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11990 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
119a0 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20  NOTE: Show that 
119b0 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  we skipped delet
119c0 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20  ing the file... 
119d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
119e0 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30        set code 0
119f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70  ....          tp
11a00 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
11a10 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
11a20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11a30 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
11a40 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67  skipped deleting
11a50 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24   test file \"" $
11a60 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
11a70 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
11a80 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22 5d  ring cleanup\n"]
11a90 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11aa0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11ab0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11ac0 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c 65  # NOTE: The file
11ad0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
11ae0 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20 20   success!..     
11af0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
11b00 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20 20  t code 0..      
11b10 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
11b20 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d 0a  n $code..    }..
11b30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c 6c  ...    proc coll
11b40 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68 61  ectGarbage { cha
11b50 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f 6e  nnel {millisecon
11b60 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74 20  ds 1000} {quiet 
11b70 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
11b80 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
11b90 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
11ba0 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
11bb0 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  se} result] == 0
11bc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11bd0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11be0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11bf0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11c00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
11c20 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
11c30 20 62 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f   by the CLR befo
11c40 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e  re collection...
11c50 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
11c60 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79      $result " by
11c70 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
11c80 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
11c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
11ca0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
11cb0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
11cc0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
11cd0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
11ce0 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73  et CLR memory us
11cf0 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  age, error: " \.
11d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c  .            \n\
11d10 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
11d20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
11d30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
11d70 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
11d80 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11d90 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61  TE: Repeatedly a
11da0 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63  ttempt to collec
11db0 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20  t garbage until 
11dc0 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d  the allotted num
11dd0 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ber..      #    
11de0 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e     of millisecon
11df0 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20  ds has elapsed. 
11e00 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20   Always attempt 
11e10 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61  to collect garba
11e20 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ge..      #     
11e30 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e    at least once.
11e40 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11e50 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f 63   set start [cloc
11e60 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
11e70 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72    set stop [expr
11e80 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c   {$start + ($mil
11e90 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  liseconds / 1000
11ea0 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f 20  )}]....      do 
11eb0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
11ec0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
11ed0 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61  tempt to force a
11ee0 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
11ef0 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52  llection now.  R
11f00 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20 20  eport any..     
11f10 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
11f20 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74   that is encount
11f30 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e  ered if we fail.
11f40 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
11f50 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
11f60 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47  {object invoke G
11f70 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79  C GetTotalMemory
11f80 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20 74   true} error]} t
11f90 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11fa0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11fb0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
11fd0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
11fe0 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20  ed full garbage 
11ff0 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f  collection, erro
12000 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
12010 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72 6f        \n\t $erro
12020 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  r \n]..        }
12030 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
12040 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  now [clock secon
12050 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68 69  ds]..      } whi
12060 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24 6e  le {$start <= $n
12070 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73 74  ow && $now < $st
12080 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23  op}....      ###
12090 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
120a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
120b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
120c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
120d0 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
120e0 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65  if {[catch {obje
120f0 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
12100 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
12110 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d  e} result] == 0}
12120 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12130 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
12140 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
12150 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12160 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12170 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
12180 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
12190 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65 72  by the CLR after
121a0 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22   collection... "
121b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
121c0 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65    $result " byte
121d0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d  s\n"]..        }
121e0 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
121f0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
12200 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
12210 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12220 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
12230 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  G: failed to get
12240 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61 67   CLR memory usag
12250 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20  e, error: " \.. 
12260 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20             \n\t 
12270 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
12280 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
12290 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
122a0 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 7b  teHandleCounts {
122b0 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74 20   channel {quiet 
122c0 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
122d0 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
122e0 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
122f0 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
12300 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12310 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
12320 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
12330 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c 45  ite.COUNT_HANDLE
12340 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12350 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
12360 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20 63  NOTE: Add each c
12370 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
12380 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75  ount to the resu
12390 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20 20  lting list...   
123a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
123b0 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c 69  foreach name [li
123c0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75  st connectionCou
123d0 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75 6e  nt statementCoun
123e0 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20 7b  t backupCount] {
123f0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
12400 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69 6e  value [object in
12410 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
12420 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
12430 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
12440 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
12450 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 24  eNativeMethods $
12460 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
12470 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
12480 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12490 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
124a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
124b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
124c0 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61 6c    "---- critical
124d0 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c 22   handle count \"
124e0 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20 22  " $name "\" is "
124f0 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20 20   $value \n]..   
12500 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12510 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
12520 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20 20  sult $value..   
12530 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20       }..      } 
12540 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74 7d  elseif {!$quiet}
12550 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12560 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
12570 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20 68  TE: The actual h
12580 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72 65  andle counts are
12590 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b 20   not available; 
125a0 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d  therefore, just.
125b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
125c0 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
125d0 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   list...        
125e0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
125f0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
12600 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
12610 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61 62  counts unavailab
12620 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  le\n"..      }..
12630 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
12640 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c  result..    }...
12650 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74 64  ..    proc shutd
12660 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61 6e  ownSQLite { chan
12670 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73 65  nel {force false
12680 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20  } {quiet false} 
12690 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
126a0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65      # NOTE: Make
126b0 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69 74   sure that SQLit
126c0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
126d0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75  s completely shu
126e0 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20  tdown.  This..  
126f0 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 75      #       is u
12700 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68 61  sed by tests tha
12710 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67 75  t change configu
12720 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
12730 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20  nd/or those..   
12740 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
12750 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
12760 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e 69  e logging is ini
12770 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a  tialized (i.e. j
12780 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20 20  ust in case..   
12790 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
127a0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
127b0 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69 7a  ry was initializ
127c0 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65 73  ed in the proces
127d0 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20  s prior to..    
127e0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53 51    #       the SQ
127f0 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62 65  LiteLog class be
12800 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74 75  ing able to setu
12810 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63 61  p its logging ca
12820 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20  llback)...      
12830 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79  #       Normally
12840 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e  , this should on
12850 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
12860 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
12870 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ded and..      #
12880 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f 72         ready for
12890 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
128a0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
128b0 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72  ..      if {$for
128c0 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52  ce || [isSQLiteR
128d0 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  eady]} then {.. 
128e0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
128f0 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f    # BUGFIX: Befo
12900 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e  re calling the n
12910 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20 66  ative shutdown f
12920 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75  unction, make su
12930 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20 20  re both..       
12940 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74 68   #         of th
12950 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
12960 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
12970 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
12980 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
12990 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
129a0 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e 6e  rectories $chann
129b0 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20  el true....     
129c0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
129d0 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
129e0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
129f0 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
12a00 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
12a10 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
12a20 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
12a30 64 73 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  ds sqlite3_shutd
12a40 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20 72  own..        } r
12a50 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
12a60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
12a70 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
12a80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
12a90 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
12aa0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
12ac0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
12ad0 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f  _shutdown()... o
12ae0 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
12af0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
12b00 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12b10 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
12b20 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
12b30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
12b40 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12b50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12b60 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
12b70 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
12b80 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72  tdown()... error
12b90 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
12ba0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
12bb0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
12bc0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
12bd0 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74  .    proc report
12be0 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
12bf0 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74  { channel {quiet
12c00 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74   false} {collect
12c10 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
12c20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12c30 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70  E: Skip all outp
12c40 75 74 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  ut if we are run
12c50 6e 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22 20  ning in "quiet" 
12c60 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mode...      #..
12c70 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
12c80 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20  onstraint \..   
12c90 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
12ca0 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
12cb0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54  .Data.SQLite.INT
12cc0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
12cd0 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  LE] && \..      
12ce0 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
12cf0 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
12d00 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
12d10 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
12d20 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d  SQLite.TRACK_MEM
12d30 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
12d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
12d50 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
12d60 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
12d70 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
12d80 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
12d90 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
12da0 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
12db0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
12dc0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
12dd0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
12de0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
12df0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
12e00 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
12e10 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
12e20 69 74 65 4d 65 6d 6f 72 79 20 62 79 74 65 73 41  iteMemory bytesA
12e30 6c 6c 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20  llocated..      
12e40 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30    } memory] == 0
12e50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12e60 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
12e70 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
12e80 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12e90 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
12ea0 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c  $memory " bytes\
12eb0 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n"]..          }
12ec0 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ..        } else
12ed0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
12ee0 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e  t memory unknown
12ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
12f00 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
12f10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
12f20 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12f30 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
12f40 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
12f50 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
12f60 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
12f70 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
12f80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12f90 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78  hannel "---- max
12fa0 69 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75  imum memory in u
12fb0 73 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f  se by SQLiteMemo
12fc0 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20  ry... "..       
12fd0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
12fe0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12ff0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
13000 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
13010 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
13020 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
13030 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
13040 4d 65 6d 6f 72 79 20 6d 61 78 69 6d 75 6d 42 79  Memory maximumBy
13050 74 65 73 41 6c 6c 6f 63 61 74 65 64 0d 0a 20 20  tesAllocated..  
13060 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20        } memory] 
13070 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
13080 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
13090 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
130a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
130b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
130c0 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79  rgs $memory " by
130d0 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  tes\n"]..       
130e0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
130f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13100 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b    set memory unk
13110 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nown....        
13120 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
13130 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13140 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13150 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
13160 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20  emory \n]..     
13170 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
13180 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13190 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
131a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
131b0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
131c0 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65  "---- current me
131d0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
131e0 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
131f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
13200 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
13210 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
13220 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
13230 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
13240 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
13250 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
13260 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
13270 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20  _memory_used..  
13280 20 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d      } memory] ==
13290 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
132a0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
132b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
132c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
132d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
132e0 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
132f0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
13300 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
13310 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13320 20 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74   # NOTE: Maybe t
13330 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
13340 69 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69  ibrary is unavai
13350 6c 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20  lable?..        
13360 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d  #..        set m
13370 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d  emory unknown...
13380 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71  .        if {!$q
13390 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
133a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
133b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
133c0 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a  gs $memory \n]..
133d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
133e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20   }....      set 
133f0 72 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20  result $memory; 
13400 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d  # NOTE: Return m
13410 65 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20  emory in-use to 
13420 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20  our caller..... 
13430 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
13440 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13450 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13460 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
13470 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
13480 53 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20  SQLite... "..   
13490 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
134a0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
134b0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
134c0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
134d0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
134e0 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
134f0 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
13500 76 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65  veMethods sqlite
13510 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
13520 65 72 20 30 0d 0a 20 20 20 20 20 20 7d 20 6d 65  er 0..      } me
13530 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
13540 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
13550 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13560 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13570 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
13580 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
13590 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
135a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
135b0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
135c0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
135d0 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
135e0 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
135f0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
13600 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13610 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
13620 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
13630 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
13640 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
13650 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
13660 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
13670 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
13680 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
13690 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74      if {$collect
136a0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
136b0 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65    collectGarbage
136c0 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20   $channel..     
136d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
136e0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
136f0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
13700 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
13710 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
13720 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e  use by the CLR..
13730 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
13740 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13750 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
13760 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
13770 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d  y false} memory]
13780 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
13790 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
137a0 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
137b0 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
137c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
137d0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
137e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
137f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13800 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
13810 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
13820 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
13830 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
13840 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
13850 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a  memory invalid..
13860 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
13870 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
13880 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
13890 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
138a0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
138b0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
138c0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
138d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
138e0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
138f0 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
13900 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
13910 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13920 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13930 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
13940 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
13950 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
13960 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
13970 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
13980 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
13990 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
139a0 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65  es { channel {re
139b0 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  set false} } {..
139c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
139d0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
139e0 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
139f0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
13a00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
13a10 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  lable...      #.
13a20 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
13a30 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
13a40 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
13a50 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73  g for function s
13a60 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
13a70 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d  _directory... ".
13a80 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13a90 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
13aa0 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74  all to the sqlit
13ab0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
13ac0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
13ad0 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20  uses the..      
13ae0 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20  #       invalid 
13af0 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20  value 0 for the 
13b00 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
13b10 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65   This code is de
13b20 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  signed..      # 
13b30 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69        to check i
13b40 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75  f calling the fu
13b50 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73  nction will rais
13b60 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28  e an exception (
13b70 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  i.e...      #   
13b80 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72      the actual r
13b90 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
13ba0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
13bb0 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  atter as long as
13bc0 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   no..      #    
13bd0 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20     directory is 
13be0 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20  changed)...     
13bf0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
13c00 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
13c10 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
13c20 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
13c30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
13c40 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
13c50 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
13c60 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20  thods \..       
13c70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
13c80 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
13c90 20 30 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 7d   0 null..      }
13ca0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
13cb0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13cc0 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c 6c 69     # NOTE: Calli
13cd0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77  ng the sqlite3_w
13ce0 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
13cf0 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ry function does
13d00 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20   not..        # 
13d10 20 20 20 20 20 20 63 61 75 73 65 20 61 6e 20 65        cause an e
13d20 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72 65 66  xception; theref
13d30 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ore, it must be 
13d40 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 0d  available (i.e..
13d50 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13d60 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
13d70 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 61 20  should return a 
13d80 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e 20 63  failure return c
13d90 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20 20 20  ode in this..   
13da0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 73       #       cas
13db0 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e)...        #..
13dc0 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
13dd0 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  raint sqlite3_wi
13de0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
13df0 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  y....        tpu
13e00 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
13e10 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n....        #..
13e20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13e30 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72 20  Does our caller 
13e40 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74 68  want to reset th
13e50 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 0d 0a  e directories?..
13e60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e70 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d 20 74     if {$reset} t
13e80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13e90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
13ea0 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65 20 73  NOTE: Now make s
13eb0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
13ec0 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64   and temporary d
13ed0 69 72 65 63 74 6f 72 69 65 73 20 61 72 65 0d 0a  irectories are..
13ee0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
13ef0 20 20 72 65 73 65 74 20 74 68 65 69 72 20 64 65    reset their de
13f00 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20 77 68  fault values, wh
13f10 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20 6e 75  ich should be nu
13f20 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a 20 20  ll for both...  
13f30 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13f40 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69 74 65  Since the sqlite
13f50 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
13f60 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69  ctory function i
13f70 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a 20 20  s available,..  
13f80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
13f90 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20  use it...       
13fa0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13fb0 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31  for {set index 1
13fc0 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b  } {$index < 3} {
13fd0 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20  incr index} {.. 
13fe0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
13ff0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
14000 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
14010 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
14020 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
14030 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
14040 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
14050 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
14060 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
14070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14080 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
14090 6f 72 79 20 24 69 6e 64 65 78 20 6e 75 6c 6c 0d  ory $index null.
140a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 72  .            } r
140b0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
140c0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
140d0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
140e0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
140f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14100 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
14110 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
14120 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
14130 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
14140 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29          ", null)
14150 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c  ... ok: " $resul
14160 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
14170 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
14180 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14190 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
141a0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
141b0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
141c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69   call sqlite3_wi
141d0 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
141e0 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20  y(" $index \..  
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 65 72 72 6f  ", null)... erro
14210 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c  r: " \n\t $resul
14220 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  t \n]..         
14230 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14240 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
14250 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
14260 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
14270 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20  nnel no\n....   
14280 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14290 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72  # NOTE: Does our
142a0 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20   caller want to 
142b0 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63 74  reset the direct
142c0 6f 72 69 65 73 3f 20 20 54 68 69 73 20 63 61 6e  ories?  This can
142d0 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 23   only..        #
142e0 20 20 20 20 20 20 20 62 65 20 70 65 72 66 6f 72         be perfor
142f0 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
14300 20 6c 6f 61 64 65 64 20 61 6e 64 20 72 65 61 64   loaded and read
14310 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
14320 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
14330 20 20 20 20 20 20 20 73 75 69 74 65 2e 0d 0a 20         suite... 
14340 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14350 20 20 69 66 20 7b 24 72 65 73 65 74 20 26 26 20    if {$reset && 
14360 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d 7d  [isSQLiteReady]}
14370 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
14380 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14390 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
143a0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
143b0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
143c0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
143d0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
143e0 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
143f0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
14400 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
14410 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
14420 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14430 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
14440 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
14450 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
14460 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
14470 20 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70       #       app
14480 65 61 72 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ear to be availa
14490 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61 73 73  ble, use the ass
144a0 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41 20 63  ociated PRAGMA c
144b0 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20 20 20  ommands..       
144c0 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65     #       inste
144d0 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ad...          #
144e0 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  ..          fore
144f0 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b 6c  ach directory [l
14500 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f 64  ist data_store_d
14510 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73 74  irectory temp_st
14520 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 7b  ore_directory] {
14530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
14540 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67  t sql [appendArg
14550 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72  s "PRAGMA " $dir
14560 65 63 74 6f 72 79 20 22 20 3d 20 5c 22 5c 22 3b  ectory " = \"\";
14570 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
14580 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65 78    if {[catch {ex
14590 65 63 75 74 65 53 71 6c 20 24 73 71 6c 7d 20 72  ecuteSql $sql} r
145a0 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
145b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
145c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
145d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
145e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
145f0 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
14600 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
14610 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b 3a 20 5c 22  tory "... ok: \"
14620 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
14630 20 20 20 20 20 20 20 24 72 65 73 75 6c 74 20 5c         $result \
14640 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
14650 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14660 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
14670 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
14680 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
14690 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
146a0 65 78 65 63 75 74 65 20 50 52 41 47 4d 41 20 22  execute PRAGMA "
146b0 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e   $directory "...
146c0 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20   error: " \..   
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
146e0 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  n\t $result \n].
146f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14700 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14710 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
14720 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
14730 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c    # NOTE: Finall
14740 79 2c 20 73 68 6f 77 20 74 68 65 20 63 75 72 72  y, show the curr
14750 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
14760 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
14770 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20 23  mporary..      #
14780 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 69         directori
14790 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 6f 6e  es.  This can on
147a0 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
147b0 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f 61  if SQLite is loa
147c0 64 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ded..      #    
147d0 20 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72     and ready for
147e0 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74   use by the test
147f0 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 23   suite...      #
14800 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 53  ..      if {[isS
14810 51 4c 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65  QLiteReady]} the
14820 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  n {..        for
14830 65 61 63 68 20 64 69 72 65 63 74 6f 72 79 20 5b  each directory [
14840 6c 69 73 74 20 64 61 74 61 5f 73 74 6f 72 65 5f  list data_store_
14850 64 69 72 65 63 74 6f 72 79 20 74 65 6d 70 5f 73  directory temp_s
14860 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 5d 20  tore_directory] 
14870 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
14880 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
14890 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 68  endArgs "---- ch
148a0 65 63 6b 69 6e 67 20 22 20 24 64 69 72 65 63 74  ecking " $direct
148b0 6f 72 79 20 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20  ory "... "].... 
148c0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c           set sql
148d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52   [appendArgs "PR
148e0 41 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72  AGMA " $director
148f0 79 20 5c 3b 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  y \;]....       
14900 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
14910 78 65 63 75 74 65 53 71 6c 20 24 73 71 6c 20 73  xecuteSql $sql s
14920 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d  calar} result] =
14930 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
14940 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
14950 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
14960 72 67 73 20 22 6f 6b 3a 20 5c 22 22 20 24 72 65  rgs "ok: \"" $re
14970 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  sult \"\n]..    
14980 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14990 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
149a0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
149b0 6e 64 41 72 67 73 20 22 65 72 72 6f 72 3a 20 22  ndArgs "error: "
149c0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
149d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
149e0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
149f0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
14a00 20 20 70 72 6f 63 20 6c 6f 61 64 53 51 4c 69 74    proc loadSQLit
14a10 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 7b 20  eTestSettings { 
14a20 63 68 61 6e 6e 65 6c 20 7b 73 75 66 66 69 78 20  channel {suffix 
14a30 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65  ""} {quiet false
14a40 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
14a50 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
14a60 69 70 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 73  ip loading the s
14a70 65 74 74 69 6e 67 73 20 69 66 20 74 68 65 69 72  ettings if their
14a80 20 75 73 61 67 65 20 68 61 73 20 62 65 65 6e 20   usage has been 
14a90 64 69 73 61 62 6c 65 64 2e 0d 0a 20 20 20 20 20  disabled...     
14aa0 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b   #..      if {![
14ab0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
14ac0 28 73 71 6c 69 74 65 54 65 73 74 53 65 74 74 69  (sqliteTestSetti
14ad0 6e 67 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ngs)]} then {.. 
14ae0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14af0 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 63    # NOTE: Load c
14b00 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
14b10 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20 74  nd/or per-host t
14b20 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f 77  est settings now
14b30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
14b40 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
14b50 65 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61  exists ::tcl_pla
14b60 74 66 6f 72 6d 28 75 73 65 72 29 5d 7d 20 74 68  tform(user)]} th
14b70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14b80 73 65 74 20 75 73 65 72 53 65 74 74 69 6e 67 73  set userSettings
14b90 46 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a  FileName [file j
14ba0 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69  oin [getCommonDi
14bb0 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20  rectory] \..    
14bc0 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
14bd0 64 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24  dArgs settings $
14be0 73 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f  suffix . $::tcl_
14bf0 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29 20 2e  platform(user) .
14c00 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eagle]]....     
14c10 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
14c20 78 69 73 74 73 20 24 75 73 65 72 53 65 74 74 69  xists $userSetti
14c30 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  ngsFileName]} th
14c40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14c50 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
14c60 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14c70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
14c80 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14c90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14ca0 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69       "---- loadi
14cb0 6e 67 20 70 65 72 2d 75 73 65 72 20 74 65 73 74  ng per-user test
14cc0 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c   settings file \
14cd0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
14ce0 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65 74          $userSet
14cf0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22  tingsFileName \"
14d00 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ...\n]..        
14d10 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
14d20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
14d30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14d40 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
14d50 20 73 6f 75 72 63 65 20 24 75 73 65 72 53 65 74   source $userSet
14d60 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a  tingsFileName]..
14d70 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72              } er
14d80 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
14da0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14dc0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14dd0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
14e00 3a 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64  : failed to load
14e10 20 70 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e   per-user settin
14e20 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67 73     $userSettings
14e50 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72  FileName "\", er
14e60 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
14e70 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
14e80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14e90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
14ea0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14eb0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
14ec0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
14ed0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14ee0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
14ef0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
14f00 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
14f10 20 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67   skipped loading
14f20 20 70 65 72 2d 75 73 65 72 20 74 65 73 74 20 73   per-user test s
14f30 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22  ettings file \""
14f40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14f50 20 20 20 20 20 20 24 75 73 65 72 53 65 74 74 69        $userSetti
14f60 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c  ngsFileName "\",
14f70 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
14f80 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
14f90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
14fa0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
14fb0 0a 20 20 20 20 20 20 20 20 23 23 23 23 23 23 23  .        #######
14fc0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14fd0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14fe0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
14ff0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
15010 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
15020 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74  cl_platform(host
15030 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
15040 20 20 20 20 20 20 73 65 74 20 68 6f 73 74 53 65        set hostSe
15050 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
15060 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
15070 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
15080 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15090 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
150a0 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
150b0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68  ::tcl_platform(h
150c0 6f 73 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ost) .eagle]]...
150d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
150e0 66 69 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73  file exists $hos
150f0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
15100 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
15110 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
15120 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15130 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15140 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15150 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15160 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
15170 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73   loading per-hos
15180 74 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  t test settings 
15190 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 68                $h
151b0 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
151c0 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
151d0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
151e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
151f0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
15200 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
15210 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68   [list source $h
15220 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  ostSettingsFileN
15230 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
15240 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
15250 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15260 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
15270 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15280 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15290 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
152a0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
152b0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
152c0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
152d0 6f 20 6c 6f 61 64 20 70 65 72 2d 68 6f 73 74 20  o load per-host 
152e0 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
152f0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15300 20 20 20 20 20 20 20 20 20 24 68 6f 73 74 53 65           $hostSe
15310 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
15320 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
15330 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
15340 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
15350 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
15360 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
15370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
15380 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
15390 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
153a0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
153b0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
153e0 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
153f0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
15400 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
15410 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
15420 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
15430 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
15440 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
15450 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15460 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15470 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
15480 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
15490 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72   runSQLiteTestPr
154a0 6f 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20  ologue {} {..   
154b0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
154c0 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67  TE: Skip running
154d0 20 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c   our custom prol
154e0 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
154f0 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
15500 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
15510 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
15520 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
15530 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
15540 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
15550 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
15560 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
15570 3a 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f  : Load the "befo
15580 72 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20  re-constraints" 
15590 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
155a0 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d  and/or per-host.
155b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
155c0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e   test settings n
155d0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
155e0 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
155f0 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
15600 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
15610 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
15620 62 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20  before]....     
15630 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
15640 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20  NOTE: Determine 
15650 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
15660 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d   native platform
15670 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
15680 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15690 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
156a0 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
156b0 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20  tform true]..   
156c0 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65       set archite
156d0 63 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74  cture [architect
156e0 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24  ureForPlatform $
156f0 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
15700 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15710 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
15720 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
15730 63 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20  chitecture used 
15740 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74  to help locate t
15750 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
15760 20 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64      native build
15770 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20   files...       
15780 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
15790 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
157a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
157b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
157c0 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  -- platform for 
157d0 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
157e0 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
157f0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
15800 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e    $platform \"\n
15810 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
15820 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
15830 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
15850 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65  --- architecture
15860 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
15870 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
15880 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
15890 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
158a0 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  ture \"\n]....  
158b0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
158c0 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61   # NOTE: Build a
158d0 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
158e0 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
158f0 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
15900 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15910 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e   set configFileN
15920 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
15930 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
15940 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
15950 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
15960 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15970 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
15980 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ist of auxiliary
15990 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
159a0 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
159b0 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20  DA)..        #  
159c0 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
159d0 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
159e0 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
159f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
15a00 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61   mdaConfigFileNa
15a10 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
15a20 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c           Install
15a30 65 72 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  er.exe.mda.confi
15a40 67 20 74 65 73 74 2e 65 78 65 2e 6d 64 61 2e 63  g test.exe.mda.c
15a50 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20 20  onfig \..       
15a60 20 20 20 20 20 74 65 73 74 6c 69 6e 71 2e 65 78       testlinq.ex
15a70 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73  e.mda.config tes
15a80 74 65 66 36 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  tef6.exe.mda.con
15a90 66 69 67 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  fig]....        
15aa0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
15ab0 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73  E: Build the lis
15ac0 74 20 6f 66 20 65 78 74 65 72 6e 61 6c 20 66 69  t of external fi
15ad0 6c 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64  les that we hand
15ae0 6c 65 2e 20 20 53 6f 6d 65 20 6f 66 0d 0a 20 20  le.  Some of..  
15af0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
15b00 65 73 65 20 66 69 6c 65 73 20 6d 61 79 20 62 65  ese files may be
15b10 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72 20 6d   native and/or m
15b20 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
15b30 73 20 74 68 61 74 20 61 72 65 0d 0a 20 20 20 20  s that are..    
15b40 20 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75      #       requ
15b50 69 72 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  ired to perform 
15b60 76 61 72 69 6f 75 73 20 74 65 73 74 73 2e 0d 0a  various tests...
15b70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
15b80 20 20 20 73 65 74 20 65 78 74 65 72 6e 61 6c 46     set externalF
15b90 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c  ileNames [list \
15ba0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
15bb0 69 6c 65 20 6a 6f 69 6e 20 45 6e 74 69 74 79 46  ile join EntityF
15bc0 72 61 6d 65 77 6f 72 6b 20 6c 69 62 20 5b 73 74  ramework lib [st
15bd0 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 46  ring map [list F
15be0 78 20 22 22 5d 20 5b 73 74 72 69 6e 67 20 5c 0d  x ""] [string \.
15bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 70  .            map
15c00 20 5b 6c 69 73 74 20 6e 65 74 46 78 34 35 31 20   [list netFx451 
15c10 6e 65 74 46 78 34 35 5d 20 5b 67 65 74 42 75 69  netFx45] [getBui
15c20 6c 64 4e 65 74 46 78 5d 5d 5d 20 45 6e 74 69 74  ldNetFx]]] Entit
15c30 79 46 72 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d  yFramework.dll]]
15c40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
15c50 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
15c60 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66  uild the list of
15c70 20 6e 61 74 69 76 65 20 61 73 73 65 6d 62 6c 79   native assembly
15c80 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68   files that we h
15c90 61 6e 64 6c 65 2e 20 20 54 68 65 0d 0a 20 20 20  andle.  The..   
15ca0 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 61       #       rea
15cb0 73 6f 6e 20 74 68 65 20 22 53 79 73 74 65 6d 2e  son the "System.
15cc0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22  Data.SQLite.dll"
15cd0 20 66 69 6c 65 20 69 73 20 69 6e 63 6c 75 64 65   file is include
15ce0 64 20 68 65 72 65 20 69 73 0d 0a 20 20 20 20 20  d here is..     
15cf0 20 20 20 23 20 20 20 20 20 20 20 62 65 63 61 75     #       becau
15d00 73 65 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  se it could be t
15d10 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
15d20 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
15d30 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
15d40 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
15d50 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
15d60 20 20 20 20 20 73 71 6c 69 74 65 33 2e 64 6c 6c       sqlite3.dll
15d70 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
15d80 64 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  dll System.Data.
15d90 53 51 4c 69 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20  SQLite.dll].... 
15da0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15db0 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
15dc0 74 68 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61  the list of mana
15dd0 67 65 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ged assembly fil
15de0 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
15df0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
15e00 20 20 20 20 20 20 20 73 65 74 20 6d 61 6e 61 67         set manag
15e10 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  edFileNames [lis
15e20 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
15e30 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
15e40 69 74 65 2e 64 6c 6c 20 53 79 73 74 65 6d 2e 44  ite.dll System.D
15e50 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
15e60 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dll \..         
15e70 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
15e80 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a  QLite.EF6.dll]..
15e90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15ea0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d       # NOTE: Rem
15eb0 6f 76 65 20 61 6e 79 20 74 65 73 74 20 63 6f 6e  ove any test con
15ec0 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 72 65  straints that re
15ed0 66 65 72 20 74 6f 20 74 68 65 20 6e 61 74 69 76  fer to the nativ
15ee0 65 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20 20  e and/or..      
15ef0 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
15f00 64 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 73  d assembly files
15f10 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65 20   that we handle 
15f20 75 6e 6c 65 73 73 20 66 6f 72 62 69 64 64 65 6e  unless forbidden
15f30 20 66 72 6f 6d 0d 0a 20 20 20 20 20 20 20 20 23   from..        #
15f40 20 20 20 20 20 20 20 64 6f 69 6e 67 20 73 6f 2e         doing so.
15f50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
15f60 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
15f70 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
15f80 74 65 52 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69  teRemoveConstrai
15f90 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  nts)]} then {.. 
15fa0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
15fb0 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69   fileName $confi
15fc0 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  gFileNames {..  
15fd0 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
15fe0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
15ff0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66 69  ndArgs file_ $fi
16000 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
16010 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16020 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
16030 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
16040 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
16050 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
16060 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
16070 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
16080 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
16090 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
160a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
160b0 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65  externalFileName
160c0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
160d0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
160e0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
160f0 6c 65 5f 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  le_ [file tail $
16100 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20  fileName]]..    
16110 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
16120 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16130 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c  eName $nativeFil
16140 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
16150 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
16160 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
16170 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
16180 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
16190 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
161a0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
161b0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
161c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
161d0 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
161e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
161f0 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
16200 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16210 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16220 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
16230 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 53 79 73  TE: Skip all Sys
16240 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
16250 72 65 6c 61 74 65 64 20 66 69 6c 65 20 68 61 6e  related file han
16260 64 6c 69 6e 67 20 28 64 65 6c 65 74 69 6e 67 2c  dling (deleting,
16270 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
16280 20 20 63 6f 70 79 69 6e 67 2c 20 61 6e 64 20 6c    copying, and l
16290 6f 61 64 69 6e 67 29 20 69 66 20 69 6e 73 74 72  oading) if instr
162a0 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
162b0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  #..        if {!
162c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
162d0 6f 28 73 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  o(sqliteFiles)]}
162e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
162f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
16300 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
16310 69 6e 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e  ing to delete an
16320 79 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72  y files if instr
16330 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  ucted...        
16340 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
16350 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
16360 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
16370 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
16380 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
16390 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
163a0 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
163b0 74 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d  teConfigFiles)]}
163c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
163d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
163e0 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46  ileName $configF
163f0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16400 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
16410 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
16420 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
16430 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16440 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16450 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16460 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16470 64 65 6c 65 74 65 53 71 6c 69 74 65 45 78 74 65  deleteSqliteExte
16480 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20 74 68 65  rnalFiles)]} the
16490 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
164a0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
164b0 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
164c0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
164d0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
164e0 6c 65 74 65 42 75 69 6c 64 46 69 6c 65 20 24 66  leteBuildFile $f
164f0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
16500 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16510 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
16520 68 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65  h fileName $exte
16530 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d  rnalFileNames {.
16540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16550 20 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79   tryDeleteBinary
16560 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a  File $fileName..
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
16580 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
16590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
165a0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
165b0 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74  ::no(deleteSqlit
165c0 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d 20  eNativeFiles)]} 
165d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
165e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
165f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
16600 65 74 65 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  eteSqliteImplici
16610 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b  tFiles)]} then {
16620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16630 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
16640 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
16650 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16660 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
16670 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  teAssembly $file
16680 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
16690 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
166a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
166b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
166c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
166d0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e  (deleteSqliteNon
166e0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
166f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
16700 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16710 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16720 64 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74  deleteSqlitePlat
16730 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
16740 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16750 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
16760 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
16770 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
16790 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
167a0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
167b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
167c0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
167d0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
167e0 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20  ame $platform.. 
167f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16800 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16810 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16820 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
16830 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
16840 64 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68  deleteSqliteArch
16850 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
16860 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
16870 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
16880 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
16890 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
168a0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
168b0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
168c0 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46  ileName $nativeF
168d0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
168e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168f0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
16900 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63  y $fileName $arc
16910 68 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20  hitecture..     
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
16950 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
16960 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
16970 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16980 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
16990 6c 69 74 65 4d 61 6e 61 67 65 64 46 69 6c 65 73  liteManagedFiles
169a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
169b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
169c0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61  h fileName $mana
169d0 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  gedFileNames {..
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
16a00 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  y $fileName..   
16a10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16a20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
16a30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16a40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16a50 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
16a60 20 66 6f 72 20 74 68 65 20 22 61 75 74 6f 53 65   for the "autoSe
16a70 6c 65 63 74 22 20 72 75 6e 74 69 6d 65 20 6f 70  lect" runtime op
16a80 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65 6e  tion.  If presen
16a90 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  t,..          # 
16aa0 20 20 20 20 20 20 61 74 74 65 6d 70 74 20 74 6f        attempt to
16ab0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
16ac0 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 20  elect the first 
16ad0 61 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20  available..     
16ae0 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
16af0 6c 64 20 28 6f 72 20 22 72 65 6c 65 61 73 65 22  ld (or "release"
16b00 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 20  ) of SQLite and 
16b10 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
16b20 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  te..          # 
16b30 20 20 20 20 20 20 66 6f 72 20 75 73 65 20 77 69        for use wi
16b40 74 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74  th the test suit
16b50 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
16b60 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
16b70 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e  hasRuntimeOption
16b80 20 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68   autoSelect]} 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 5b 63 68 65 63 6b 46 6f 72    if {![checkFor
16bb0 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
16bc0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75  test_channel tru
16bd0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
16be0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
16bf0 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73  orSQLiteReleases
16c00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16c10 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
16c20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
16c30 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
16c40 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
16c50 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
16c60 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75  to verify the bu
16c70 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66  ild directory if
16c80 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20   instructed;..  
16c90 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
16ca0 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
16cb0 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
16cc0 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20   exists or halt 
16cd0 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20  the entire..    
16ce0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
16cf0 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
16d00 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
16d10 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
16d20 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
16d30 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
16d40 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
16d50 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
16d60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
16d70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
16d80 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
16d90 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
16da0 69 72 65 63 74 6f 72 79 20 4d 55 53 54 20 65 78  irectory MUST ex
16db0 69 73 74 20 61 73 20 61 0d 0a 20 20 20 20 20 20  ist as a..      
16dc0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61        #       va
16dd0 6c 69 64 20 64 69 72 65 63 74 6f 72 79 20 66 6f  lid directory fo
16de0 72 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  r the testing pr
16df0 6f 63 65 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75  ocess to continu
16e00 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e...            
16e10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  #..            s
16e20 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
16e30 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 5d  tBuildDirectory]
16e40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16e50 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
16e60 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20 7c 7c  s $directory] ||
16e70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
16e80 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
16e90 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
16ea0 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
16eb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16ec0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
16ed0 45 3a 20 4a 75 73 74 20 70 72 69 6f 72 20 74 6f  E: Just prior to
16ee0 20 61 63 74 75 61 6c 6c 79 20 68 61 6c 74 69 6e   actually haltin
16ef0 67 20 74 68 65 20 74 65 73 74 69 6e 67 20 70 72  g the testing pr
16f00 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20 20 20 20  ocess,..        
16f10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 64        #       ad
16f20 64 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74 68  d an error to th
16f30 65 20 74 65 73 74 20 6c 6f 67 20 66 69 6c 65 2e  e test log file.
16f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16f50 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
16f60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
16f70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
16f80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
16f90 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
16fa0 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79 20 62  uld not verify b
16fb0 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 5c  uild directory \
16fc0 22 22 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  "" $directory \.
16fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fe0 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74     "\", all test
16ff0 69 6e 67 20 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a  ing halted\n"]..
17000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17010 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
17020 20 23 20 4e 4f 54 45 3a 20 52 61 69 73 69 6e 67   # NOTE: Raising
17030 20 61 20 73 63 72 69 70 74 20 65 72 72 6f 72 20   a script error 
17040 66 72 6f 6d 20 74 68 69 73 20 70 6f 69 6e 74 20  from this point 
17050 73 68 6f 75 6c 64 20 68 61 6c 74 0d 0a 20 20 20  should halt..   
17060 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
17070 20 20 20 74 68 65 20 74 65 73 74 69 6e 67 20 70     the testing p
17080 72 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20  rocess...       
17090 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
170a0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 5b 61          error [a
170b0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
170d0 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66 79  could not verify
170e0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
170f0 20 5c 22 22 20 24 64 69 72 65 63 74 6f 72 79 20   \"" $directory 
17100 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17110 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c 20 74 65       "\", all te
17120 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d 0a  sting halted"]..
17130 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17140 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
17150 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17160 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
17170 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
17180 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
17190 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
171a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
171b0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
171c0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
171d0 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
171e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
171f0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17200 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
17210 65 43 6f 6e 66 69 67 46 69 6c 65 73 29 5d 7d 20  eConfigFiles)]} 
17220 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17230 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
17240 6c 65 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69  leName $configFi
17250 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
17260 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
17270 70 79 42 75 69 6c 64 46 69 6c 65 20 24 66 69 6c  pyBuildFile $fil
17280 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
17290 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
172a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
172b0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
172c0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
172d0 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69  SqliteExternalFi
172e0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17310 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65 20 4d  NOTE: Copy the M
17320 61 6e 61 67 65 64 20 44 65 62 75 67 67 69 6e 67  anaged Debugging
17330 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d 44 41   Assistants (MDA
17340 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  ) configuration.
17350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
17360 20 20 20 20 20 20 20 66 69 6c 65 20 66 6f 72 20         file for 
17370 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c 20  the Eagle shell 
17380 74 6f 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74  to the build out
17390 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a  put directory,..
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
173b0 20 20 20 20 20 20 77 68 69 6c 65 20 75 73 69 6e        while usin
173c0 67 20 65 61 63 68 20 6f 66 20 74 68 65 20 6e 61  g each of the na
173d0 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
173e0 75 73 20 6c 65 67 61 63 79 20 74 65 73 74 0d 0a  us legacy test..
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
17400 20 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65        executable
17410 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 68 65  s.  This will he
17420 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  lp to make sure 
17430 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a 20 20  that all the..  
17440 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
17450 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
17460 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
17470 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
17480 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
17490 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
174a0 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73   Debugging Assis
174b0 74 61 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64  tants configured
174c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
174d0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
174e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
174f0 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69 6c  me $mdaConfigFil
17500 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
17510 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
17520 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67 6c  yBinaryFile Eagl
17530 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63  eShell.exe.mda.c
17540 6f 6e 66 69 67 20 22 22 20 24 66 69 6c 65 4e 61  onfig "" $fileNa
17550 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
17560 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
17570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17580 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
17590 70 79 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20  py the external 
175a0 62 69 6e 61 72 69 65 73 2c 20 69 66 20 61 6e 79  binaries, if any
175b0 2c 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  , to the directo
175c0 72 79 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20  ry that..       
175d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
175e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 45 61 67 6c  ontains the Eagl
175f0 65 20 73 68 65 6c 6c 2e 20 20 54 68 69 73 20 69  e shell.  This i
17600 73 20 74 79 70 69 63 61 6c 6c 79 20 75 73 65 64  s typically used
17610 20 74 6f 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20   to make..      
17620 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
17630 73 75 72 65 20 61 73 73 65 6d 62 6c 69 65 73 20  sure assemblies 
17640 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
17650 65 20 6f 6e 65 73 20 62 65 69 6e 67 20 74 65 73  e ones being tes
17660 74 65 64 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ted are..       
17670 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
17680 76 61 69 6c 61 62 6c 65 20 64 75 72 69 6e 67 20  vailable during 
17690 74 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  the testing proc
176a0 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ess...          
176b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
176c0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
176d0 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
176e0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
176f0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
17700 6f 70 79 45 78 74 65 72 6e 61 6c 46 69 6c 65 20  opyExternalFile 
17710 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
17720 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17730 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
17740 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
17750 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
17760 63 6f 70 79 53 71 6c 69 74 65 4e 61 74 69 76 65  copySqliteNative
17770 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
17780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17790 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
177a0 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
177b0 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
177c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
177d0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
177e0 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76   fileName $nativ
177f0 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20  eFileNames {..  
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
17820 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
17830 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17840 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17860 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
17870 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65   ::no(copySqlite
17880 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73  NonImplicitFiles
17890 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
178a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
178b0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
178c0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61  no(copySqlitePla
178d0 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20  tformFiles)] && 
178e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
178f0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17900 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
17910 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
17940 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
17950 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
17960 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
17970 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
17980 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
179b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
179c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
179d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
179e0 6f 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65  opySqliteArchite
179f0 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20  ctureFiles)] && 
17a00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17a10 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17a20 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
17a30 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
17a40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17a50 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
17a60 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
17a70 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17a90 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
17aa0 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
17ab0 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
17ac0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17ad0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17af0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17b00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17b10 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17b20 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e  no(copySqliteMan
17b30 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65  agedFiles)]} the
17b40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17b50 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
17b60 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65  ame $managedFile
17b70 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17b80 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
17b90 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
17ba0 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
17bb0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
17bc0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
17bd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
17be0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
17bf0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
17c00 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
17c10 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
17c20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17c30 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17c40 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
17c50 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
17c60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17c70 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17c80 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
17c90 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
17ca0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17cc0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
17cd0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
17ce0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
17cf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
17d00 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17d10 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
17d20 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20  iteLinqFiles)]} 
17d30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17d40 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
17d50 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
17d60 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
17d70 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
17d80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17d90 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17da0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
17db0 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65  eEf6Files)]} the
17dc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17dd0 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
17de0 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
17df0 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20  QLite.EF6.dll.. 
17e00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
17e10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
17e20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
17e30 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e  no(loadSqliteNon
17e40 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
17e50 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17e60 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17e70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
17e80 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  adSqlitePlatform
17e90 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
17ec0 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
17ed0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17ee0 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
17ef0 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
17f00 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
17f10 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
17f20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17f30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
17f40 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
17f50 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69  (loadSqliteArchi
17f60 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
17f70 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
17f80 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
17f90 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
17fa0 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
17fb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17fc0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
17fd0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
17fe0 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74  Lite.dll $archit
17ff0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
18000 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18010 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18020 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
18030 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
18040 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
18050 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18060 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18070 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18080 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18090 6f 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e  on of \"sqlite3.
180a0 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
180b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
180c0 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
180d0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
180e0 69 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  ite3.dll]] \n]..
180f0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18100 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
18110 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18120 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18130 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18140 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18150 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18160 20 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f   \"SQLite.Intero
18170 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a  p.dll\"... " \..
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
18190 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74  ile version [get
181a0 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53  BinaryFileName S
181b0 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
181c0 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
181d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
181e0 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
181f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18200 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18210 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18220 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
18230 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
18240 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
18250 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
18260 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
18270 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
18280 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
18290 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
182a0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
182b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
182c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
182d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
182e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
182f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
18300 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
18310 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73  version of \"Sys
18320 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18330 4c 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Linq.dll\"... " 
18340 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18350 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
18360 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
18370 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
18380 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20  Lite.Linq.dll]] 
18390 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
183a0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
183b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
183c0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
183d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
183e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
183f0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18400 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
18410 61 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64  ata.SQLite.EF6.d
18420 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
18430 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
18440 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
18450 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  aryFileName Syst
18460 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
18470 46 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  F6.dll]] \n]..  
18480 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18490 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
184a0 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
184b0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
184c0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
184d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
184e0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
184f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18510 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
18520 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
18530 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
18540 20 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74           "/sqlit
18550 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66  e3.dll\"... " [f
18560 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20  ile version \.. 
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
18580 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
18590 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70  e sqlite3.dll $p
185a0 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20  latform]] \n].. 
185b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
185c0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
185d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
185e0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
185f0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18610 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
18620 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61  sion of \"" $pla
18630 74 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20  tform \..       
18640 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74           "/SQLit
18650 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e  e.Interop.dll\".
18660 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69  .. " [file versi
18670 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
18680 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79        [getBinary
18690 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e  FileName SQLite.
186a0 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61  Interop.dll $pla
186b0 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  tform]] \n]..   
186c0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
186d0 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
186e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
186f0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18700 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18730 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66  on of \"" $platf
18740 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  orm \..         
18750 20 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e         "/System.
18760 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
18770 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
18780 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
18790 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
187a0 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
187b0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
187c0 6c 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e  l $platform]] \n
187d0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
187e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
187f0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
18800 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
18810 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
18820 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61   {..          ca
18830 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
18840 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18850 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18860 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18870 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69          "---- fi
18880 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  le version of \"
18890 22 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20  " $architecture 
188a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
188b0 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c     "/sqlite3.dll
188c0 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65  \"... " [file ve
188d0 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20  rsion \..       
188e0 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e           [getBin
188f0 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
18900 74 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  te3.dll $archite
18910 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  cture]] \n]..   
18920 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18930 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20        catch {.. 
18940 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
18950 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18960 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18980 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18990 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69  on of \"" $archi
189a0 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20  tecture \..     
189b0 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c             "/SQL
189c0 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c  ite.Interop.dll\
189d0 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
189e0 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
189f0 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
18a00 72 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74  ryFileName SQLit
18a10 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61  e.Interop.dll $a
18a20 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e  rchitecture]] \n
18a30 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
18a40 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
18a50 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
18a60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18a70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18a80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
18a90 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
18aa0 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
18ab0 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d  $architecture \.
18ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ad0 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   "/System.Data.S
18ae0 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  QLite.dll\"... "
18af0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
18b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18b10 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
18b20 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
18b30 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63  .SQLite.dll $arc
18b40 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d  hitecture]] \n].
18b50 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18b60 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18b70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
18b80 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c  NOTE: Grab the l
18b90 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
18ba0 73 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68  ssemblies for th
18bb0 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
18bc0 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
18bd0 20 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e     and report on
18be0 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
18bf0 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20  .SQLite related 
18c00 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ones...        #
18c10 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61 73  ..        set as
18c20 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
18c30 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
18c40 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
18c50 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
18c60 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74  ..        object
18c70 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
18c80 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
18c90 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
18ca0 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c 7b 53  string match \{S
18cb0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18cc0 65 2a 20 24 61 73 73 65 6d 62 6c 79 5d 7d 20 74  e* $assembly]} t
18cd0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18ce0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18cf0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18d00 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18d10 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f          "---- fo
18d20 75 6e 64 20 6c 6f 61 64 65 64 20 61 73 73 65 6d  und loaded assem
18d30 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79  bly: " $assembly
18d40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
18d50 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
18d60 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
18d70 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
18d80 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
18d90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18da0 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63    "---- define c
18db0 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53  onstants for \"S
18dc0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18dd0 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  e\"... "....    
18de0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
18df0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
18e00 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
18e10 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
18e20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18e30 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
18e40 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 44 65  QLite.SQLite3 De
18e50 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 0d 0a 20  fineConstants.. 
18e60 20 20 20 20 20 20 20 20 20 7d 20 64 65 66 69 6e           } defin
18e70 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30  eConstants] == 0
18e80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
18e90 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18ea0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18eb0 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
18ec0 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
18ee0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20  efineConstants] 
18ef0 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
18f00 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
18f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
18f20 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18f30 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
18f40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18f50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18f60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
18f70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18f80 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
18f90 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
18fa0 73 6f 75 72 63 65 20 76 65 72 73 69 6f 6e 20 6f  source version o
18fb0 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  f \"System.Data.
18fc0 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
18fd0 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  "....          i
18fe0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
18ff0 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
19000 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
19010 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
19020 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
19030 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
19040 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  QLiteConnection 
19050 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f 6e 0d  ProviderVersion.
19060 0a 20 20 20 20 20 20 20 20 20 20 7d 20 76 65 72  .          } ver
19070 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
19080 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19090 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
190a0 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20  th $version] == 
190b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
190c0 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
190d0 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
190e0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
190f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19100 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
19110 65 6e 64 41 72 67 73 20 24 76 65 72 73 69 6f 6e  endArgs $version
19120 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
19130 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
19140 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
19150 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
19160 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
19170 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
19180 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
19190 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
191a0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
191b0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
191c0 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20     "---- source 
191d0 63 68 65 63 6b 6f 75 74 20 6f 66 20 5c 22 53 79  checkout of \"Sy
191e0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
191f0 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20  .dll\"... ".... 
19200 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
19210 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
19220 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
19230 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
19240 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
19250 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
19260 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43  a.SQLite.SQLiteC
19270 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64  onnection Provid
19280 65 72 53 6f 75 72 63 65 49 64 0d 0a 20 20 20 20  erSourceId..    
19290 20 20 20 20 20 20 7d 20 73 6f 75 72 63 65 49 64        } sourceId
192a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
192b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
192c0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
192d0 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20  sourceId] == 0} 
192e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
192f0 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
19300 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  Id null..       
19310 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19320 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
19330 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
19340 64 41 72 67 73 20 24 73 6f 75 72 63 65 49 64 20  dArgs $sourceId 
19350 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
19360 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
19370 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19380 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
19390 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
193a0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
193b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
193c0 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
193d0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 62   the available b
193e0 75 69 6c 64 73 20 28 61 6e 64 20 22 72 65 6c 65  uilds (and "rele
193f0 61 73 65 73 22 29 20 6f 66 20 53 51 4c 69 74 65  ases") of SQLite
19400 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20   and..        # 
19410 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
19420 61 2e 53 51 4c 69 74 65 2e 0d 0a 20 20 20 20 20  a.SQLite...     
19430 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
19440 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c  eckForSQLiteBuil
19450 64 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ds $::test_chann
19460 65 6c 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63  el..        chec
19470 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65 61 73  kForSQLiteReleas
19480 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  es $::test_chann
19490 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  el....        #.
194a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
194b0 20 4e 6f 77 2c 20 77 65 20 6e 65 65 64 20 74 6f   Now, we need to
194c0 20 6b 6e 6f 77 20 69 66 20 74 68 65 20 53 51 4c   know if the SQL
194d0 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79  ite core library
194e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0d 0a 20   is available.. 
194f0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28         #       (
19500 69 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 65  i.e. because the
19510 20 6d 61 6e 61 67 65 64 2d 6f 6e 6c 79 20 53 79   managed-only Sy
19520 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
19530 20 61 73 73 65 6d 62 6c 79 20 63 61 6e 0d 0a 20   assembly can.. 
19540 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
19550 6f 61 64 20 77 69 74 68 6f 75 74 20 69 74 3b 20  oad without it; 
19560 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 6e  however, it cann
19570 6f 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 75  ot do anything u
19580 73 65 66 75 6c 20 77 69 74 68 6f 75 74 0d 0a 20  seful without.. 
19590 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
195a0 74 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  t).  If we are u
195b0 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
195c0 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 61 6e 64  ode assembly and
195d0 20 77 65 20 61 6c 72 65 61 64 79 0d 0a 20 20 20   we already..   
195e0 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f 75       #       fou
195f0 6e 64 20 69 74 20 28 61 62 6f 76 65 29 2c 20 74  nd it (above), t
19600 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  his should alway
19610 73 20 73 75 63 63 65 65 64 2e 0d 0a 20 20 20 20  s succeed...    
19620 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
19630 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62  heckForSQLiteLib
19640 72 61 72 79 20 24 3a 3a 74 65 73 74 5f 63 68 61  rary $::test_cha
19650 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
19660 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19670 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
19680 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61  SQLite interop a
19690 73 73 65 6d 62 6c 79 20 69 73 20 61 76 61 69 6c  ssembly is avail
196a0 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  able...        #
196b0 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
196c0 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
196d0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
196e0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
196f0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
19700 65 63 6b 20 74 68 65 20 53 51 4c 69 74 65 20 64  eck the SQLite d
19710 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
19720 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
19730 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
19740 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
19750 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
19760 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
19770 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
19780 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
19790 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
197a0 69 6e 65 20 69 66 20 76 61 72 69 6f 75 73 20 63  ine if various c
197b0 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
197c0 6f 6e 73 20 6e 65 65 64 65 64 20 66 6f 72 0d 0a  ons needed for..
197d0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
197e0 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
197f0 20 77 65 72 65 20 65 6e 61 62 6c 65 64 20 66 6f   were enabled fo
19800 72 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  r the managed as
19810 73 65 6d 62 6c 79 2e 20 20 54 68 65 72 65 0d 0a  sembly.  There..
19820 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19830 61 72 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  are some compile
19840 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 74 68  -time options th
19850 61 74 20 6d 75 73 74 20 61 6c 73 6f 20 68 61 76  at must also hav
19860 65 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 0d 0a  e been enabled..
19870 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19880 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 20  for the interop 
19890 61 73 73 65 6d 62 6c 79 20 69 6e 20 6f 72 64 65  assembly in orde
198a0 72 20 74 6f 20 62 65 20 65 66 66 65 63 74 69 76  r to be effectiv
198b0 65 2e 20 20 46 6f 72 20 74 68 6f 73 65 0d 0a 20  e.  For those.. 
198c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f         #       o
198d0 70 74 69 6f 6e 73 2c 20 69 74 20 77 69 6c 6c 20  ptions, it will 
198e0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
198f0 69 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 66  it was enabled f
19900 6f 72 20 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a  or the interop..
19910 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19920 61 73 73 65 6d 62 6c 79 20 69 66 20 69 74 20 77  assembly if it w
19930 61 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74  as enabled for t
19940 68 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  he managed assem
19950 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  bly...        #.
19960 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  .        foreach
19970 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20   defineConstant 
19980 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
19990 20 20 20 20 20 43 48 45 43 4b 5f 53 54 41 54 45       CHECK_STATE
199a0 20 43 4f 55 4e 54 5f 48 41 4e 44 4c 45 20 44 45   COUNT_HANDLE DE
199b0 42 55 47 20 49 4e 54 45 52 4f 50 5f 43 4f 44 45  BUG INTEROP_CODE
199c0 43 20 49 4e 54 45 52 4f 50 5f 44 45 42 55 47 20  C INTEROP_DEBUG 
199d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49  \..            I
199e0 4e 54 45 52 4f 50 5f 45 58 54 45 4e 53 49 4f 4e  NTEROP_EXTENSION
199f0 5f 46 55 4e 43 54 49 4f 4e 53 20 49 4e 54 45 52  _FUNCTIONS INTER
19a00 4f 50 5f 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20  OP_LEGACY_CLOSE 
19a10 49 4e 54 45 52 4f 50 5f 4c 4f 47 20 5c 0d 0a 20  INTEROP_LOG \.. 
19a20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
19a30 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
19a40 4e 20 49 4e 54 45 52 4f 50 5f 56 49 52 54 55 41  N INTEROP_VIRTUA
19a50 4c 5f 54 41 42 4c 45 20 4e 45 54 5f 32 30 20 4e  L_TABLE NET_20 N
19a60 45 54 5f 33 35 20 5c 0d 0a 20 20 20 20 20 20 20  ET_35 \..       
19a70 20 20 20 20 20 4e 45 54 5f 34 30 20 4e 45 54 5f       NET_40 NET_
19a80 34 35 20 4e 45 54 5f 34 35 31 20 4e 45 54 5f 43  45 NET_451 NET_C
19a90 4f 4d 50 41 43 54 5f 32 30 20 50 4c 41 54 46 4f  OMPACT_20 PLATFO
19aa0 52 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57  RM_COMPACTFRAMEW
19ab0 4f 52 4b 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ORK \..         
19ac0 20 20 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56     PRELOAD_NATIV
19ad0 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47  E_LIBRARY RETARG
19ae0 45 54 41 42 4c 45 20 53 51 4c 49 54 45 5f 53 54  ETABLE SQLITE_ST
19af0 41 4e 44 41 52 44 20 5c 0d 0a 20 20 20 20 20 20  ANDARD \..      
19b00 20 20 20 20 20 20 54 48 52 4f 57 5f 4f 4e 5f 44        THROW_ON_D
19b10 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52  ISPOSED TRACE TR
19b20 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 54  ACE_CONNECTION T
19b30 52 41 43 45 5f 48 41 4e 44 4c 45 20 5c 0d 0a 20  RACE_HANDLE \.. 
19b40 20 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45             TRACE
19b50 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53  _PRELOAD TRACE_S
19b60 48 41 52 45 44 20 54 52 41 43 45 5f 53 54 41 54  HARED TRACE_STAT
19b70 45 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e  EMENT TRACE_WARN
19b80 49 4e 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ING \..         
19b90 20 20 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f     TRACK_MEMORY_
19ba0 42 59 54 45 53 20 55 53 45 5f 45 4e 54 49 54 59  BYTES USE_ENTITY
19bb0 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45  _FRAMEWORK_6 USE
19bc0 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 5c 0d 0a  _INTEROP_DLL \..
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 55 53 45 5f              USE_
19be0 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f  PREPARE_V2 WINDO
19bf0 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  WS] {..         
19c00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
19c10 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
19c20 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  he compile-time 
19c30 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  option is listed
19c40 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d   in the list of.
19c50 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
19c60 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74     "define const
19c70 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b  ants" kept track
19c80 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67   of by the manag
19c90 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
19ca0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19cb0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
19cc0 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
19cd0 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  t $::test_channe
19ce0 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  l $defineConstan
19cf0 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  t..        }....
19d00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19d10 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
19d20 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
19d30 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63 61  ld year.  Basica
19d40 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61  lly, this indica
19d50 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  tes..        #  
19d60 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73 69       which versi
19d70 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 6e  on of MSBuild an
19d80 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75 64  d/or Visual Stud
19d90 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d 0a  io was used to..
19da0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19db0 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73 65  compile the asse
19dc0 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75 6e  mbly binaries un
19dd0 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20 20  der test...     
19de0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70     #..        tp
19df0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
19e00 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
19e10 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
19e20 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
19e30 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 79  a.SQLite build y
19e40 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ear... "....    
19e50 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65      set year [ge
19e60 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20  tBuildYear]..   
19e70 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
19e80 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62  nt [appendArgs b
19e90 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72 5d  uildYear. $year]
19ea0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
19eb0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
19ec0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
19ed0 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  year \"\n]....  
19ee0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19ef0 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
19f00 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
19f10 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e   .NET Framework.
19f20 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
19f30 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
19f40 20 20 20 69 6e 64 69 63 61 74 65 73 20 77 68 69     indicates whi
19f50 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ch version of th
19f60 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
19f70 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20 20   is being..     
19f80 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
19f90 62 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  by the assembly 
19fa0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
19fb0 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
19fc0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
19fd0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
19fe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
19ff0 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1a000 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a010 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54 20 46  ite build .NET F
1a020 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d  ramework... "...
1a030 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 65 74  .        set net
1a040 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  Fx [getBuildNetF
1a050 78 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43  x]..        addC
1a060 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
1a070 64 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65  dArgs buildFrame
1a080 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20  work. $netFx].. 
1a090 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1a0a0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1a0b0 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e 65 74  pendArgs \" $net
1a0c0 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  Fx \"\n]....    
1a0d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a0e0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65   NOTE: Check the
1a0f0 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 63   current build c
1a100 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54  onfiguration.  T
1a110 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  his should norma
1a120 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  lly..        #  
1a130 20 20 20 20 20 62 65 20 65 69 74 68 65 72 20 22       be either "
1a140 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65 61  Debug" or "Relea
1a150 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  se"...        #.
1a160 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1a170 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1a180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1a190 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
1a1a0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1a1b0 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ite build config
1a1c0 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a  uration... "....
1a1d0 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 66          set conf
1a1e0 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42 75  iguration [getBu
1a1f0 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
1a200 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  ]..        addCo
1a210 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
1a220 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69 67  Args buildConfig
1a230 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69 67  uration. $config
1a240 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20  uration]..      
1a250 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a260 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a270 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67 75 72  rgs \" $configur
1a280 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  ation \"\n].... 
1a290 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a2a0 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f    # NOTE: Try to
1a2b0 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65 72 72   setup an interr
1a2c0 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  upt callback usi
1a2d0 6e 67 20 74 68 65 20 73 63 72 69 70 74 20 64 65  ng the script de
1a2e0 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20 20 20  bugger..        
1a2f0 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
1a300 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c  l cancel all SQL
1a310 20 71 75 65 72 69 65 73 20 69 6e 20 70 72 6f 67   queries in prog
1a320 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64 61 74  ress for all dat
1a330 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20 20 23  abase..        #
1a340 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
1a350 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73  ns known to this
1a360 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1a370 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a380 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1a390 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49  sts ::no(sqliteI
1a3a0 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
1a3b0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1a3c0 20 20 20 20 20 20 73 65 74 75 70 44 62 49 6e 74        setupDbInt
1a3d0 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 24  erruptCallback $
1a3e0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
1a3f0 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20  ::test_log..    
1a400 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a410 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1a420 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
1a430 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69 6d 65  e native runtime
1a440 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68 20 77   option, which w
1a450 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61 72 65  ould mean we are
1a460 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a470 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69 78 65    using the mixe
1a480 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e  d-mode assembly.
1a490 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1a4a0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
1a4b0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
1a4c0 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76  st_channel nativ
1a4d0 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e....        #..
1a4e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1a4f0 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
1a500 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 63  t suite should c
1a510 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1a520 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a  of connections..
1a530 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a540 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22 63 6c  "opened" and "cl
1a550 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65 20 70  osed" from the p
1a560 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72 6d 69  ool when determi
1a570 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74 0d 0a  ning if a test..
1a580 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a590 70 61 73 73 65 64 2e 20 20 44 69 73 61 62 6c 69  passed.  Disabli
1a5a0 6e 67 20 74 68 69 73 20 62 65 68 61 76 69 6f 72  ng this behavior
1a5b0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65   is sometimes ne
1a5c0 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20  cessary (e.g... 
1a5d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
1a5e0 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65 61 73  uring the releas
1a5f0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
1a600 73 29 20 62 65 63 61 75 73 65 20 74 68 65 72 65  s) because there
1a610 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a 20 20   are several..  
1a620 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
1a630 73 74 73 20 74 68 61 74 20 72 65 6c 79 20 6f 6e  sts that rely on
1a640 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66 72 6f   the "opened fro
1a650 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65  m pool" count be
1a660 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20 20 20  ing greater..   
1a670 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61       #       tha
1a680 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65 20 74  n zero.  These t
1a690 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20 64 75  ests may fail du
1a6a0 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74  e to the non-det
1a6b0 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20 20 20  erministic..    
1a6c0 20 20 20 20 23 20 20 20 20 20 20 20 62 65 68 61      #       beha
1a6d0 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c 52 20  vior of the CLR 
1a6e0 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20 74 68  GC, even when th
1a6f0 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20 69 6e  ere is no bug in
1a700 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20 20 20   the code..     
1a710 20 20 20 23 20 20 20 20 20 20 20 62 65 69 6e 67     #       being
1a720 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20 20 20   tested...      
1a730 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
1a740 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69  ckForRuntimeOpti
1a750 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  on $::test_chann
1a760 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d  el noPoolCounts.
1a770 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a780 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
1a790 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
1a7a0 65 20 75 73 61 67 65 20 70 72 69 6f 72 20 74 6f  e usage prior to
1a7b0 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20 74 65 73   running any tes
1a7c0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
1a7d0 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51          reportSQ
1a7e0 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a  LiteResources $:
1a7f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
1a800 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a810 20 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62      # NOTE: Grab
1a820 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
1a830 69 76 65 20 6d 6f 64 75 6c 65 73 20 66 6f 72 20  ive modules for 
1a840 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
1a850 65 73 73 20 61 6e 64 0d 0a 20 20 20 20 20 20 20  ess and..       
1a860 20 23 20 20 20 20 20 20 20 72 65 70 6f 72 74 20   #       report 
1a870 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61  on the System.Da
1a880 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65  ta.SQLite relate
1a890 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20  d ones...       
1a8a0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
1a8b0 6d 6f 64 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20  modules [object 
1a8c0 69 6e 76 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20  invoke \..      
1a8d0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
1a8e0 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73  gnostics.Process
1a8f0 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
1a900 73 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20  ss Modules].... 
1a910 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
1a920 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f 64  reach -alias mod
1a930 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a  ule $modules {..
1a940 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1a950 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
1a960 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e  he module file n
1a970 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65  ame here must be
1a980 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20   normalized...  
1a990 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a9a0 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
1a9b0 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a  e [file normaliz
1a9c0 65 20 5b 24 6d 6f 64 75 6c 65 20 46 69 6c 65 4e  e [$module FileN
1a9d0 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ame]]....       
1a9e0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d     if {[string m
1a9f0 61 74 63 68 20 2d 6e 6f 63 61 73 65 20 2a 2f 73  atch -nocase */s
1aa00 71 6c 69 74 65 33 2e 64 6c 6c 20 24 66 69 6c 65  qlite3.dll $file
1aa10 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
1aa20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1aa30 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1aa40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
1aa70 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  ed SQLite native
1aa80 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a   library module:
1aa90 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1aaa0 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65 20        $fileName 
1aab0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
1aac0 20 65 6c 73 65 69 66 20 7b 5b 73 74 72 69 6e 67   elseif {[string
1aad0 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
1aae0 20 20 20 20 20 20 20 20 2d 6e 6f 63 61 73 65 20          -nocase 
1aaf0 2a 2f 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  */SQLite.Interop
1ab00 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  .dll $fileName]}
1ab10 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ab20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
1ab30 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
1ab40 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
1ab50 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1ab60 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51 4c  found loaded SQL
1ab70 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65  ite interop asse
1ab80 6d 62 6c 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c  mbly module: " \
1ab90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aba0 20 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d    $fileName \n].
1abb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1abc0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1abd0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
1abe0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1abf0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
1ac10 2d 2d 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  -- compile-time 
1ac20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69  options for SQLi
1ac30 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e  te core library.
1ac40 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1ac50 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1ac70 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1ac80 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1aca0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1acb0 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74 65  e.SQLite3 SQLite
1acc0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a  CompileOptions..
1acd0 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d 70            } comp
1ace0 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20 30  ileOptions] == 0
1acf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1ad00 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1ad10 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1ad20 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c  endArgs [formatL
1ad30 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20  ist [lsort \..  
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 63                $c
1ad50 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c  ompileOptions] <
1ad60 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20  none>] \n]..    
1ad70 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1ad90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ada0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
1adb0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1adc0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1add0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1ade0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1adf0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1ae00 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1ae10 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
1ae20 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 69  ons for SQLite i
1ae30 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e  nterop assembly.
1ae40 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
1ae50 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
1ae70 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
1ae80 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1aea0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1aeb0 65 2e 53 51 4c 69 74 65 33 20 49 6e 74 65 72 6f  e.SQLite3 Intero
1aec0 70 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 0d  pCompileOptions.
1aed0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 63 6f 6d  .          } com
1aee0 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d 3d 20  pileOptions] == 
1aef0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1af00 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1af10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1af20 70 65 6e 64 41 72 67 73 20 5b 66 6f 72 6d 61 74  pendArgs [format
1af30 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20  List [lsort \.. 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
1af50 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20  compileOptions] 
1af60 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20  <none>] \n]..   
1af70 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1af80 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1af90 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1afa0 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
1afb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1afc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1afd0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1afe0 45 3a 20 53 68 6f 77 20 74 68 65 20 61 63 74 69  E: Show the acti
1aff0 76 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ve test constrai
1b000 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nts...        #.
1b010 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1b020 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1b030 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d 2d 2d  appendArgs "----
1b040 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 20 22 20   constraints: " 
1b050 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
1b060 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1b070 74 20 5b 67 65 74 43 6f 6e 73 74 72 61 69 6e 74  t [getConstraint
1b080 73 5d 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d  s]] <none>] \n].
1b090 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b0a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 61        # NOTE: Sa
1b0b0 76 65 20 74 68 65 20 74 65 73 74 20 63 6f 6e 73  ve the test cons
1b0c0 74 72 61 69 6e 74 73 20 66 6f 72 20 75 73 65 20  traints for use 
1b0d0 62 79 20 74 68 72 65 61 64 73 20 63 72 65 61 74  by threads creat
1b0e0 65 64 20 69 6e 20 74 68 69 73 0d 0a 20 20 20 20  ed in this..    
1b0f0 20 20 20 20 23 20 20 20 20 20 20 20 61 70 70 6c      #       appl
1b100 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20  ication domain. 
1b110 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1b120 72 79 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  ry because all t
1b130 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  he Eagle..      
1b140 20 20 23 20 20 20 20 20 20 20 22 74 65 73 74 20    #       "test 
1b150 63 6f 6e 74 65 78 74 22 20 69 6e 66 6f 72 6d 61  context" informa
1b160 74 69 6f 6e 20 69 73 20 70 65 72 2d 74 68 72 65  tion is per-thre
1b170 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ad...        #..
1b180 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1b190 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1b1a0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 5d 7d 20 74  _constraints]} t
1b1b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b1c0 20 73 65 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 73   set ::test_cons
1b1d0 74 72 61 69 6e 74 73 20 24 3a 3a 65 61 67 6c 65  traints $::eagle
1b1e0 5f 74 65 73 74 73 28 63 6f 6e 73 74 72 61 69 6e  _tests(constrain
1b1f0 74 73 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ts)..        }..
1b200 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b210 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61       # NOTE: Loa
1b220 64 20 74 68 65 20 22 61 66 74 65 72 2d 63 6f 6e  d the "after-con
1b230 73 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d  straints" custom
1b240 20 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72   per-user and/or
1b250 20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20   per-host..     
1b260 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
1b270 73 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20  settings now... 
1b280 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b290 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73    uplevel 1 [lis
1b2a0 74 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74  t loadSQLiteTest
1b2b0 53 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74  Settings $::test
1b2c0 5f 63 68 61 6e 6e 65 6c 20 2e 61 66 74 65 72 5d  _channel .after]
1b2d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1b2e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1b2f0 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
1b300 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
1b310 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
1b320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
1b330 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1b340 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1b350 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1b360 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
1b370 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
1b380 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
1b390 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
1b3a0 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
1b3b0 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
1b3c0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
1b3d0 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
1b3e0 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b 7d 20  TestEpilogue {} 
1b3f0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1b400 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 72    # NOTE: Skip r
1b410 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74 6f  unning our custo
1b420 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20 74 68  m epilogue if th
1b430 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20 62  e main one has b
1b440 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
1b450 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
1b460 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1b470 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1b480 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61 67 6c  no(epilogue.eagl
1b490 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  e)]} then {..   
1b4a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b4b0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77 68 65  # NOTE: Show whe
1b4c0 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63 74 75  n our tests actu
1b4d0 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f 77 29  ally ended (now)
1b4e0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b4f0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1b500 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1b510 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1b520 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53 79 73         "---- Sys
1b530 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1b540 74 65 73 74 73 20 65 6e 64 65 64 20 61 74 20 22  tests ended at "
1b550 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1b560 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63  [clock format [c
1b570 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d 20 5c  lock seconds]] \
1b580 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  n]....        #.
1b590 0a 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49  .        # BUGFI
1b5a0 58 3a 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69  X: Before checki
1b5b0 6e 67 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73  ng the final res
1b5c0 6f 75 72 63 65 73 20 69 6e 20 75 73 65 20 62 79  ources in use by
1b5d0 20 53 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20   SQLite, make.. 
1b5e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
1b5f0 20 73 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68   sure both of th
1b600 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64  e PRAGMA related
1b610 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73   directory names
1b620 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20   are freed...   
1b630 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b640 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69  checkForSQLiteDi
1b650 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73  rectories $::tes
1b660 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a  t_channel true..
1b670 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b680 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73       # NOTE: Als
1b690 6f 20 72 65 70 6f 72 74 20 74 68 65 20 72 65 73  o report the res
1b6a0 6f 75 72 63 65 20 75 73 61 67 65 20 61 66 74 65  ource usage afte
1b6b0 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65  r running the te
1b6c0 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  sts...        #.
1b6d0 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72 74 53  .        reportS
1b6e0 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20 24  QLiteResources $
1b6f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
1b700 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1b710 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70       # NOTE: Rep
1b720 6f 72 74 20 74 68 65 20 63 72 69 74 69 63 61 6c  ort the critical
1b730 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61   handle counts a
1b740 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
1b750 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20   tests...       
1b760 20 23 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53   #..        getS
1b770 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74  QLiteHandleCount
1b780 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b790 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  l..      }..    
1b7a0 7d 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23  }.....    ######
1b7b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b7c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b7d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b7e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b7f0 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
1b800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b810 23 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67  ######## END Eag
1b820 6c 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23  le ONLY ########
1b830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b840 23 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23  ######..    ####
1b850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b880 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b890 23 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a  #######..  }....
1b8a0 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53    #..  # NOTE: S
1b8b0 61 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ave the name of 
1b8c0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1b8d0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69  ntaining this fi
1b8e0 6c 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b  le...  #..  if {
1b8f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f  ![info exists co
1b900 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d  mmon_directory]}
1b910 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74   then {..    set
1b920 20 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72   common_director
1b930 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
1b940 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a  [info script]]..
1b950 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20    }....  #..  # 
1b960 4e 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68  NOTE: Provide th
1b970 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1b980 4c 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67  Lite test packag
1b990 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  e to the interpr
1b9a0 65 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61  eter...  #..  pa
1b9b0 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79  ckage provide Sy
1b9c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1b9d0 2e 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a        .Test 1.0..}..