System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact dcb069e210d9db86f48bc435d8aa60ed52af6d7a:


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 45 61 67 6c 65 53 68           EagleSh
15a30 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f  ell32.exe.mda.co
15a40 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65  nfig Installer.e
15a50 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
15a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
15a70 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  t.exe.mda.config
15a80 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64   testlinq.exe.md
15a90 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20  a.config \..    
15aa0 20 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e          testef6.
15ab0 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d  exe.mda.config].
15ac0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15ad0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
15ae0 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
15af0 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74  external files t
15b00 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20  hat we handle.  
15b10 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20  Some of..       
15b20 20 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66   #       these f
15b30 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69  iles may be nati
15b40 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65  ve and/or manage
15b50 64 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61  d assemblies tha
15b60 74 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  t are..        #
15b70 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20         required 
15b80 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f  to perform vario
15b90 75 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  us tests...     
15ba0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
15bb0 74 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  t externalFileNa
15bc0 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
15bd0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
15be0 6f 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77  oin EntityFramew
15bf0 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20  ork lib [string 
15c00 6d 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d  map [list Fx ""]
15c10 20 5b 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20   [string \..    
15c20 20 20 20 20 20 20 20 20 6d 61 70 20 5b 6c 69 73          map [lis
15c30 74 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78  t netFx451 netFx
15c40 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74  45] [getBuildNet
15c50 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
15c60 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
15c70 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c80 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
15c90 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
15ca0 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
15cb0 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
15cc0 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20  .  The..        
15cd0 23 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74  #       reason t
15ce0 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  he "System.Data.
15cf0 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65  SQLite.dll" file
15d00 20 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72   is included her
15d10 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  e is..        # 
15d20 20 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74        because it
15d30 20 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69   could be the mi
15d40 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
15d50 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
15d60 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
15d70 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
15d80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15d90 73 71 6c 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69  sqlite3.dll SQLi
15da0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53  te.Interop.dll S
15db0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
15dc0 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  e.dll]....      
15dd0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
15de0 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
15df0 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
15e00 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
15e10 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
15e20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15e30 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c    set managedFil
15e40 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
15e50 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
15e60 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
15e70 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
15e80 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c  QLite.Linq.dll \
15e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
15ea0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
15eb0 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
15ec0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15ed0 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61  # NOTE: Remove a
15ee0 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ny test constrai
15ef0 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74  nts that refer t
15f00 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64  o the native and
15f10 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  /or..        #  
15f20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
15f30 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
15f40 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73   we handle unles
15f50 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d  s forbidden from
15f60 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
15f70 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20    doing so...   
15f80 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15f90 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
15fa0 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d  s ::no(sqliteRem
15fb0 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  oveConstraints)]
15fc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15fd0 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
15fe0 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
15ff0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
16000 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
16010 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
16020 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
16030 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
16040 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
16050 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
16060 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
16070 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16080 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
16090 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
160a0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
160b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
160c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
160d0 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
160e0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
160f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
16100 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
16110 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b  pendArgs file_ [
16120 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
16130 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
16140 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
16150 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
16160 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
16170 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
16180 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
16190 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
161a0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
161b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
161c0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
161d0 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
161e0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
161f0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
16200 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
16210 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
16220 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
16230 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
16240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
16250 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
16260 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44  kip all System.D
16270 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
16280 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67  ed file handling
16290 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20   (deleting,..   
162a0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
162b0 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e  ying, and loadin
162c0 67 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  g) if instructed
162d0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
162e0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
162f0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
16300 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
16310 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
16320 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
16330 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
16340 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
16350 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
16360 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
16370 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
16380 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
16390 28 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c  (deleteSqliteFil
163a0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
163b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
163c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
163d0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e  (deleteSqliteCon
163e0 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
163f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16400 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
16410 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
16420 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16430 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
16440 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
16450 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
16460 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
16470 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16480 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
16490 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
164a0 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  eSqliteExternalF
164b0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
164d0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
164e0 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
164f0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
16500 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
16510 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
16520 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
16530 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16540 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
16550 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
16560 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
16570 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
16580 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
16590 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
165a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
165b0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
165c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
165d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
165e0 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69  deleteSqliteNati
165f0 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
16600 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16610 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
16620 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
16630 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
16640 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
16660 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
16670 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
16680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16690 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
166a0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
166d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
166e0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
166f0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
16700 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  teSqliteNonImpli
16710 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
16720 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16730 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
16740 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
16750 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  eSqlitePlatformF
16760 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
16790 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
167a0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
167b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
167c0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
167d0 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
16800 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
16810 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
16820 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16840 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16850 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
16860 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
16870 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
16880 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
16890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
168a0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
168b0 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
168c0 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
168f0 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
16900 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
16910 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
16920 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
16930 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
16940 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
16950 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16960 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
16970 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
16980 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
16990 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
169a0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
169b0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
169c0 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
169d0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
169e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
169f0 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
16a00 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
16a10 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
16a20 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
16a30 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
16a40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16a50 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16a60 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16a70 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
16a80 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
16a90 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22  the "autoSelect"
16aa0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e   runtime option.
16ab0 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20    If present,.. 
16ac0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
16ad0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   attempt to auto
16ae0 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
16af0 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c   the first avail
16b00 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  able..          
16b10 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f  #       build (o
16b20 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20  r "release") of 
16b30 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65  SQLite and Syste
16b40 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20  m.Data.SQLite.. 
16b50 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
16b60 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
16b70 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
16b80 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
16b90 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
16ba0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f  ntimeOption auto
16bb0 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d  Select]} then {.
16bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
16bd0 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  {![checkForSQLit
16be0 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f  eBuilds $::test_
16bf0 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74  channel true]} t
16c00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16c10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
16c20 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
16c30 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
16c40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
16c50 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
16c60 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16c70 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
16c80 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65  kip trying to ve
16c90 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64  rify the build d
16ca0 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74  irectory if inst
16cb0 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20  ructed;..       
16cc0 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72     #       other
16cd0 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
16ce0 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  it actually exis
16cf0 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65  ts or halt the e
16d00 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20  ntire..         
16d10 20 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67   #       testing
16d20 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64   process if it d
16d30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a  oes not exist...
16d40 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16d50 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
16d60 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65  o exists ::no(ve
16d70 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f  rifyBuildDirecto
16d80 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
16d90 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
16da0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
16db0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
16dc0 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
16dd0 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61  ory MUST exist a
16de0 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s a..           
16df0 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64   #       valid d
16e00 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
16e10 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
16e20 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20   to continue... 
16e30 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
16e40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
16e50 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c  rectory [getBuil
16e60 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  dDirectory].... 
16e70 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
16e80 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69  [file exists $di
16e90 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20  rectory] || \.. 
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
16eb0 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
16ec0 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
16ed0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
16ee0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16ef0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75        # NOTE: Ju
16f00 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75  st prior to actu
16f10 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65  ally halting the
16f20 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
16f30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
16f40 20 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20   #       add an 
16f50 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73  error to the tes
16f60 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20  t log file...   
16f70 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
16f80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
16f90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16fa0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e     "---- could n
16fd0 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
16fe0 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
16ff0 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
17010 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
17020 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
17030 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
17040 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
17050 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
17060 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
17070 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
17080 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
17090 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
170a0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
170b0 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
170c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
170d0 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
170e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
170f0 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
17100 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c   not verify buil
17110 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
17120 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
17150 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20   halted"]..     
17160 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17170 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
17180 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
17190 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
171a0 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
171b0 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
171c0 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
171d0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
171e0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
171f0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69  :no(copySqliteFi
17200 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
17210 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17220 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17230 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66  o(copySqliteConf
17240 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
17250 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17260 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
17270 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
17280 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
17290 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
172a0 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
172b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
172c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
172d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
172e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
172f0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
17300 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
17310 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17320 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17330 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
17340 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65   Copy the Manage
17350 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
17360 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e  stants (MDA) con
17370 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
17380 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
17390 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45    file for the E
173a0 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68  agle shell to th
173b0 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
173c0 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
173d0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
173e0 20 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63   while using eac
173f0 68 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f  h of the names o
17400 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65  f the various le
17410 67 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20  gacy test..     
17420 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
17430 20 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54   executables.  T
17440 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f  his will help to
17450 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
17460 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  all the..       
17470 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
17480 65 67 61 63 79 20 74 65 73 74 73 20 72 75 6e 20  egacy tests run 
17490 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 68 65  with exactly the
174a0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e   same set of Man
174b0 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
174c0 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62 75      #       Debu
174d0 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
174e0 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20   configured...  
174f0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
17510 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
17520 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
17530 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
17540 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
17550 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
17560 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
17570 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20   "" $fileName.. 
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
17590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
175a0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
175b0 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
175c0 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
175d0 69 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  ies, if any, to 
175e0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
175f0 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  at..            
17600 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
17610 6e 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  ns the Eagle she
17620 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70  ll.  This is typ
17630 69 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d  ically used to m
17640 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ake..           
17650 20 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20     #       sure 
17660 61 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72  assemblies refer
17670 65 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65  enced by the one
17680 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61  s being tested a
17690 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
176a0 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61    #       availa
176b0 62 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74  ble during the t
176c0 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
176d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
176e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
176f0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
17700 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
17710 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
17720 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78         tryCopyEx
17730 74 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65  ternalFile $file
17740 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
17750 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
17760 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17770 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
17780 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
17790 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
177a0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
177b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
177c0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
177d0 28 63 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69  (copySqliteImpli
177e0 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
177f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17800 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
17810 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
17820 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
17830 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
17840 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
17850 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
17860 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17870 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
17880 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
17890 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
178a0 28 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d  (copySqliteNonIm
178b0 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74  plicitFiles)]} t
178c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
178d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
178e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
178f0 70 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  pySqlitePlatform
17900 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
17930 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
17940 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17950 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
17960 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
17970 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
179a0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  bly $fileName $p
179b0 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
179c0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
179e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
179f0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17a00 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71  ists ::no(copySq
17a10 6c 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65  liteArchitecture
17a20 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
17a50 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
17a60 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
17a80 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
17a90 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
17aa0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17ab0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
17ac0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
17ad0 65 20 24 61 72 63 68 69 74 65 63 74 75 72 65 0d  e $architecture.
17ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17af0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
17b00 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
17b10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
17b20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17b30 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17b40 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
17b50 70 79 53 71 6c 69 74 65 4d 61 6e 61 67 65 64 46  pySqliteManagedF
17b60 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
17b80 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
17b90 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
17ba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17bb0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
17bc0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  bly $fileName.. 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
17be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
17bf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
17c00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17c10 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
17c20 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61 64  p trying to load
17c30 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69 6e   any files if in
17c40 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
17c50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17c60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17c70 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
17c80 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
17c90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17ca0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
17cb0 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
17cc0 65 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d  eImplicitFiles)]
17cd0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17ce0 20 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41          tryLoadA
17cf0 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44  ssembly System.D
17d00 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a  ata.SQLite.dll..
17d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17d30 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
17d40 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4c 69  :no(loadSqliteLi
17d50 6e 71 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  nqFiles)]} then 
17d60 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17d70 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
17d80 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
17d90 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 20 20  ite.Linq.dll..  
17da0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
17db0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
17dc0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17dd0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 45 66 36 46  o(loadSqliteEf6F
17de0 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
17e00 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79  yLoadAssembly Sy
17e10 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17e20 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  .EF6.dll..      
17e30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17e40 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17e50 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
17e60 61 64 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  adSqliteNonImpli
17e70 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
17e80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17e90 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
17ea0 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
17eb0 69 74 65 50 6c 61 74 66 6f 72 6d 46 69 6c 65 73  itePlatformFiles
17ec0 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  )] && \..       
17ed0 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
17ee0 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
17ef0 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
17f00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17f10 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
17f20 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
17f30 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  Lite.dll $platfo
17f40 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
17f50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
17f60 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
17f70 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
17f80 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74 75  SqliteArchitectu
17f90 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a  reFiles)] && \..
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
17fc0 20 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20   $architecture] 
17fd0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
17ff0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
18000 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
18010 64 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72  dll $architectur
18020 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
18030 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
18040 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
18050 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18060 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
18070 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18080 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18090 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
180a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
180b0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
180c0 20 5c 22 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22   \"sqlite3.dll\"
180d0 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  ... " \..       
180e0 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72         [file ver
180f0 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46  sion [getBinaryF
18100 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e  ileName sqlite3.
18110 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  dll]] \n]..     
18120 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18130 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
18140 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
18150 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
18160 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
18170 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
18180 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 51   version of \"SQ
18190 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
181a0 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  \"... " \..     
181b0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 76           [file v
181c0 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72  ersion [getBinar
181d0 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
181e0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 20 5c  .Interop.dll]] \
181f0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
18200 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
18210 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
18220 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
18250 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
18260 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
18270 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e  ta.SQLite.dll\".
18280 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
18290 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
182a0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
182b0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
182c0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 20  ta.SQLite.dll]] 
182d0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
182e0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
182f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
18300 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
18310 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18320 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18330 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
18340 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  on of \"System.D
18350 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e  ata.SQLite.Linq.
18360 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20  dll\"... " \..  
18370 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
18380 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69  e version [getBi
18390 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73  naryFileName Sys
183a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
183b0 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a  Linq.dll]] \n]..
183c0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
183d0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
183e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
183f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18400 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18410 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18420 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18430 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
18440 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 5c 22 2e  QLite.EF6.dll\".
18450 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
18460 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
18470 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
18480 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
18490 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
184a0 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
184b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
184c0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
184d0 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d   $platform] > 0}
184e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
184f0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
18500 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18510 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18520 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
18540 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
18550 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
18560 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18570 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c      "/sqlite3.dl
18580 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76  l\"... " [file v
18590 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20  ersion \..      
185a0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 69            [getBi
185b0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c  naryFileName sql
185c0 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66 6f  ite3.dll $platfo
185d0 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rm]] \n]..      
185e0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
185f0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
18600 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18610 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
18620 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
18640 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  -- file version 
18650 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d  of \"" $platform
18660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18670 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e 74      "/SQLite.Int
18680 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  erop.dll\"... " 
18690 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
186a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
186b0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
186c0 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
186d0 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d  op.dll $platform
186e0 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
186f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
18700 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18710 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18720 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18730 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
18740 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
18750 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
18760 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20 5c   \"" $platform \
18770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18780 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e    "/System.Data.
18790 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20  SQLite.dll\"... 
187a0 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
187b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
187c0 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
187d0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
187e0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
187f0 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
18800 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18810 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
18820 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
18830 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72 65  th $architecture
18840 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
18850 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b           catch {
18860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
18870 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18880 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18890 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
188a0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
188b0 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72  rsion of \"" $ar
188c0 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20  chitecture \..  
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2f                "/
188e0 73 71 6c 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e  sqlite3.dll\"...
188f0 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
18900 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
18910 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
18920 6c 65 4e 61 6d 65 20 73 71 6c 69 74 65 33 2e 64  leName sqlite3.d
18930 6c 6c 20 24 61 72 63 68 69 74 65 63 74 75 72 65  ll $architecture
18940 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
18950 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
18960 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20   catch {..      
18970 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18980 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
18990 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
189a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
189b0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66   file version of
189c0 20 5c 22 22 20 24 61 72 63 68 69 74 65 63 74 75   \"" $architectu
189d0 72 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  re \..          
189e0 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49        "/SQLite.I
189f0 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
18a00 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20  " [file version 
18a10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18a20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c     [getBinaryFil
18a30 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74  eName SQLite.Int
18a40 65 72 6f 70 2e 64 6c 6c 20 24 61 72 63 68 69 74  erop.dll $archit
18a50 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20  ecture]] \n]..  
18a60 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
18a70 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
18a80 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18a90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
18aa0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ac0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
18ad0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68  ion of \"" $arch
18ae0 69 74 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20  itecture \..    
18af0 20 20 20 20 20 20 20 20 20 20 20 20 22 2f 53 79              "/Sy
18b00 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18b10 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c  .dll\"... " [fil
18b20 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20  e version \..   
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
18b40 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
18b50 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
18b60 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  te.dll $architec
18b70 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
18b80 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18b90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
18ba0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18bb0 20 47 72 61 62 20 74 68 65 20 6c 69 73 74 20 6f   Grab the list o
18bc0 66 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62  f managed assemb
18bd0 6c 69 65 73 20 66 6f 72 20 74 68 65 20 63 75 72  lies for the cur
18be0 72 65 6e 74 20 70 72 6f 63 65 73 73 0d 0a 20 20  rent process..  
18bf0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
18c00 64 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  d report on the 
18c10 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
18c20 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e  te related ones.
18c30 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
18c40 20 20 20 20 20 73 65 74 20 61 73 73 65 6d 62 6c       set assembl
18c50 69 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f  ies [object invo
18c60 6b 65 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72  ke AppDomain.Cur
18c70 72 65 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73  rentDomain GetAs
18c80 73 65 6d 62 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20  semblies]....   
18c90 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65       object fore
18ca0 61 63 68 20 61 73 73 65 6d 62 6c 79 20 24 61 73  ach assembly $as
18cb0 73 65 6d 62 6c 69 65 73 20 7b 0d 0a 20 20 20 20  semblies {..    
18cc0 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
18cd0 67 20 6d 61 74 63 68 20 5c 7b 53 79 73 74 65 6d  g match \{System
18ce0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2a 20 24 61  .Data.SQLite* $a
18cf0 73 73 65 6d 62 6c 79 5d 7d 20 74 68 65 6e 20 7b  ssembly]} then {
18d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
18d10 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18d20 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
18d30 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
18d40 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
18d50 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a 20  oaded assembly: 
18d60 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d  " $assembly \n].
18d70 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
18d80 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18d90 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
18da0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
18db0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
18dd0 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  -- define consta
18de0 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65 6d  nts for \"System
18df0 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e 2e  .Data.SQLite\"..
18e00 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  . "....         
18e10 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
18e20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
18e30 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
18e40 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
18e60 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
18e70 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43  .SQLite3 DefineC
18e80 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20  onstants..      
18e90 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e 73      } defineCons
18ea0 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tants] == 0} the
18eb0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
18ec0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
18ed0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
18ee0 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
18ef0 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
18f00 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e 65           $define
18f10 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65  Constants] <none
18f20 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
18f30 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
18f40 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
18f50 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
18f60 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
18f70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
18f80 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68  ...        catch
18f90 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
18fa0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
18fb0 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  nel \..         
18fc0 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72 63       "---- sourc
18fd0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53  e version of \"S
18fe0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
18ff0 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a  e.dll\"... "....
19000 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
19010 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
19020 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
19030 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
19040 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
19050 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
19060 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
19070 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69  Connection Provi
19080 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20  derVersion..    
19090 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d        } version]
190a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
190b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
190c0 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
190d0 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68  ersion] == 0} th
190e0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
190f0 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
19100 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  null..          
19110 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
19120 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19130 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
19140 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d  gs $version \n].
19150 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
19160 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
19170 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
19180 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
19190 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
191a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
191b0 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
191c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
191d0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
191f0 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b  --- source check
19200 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e  out of \"System.
19210 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c  Data.SQLite.dll\
19220 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  "... "....      
19230 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
19250 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
19260 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
19270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19280 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
19290 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
192a0 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f 75  tion ProviderSou
192b0 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20  rceId..         
192c0 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d 20   } sourceId] == 
192d0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
192e0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
192f0 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
19300 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
19310 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19320 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75   set sourceId nu
19330 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
19340 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  }..            t
19350 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
19360 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19370 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d 0a   $sourceId \n]..
19380 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
19390 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
193a0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
193b0 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
193c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
193d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
193e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
193f0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
19400 61 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73  available builds
19410 20 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22   (and "releases"
19420 29 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d  ) of SQLite and.
19430 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
19440 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
19450 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ite...        #.
19460 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
19470 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a  rSQLiteBuilds $:
19480 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
19490 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
194a0 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a  QLiteReleases $:
194b0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d  :test_channel...
194c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
194d0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c      # NOTE: Now,
194e0 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77   we need to know
194f0 20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63   if the SQLite c
19500 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61  ore library is a
19510 76 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20  vailable..      
19520 20 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20    #       (i.e. 
19530 62 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61  because the mana
19540 67 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e  ged-only System.
19550 44 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65  Data.SQLite asse
19560 6d 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20  mbly can..      
19570 20 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77    #       load w
19580 69 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76  ithout it; howev
19590 65 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f  er, it cannot do
195a0 20 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c   anything useful
195b0 20 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20   without..      
195c0 20 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20    #       it).  
195d0 49 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20  If we are using 
195e0 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
195f0 73 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61  ssembly and we a
19600 6c 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20  lready..        
19610 23 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74  #       found it
19620 20 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73   (above), this s
19630 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63  hould always suc
19640 63 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  ceed...        #
19650 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
19660 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20  orSQLiteLibrary 
19670 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
19680 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
19690 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
196a0 65 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74  eck if the SQLit
196b0 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
196c0 6c 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ly is available.
196d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
196e0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
196f0 69 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65  iteInterop $::te
19700 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
19710 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19720 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
19730 68 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  he SQLite databa
19740 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
19750 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20   directories... 
19760 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
19770 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
19780 44 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74  Directories $::t
19790 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
197a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
197b0 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
197c0 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  t to determine i
197d0 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c  f various compil
197e0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e  e-time options n
197f0 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20  eeded for..     
19800 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20     #       test 
19810 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65  constraints were
19820 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
19830 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c   managed assembl
19840 79 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20  y.  There..     
19850 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
19860 6f 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ome compile-time
19870 20 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75   options that mu
19880 73 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65  st also have bee
19890 6e 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20  n enabled..     
198a0 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
198b0 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
198c0 62 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  bly in order to 
198d0 62 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46  be effective.  F
198e0 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
198f0 20 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e    #       option
19900 73 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73  s, it will be as
19910 73 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61  sumed that it wa
19920 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  s enabled for th
19930 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20  e interop..     
19940 20 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d     #       assem
19950 62 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e  bly if it was en
19960 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61  abled for the ma
19970 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d  naged assembly..
19980 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19990 20 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69      foreach defi
199a0 6e 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74  neConstant [list
199b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
199c0 43 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e  CHECK_STATE COUN
199d0 54 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49  T_HANDLE DEBUG I
199e0 4e 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54  NTEROP_CODEC INT
199f0 45 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20  EROP_DEBUG \..  
19a00 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
19a10 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43  P_EXTENSION_FUNC
19a20 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 4c 45  TIONS INTEROP_LE
19a30 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45 52  GACY_CLOSE INTER
19a40 4f 50 5f 4c 4f 47 20 5c 0d 0a 20 20 20 20 20 20  OP_LOG \..      
19a50 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 45        INTEROP_TE
19a60 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  ST_EXTENSION INT
19a70 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
19a80 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35  LE NET_20 NET_35
19a90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
19aa0 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
19ab0 54 5f 34 35 31 20 4e 45 54 5f 43 4f 4d 50 41 43  T_451 NET_COMPAC
19ac0 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43 4f  T_20 PLATFORM_CO
19ad0 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20 5c  MPACTFRAMEWORK \
19ae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 52  ..            PR
19af0 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c 49 42  ELOAD_NATIVE_LIB
19b00 52 41 52 59 20 52 45 54 41 52 47 45 54 41 42 4c  RARY RETARGETABL
19b10 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41 52  E SQLITE_STANDAR
19b20 44 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  D \..           
19b30 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53   THROW_ON_DISPOS
19b40 45 44 20 54 52 41 43 45 20 54 52 41 43 45 5f 43  ED TRACE TRACE_C
19b50 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45 5f  ONNECTION TRACE_
19b60 48 41 4e 44 4c 45 20 5c 0d 0a 20 20 20 20 20 20  HANDLE \..      
19b70 20 20 20 20 20 20 54 52 41 43 45 5f 50 52 45 4c        TRACE_PREL
19b80 4f 41 44 20 54 52 41 43 45 5f 53 48 41 52 45 44  OAD TRACE_SHARED
19b90 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e 54   TRACE_STATEMENT
19ba0 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20 5c   TRACE_WARNING \
19bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52  ..            TR
19bc0 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45 53  ACK_MEMORY_BYTES
19bd0 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d   USE_ENTITY_FRAM
19be0 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54 45  EWORK_6 USE_INTE
19bf0 52 4f 50 5f 44 4c 4c 20 5c 0d 0a 20 20 20 20 20  ROP_DLL \..     
19c00 20 20 20 20 20 20 20 55 53 45 5f 50 52 45 50 41         USE_PREPA
19c10 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d 20 7b  RE_V2 WINDOWS] {
19c20 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
19c30 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
19c40 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 6f   Check if the co
19c50 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
19c60 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e 20 74  n is listed in t
19c70 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20 20 20  he list of..    
19c80 20 20 20 20 20 20 23 20 20 20 20 20 20 20 22 64        #       "d
19c90 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 22  efine constants"
19ca0 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20 62   kept track of b
19cb0 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20 61 73  y the managed as
19cc0 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
19cd0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
19ce0 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 65  checkForSQLiteDe
19cf0 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24 3a 3a  fineConstant $::
19d00 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 64 65  test_channel $de
19d10 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a 20 20  fineConstant..  
19d20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
19d30 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19d40 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20  NOTE: Check the 
19d50 63 75 72 72 65 6e 74 20 62 75 69 6c 64 20 79 65  current build ye
19d60 61 72 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  ar.  Basically, 
19d70 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 0d 0a  this indicates..
19d80 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
19d90 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66  which version of
19da0 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72 20   MSBuild and/or 
19db0 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77 61  Visual Studio wa
19dc0 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20 20  s used to..     
19dd0 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69     #       compi
19de0 6c 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  le the assembly 
19df0 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74  binaries under t
19e00 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  est...        #.
19e10 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
19e20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
19e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
19e40 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  --- checking for
19e50 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
19e60 69 74 65 20 62 75 69 6c 64 20 79 65 61 72 2e 2e  ite build year..
19e70 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  . "....        s
19e80 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
19e90 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
19ea0 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61  addConstraint [a
19eb0 70 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59  ppendArgs buildY
19ec0 65 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20  ear. $year]..   
19ed0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
19ee0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
19ef0 6e 64 41 72 67 73 20 5c 22 20 24 79 65 61 72 20  ndArgs \" $year 
19f00 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  \"\n]....       
19f10 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
19f20 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75  TE: Check the cu
19f30 72 72 65 6e 74 20 62 75 69 6c 64 20 2e 4e 45 54  rrent build .NET
19f40 20 46 72 61 6d 65 77 6f 72 6b 2e 20 20 42 61 73   Framework.  Bas
19f50 69 63 61 6c 6c 79 2c 20 74 68 69 73 0d 0a 20 20  ically, this..  
19f60 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
19f70 64 69 63 61 74 65 73 20 77 68 69 63 68 20 76 65  dicates which ve
19f80 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 2e 4e 45  rsion of the .NE
19f90 54 20 46 72 61 6d 65 77 6f 72 6b 20 69 73 20 62  T Framework is b
19fa0 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 23 20  eing..        # 
19fb0 20 20 20 20 20 20 75 73 65 64 20 62 79 20 74 68        used by th
19fc0 65 20 61 73 73 65 6d 62 6c 79 20 62 69 6e 61 72  e assembly binar
19fd0 69 65 73 20 75 6e 64 65 72 20 74 65 73 74 2e 0d  ies under test..
19fe0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
19ff0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a000 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1a010 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1a020 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
1a030 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
1a040 75 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77  uild .NET Framew
1a050 6f 72 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ork... "....    
1a060 20 20 20 20 73 65 74 20 6e 65 74 46 78 20 5b 67      set netFx [g
1a070 65 74 42 75 69 6c 64 4e 65 74 46 78 5d 0d 0a 20  etBuildNetFx].. 
1a080 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1a090 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1a0a0 20 62 75 69 6c 64 46 72 61 6d 65 77 6f 72 6b 2e   buildFramework.
1a0b0 20 24 6e 65 74 46 78 5d 0d 0a 20 20 20 20 20 20   $netFx]..      
1a0c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1a0d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1a0e0 72 67 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22  rgs \" $netFx \"
1a0f0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  \n]....        #
1a100 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1a110 3a 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72  : Check the curr
1a120 65 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67  ent build config
1a130 75 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73  uration.  This s
1a140 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a  hould normally..
1a150 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1a160 62 65 20 65 69 74 68 65 72 20 22 44 65 62 75 67  be either "Debug
1a170 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 2e 0d  " or "Release"..
1a180 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1a190 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1a1a0 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20  t_channel \..   
1a1b0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
1a1c0 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
1a1d0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
1a1e0 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
1a1f0 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
1a200 20 20 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61     set configura
1a210 74 69 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f  tion [getBuildCo
1a220 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20  nfiguration]..  
1a230 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
1a240 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
1a250 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
1a260 6f 6e 2e 20 24 63 6f 6e 66 69 67 75 72 61 74 69  on. $configurati
1a270 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75  on]..        tpu
1a280 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a290 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a2a0 22 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  " $configuration
1a2b0 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20   \"\n]....      
1a2c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a2d0 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65 74 75  OTE: Try to setu
1a2e0 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 63  p an interrupt c
1a2f0 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68  allback using th
1a300 65 20 73 63 72 69 70 74 20 64 65 62 75 67 67 65  e script debugge
1a310 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  r..        #    
1a320 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63 61 6e     that will can
1a330 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75 65 72  cel all SQL quer
1a340 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
1a350 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1a360 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a370 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e    connections kn
1a380 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e 74 65  own to this inte
1a390 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
1a3a0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1a3b0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1a3c0 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65 72 72  :no(sqliteInterr
1a3d0 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d 20 74  uptCallback)]} t
1a3e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1a3f0 20 73 65 74 75 70 44 62 49 6e 74 65 72 72 75 70   setupDbInterrup
1a400 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74 65 73  tCallback $::tes
1a410 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74 65 73  t_channel $::tes
1a420 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 7d  t_log..        }
1a430 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1a440 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
1a450 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e 61 74  heck for the nat
1a460 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ive runtime opti
1a470 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c 64 20  on, which would 
1a480 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20 20 20  mean we are..   
1a490 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 69       #       usi
1a4a0 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64  ng the mixed-mod
1a4b0 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  e assembly...   
1a4c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a4d0 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
1a4e0 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
1a4f0 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a 0d 0a  annel native....
1a500 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a510 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1a520 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
1a530 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e 74 20  te should count 
1a540 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1a550 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20 20 20  nnections..     
1a560 20 20 20 23 20 20 20 20 20 20 20 22 6f 70 65 6e     #       "open
1a570 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65 64 22  ed" and "closed"
1a580 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c 20 77   from the pool w
1a590 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  hen determining 
1a5a0 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20 20 20  if a test..     
1a5b0 20 20 20 23 20 20 20 20 20 20 20 70 61 73 73 65     #       passe
1a5c0 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 74 68  d.  Disabling th
1a5d0 69 73 20 62 65 68 61 76 69 6f 72 20 69 73 20 73  is behavior is s
1a5e0 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73 73 61  ometimes necessa
1a5f0 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  ry (e.g...      
1a600 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
1a610 20 74 68 65 20 72 65 6c 65 61 73 65 20 74 65 73   the release tes
1a620 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20 62 65  ting process) be
1a630 63 61 75 73 65 20 74 68 65 72 65 20 61 72 65 20  cause there are 
1a640 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20 20 20  several..       
1a650 20 23 20 20 20 20 20 20 20 74 65 73 74 73 20 74   #       tests t
1a660 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  hat rely on the 
1a670 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70 6f 6f  "opened from poo
1a680 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67 20 67  l" count being g
1a690 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20  reater..        
1a6a0 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a 65 72  #       than zer
1a6b0 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74 73 20  o.  These tests 
1a6c0 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74 6f 20  may fail due to 
1a6d0 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e  the non-determin
1a6e0 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20 20 23  istic..        #
1a6f0 20 20 20 20 20 20 20 62 65 68 61 76 69 6f 72 20         behavior 
1a700 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c 20 65  of the CLR GC, e
1a710 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69  ven when there i
1a720 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68 65 20  s no bug in the 
1a730 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 23 20  code..        # 
1a740 20 20 20 20 20 20 62 65 69 6e 67 20 74 65 73 74        being test
1a750 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ed...        #..
1a760 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
1a770 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
1a780 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 6f  :test_channel no
1a790 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a 20 20  PoolCounts....  
1a7a0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a7b0 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20   # NOTE: Report 
1a7c0 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
1a7d0 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e 6e  ge prior to runn
1a7e0 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d 0a  ing any tests...
1a7f0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1a800 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65 52     reportSQLiteR
1a810 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73 74  esources $::test
1a820 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
1a830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a840 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
1a850 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20 6d  list of native m
1a860 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20 63  odules for the c
1a870 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61  urrent process a
1a880 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
1a890 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74 68      report on th
1a8a0 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
1a8b0 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e 65  Lite related one
1a8c0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1a8d0 20 20 20 20 20 20 20 73 65 74 20 6d 6f 64 75 6c         set modul
1a8e0 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  es [object invok
1a8f0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1a900 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74   System.Diagnost
1a910 69 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43  ics.Process.GetC
1a920 75 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f  urrentProcess Mo
1a930 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20  dules]....      
1a940 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1a950 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20 24   -alias module $
1a960 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20 20  modules {..     
1a970 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a980 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6d 6f    # NOTE: The mo
1a990 64 75 6c 65 20 66 69 6c 65 20 6e 61 6d 65 20 68  dule file name h
1a9a0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 72 6d  ere must be norm
1a9b0 61 6c 69 7a 65 64 2e 0d 0a 20 20 20 20 20 20 20  alized...       
1a9c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1a9d0 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
1a9e0 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d  le normalize [$m
1a9f0 6f 64 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d  odule FileName]]
1aa00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
1aa10 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1aa20 2d 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65  -nocase */sqlite
1aa30 33 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d  3.dll $fileName]
1aa40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1aa50 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1aa60 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
1aa70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
1aa80 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
1aa90 20 66 6f 75 6e 64 20 6c 6f 61 64 65 64 20 53 51   found loaded SQ
1aaa0 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62 72  Lite native libr
1aab0 61 72 79 20 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d  ary module: " \.
1aac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1aad0 20 24 66 69 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a   $fileName \n]..
1aae0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1aaf0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63  if {[string matc
1ab00 68 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h \..           
1ab10 20 20 20 2d 6e 6f 63 61 73 65 20 2a 2f 53 51 4c     -nocase */SQL
1ab20 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20  ite.Interop.dll 
1ab30 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
1ab40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ab50 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1ab60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1ab70 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1ab80 20 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64       "---- found
1ab90 20 6c 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69   loaded SQLite i
1aba0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
1abb0 6d 6f 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20  module: " \..   
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
1abd0 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
1abe0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1abf0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1ac00 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1ac10 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ac20 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
1ac30 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
1ac40 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
1ac50 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f  ns for SQLite co
1ac60 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d  re library... ".
1ac70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1ac80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ac90 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1aca0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1acb0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1acc0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1acd0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1ace0 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69  ite3 SQLiteCompi
1acf0 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
1ad00 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
1ad10 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
1ad20 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1ad30 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1ad40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1ad50 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
1ad60 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
1ad70 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
1ad80 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
1ad90 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1ada0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1adb0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1adc0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1add0 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1ade0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1adf0 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
1ae00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
1ae10 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1ae20 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
1ae30 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c      "---- compil
1ae40 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66  e-time options f
1ae50 6f 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f  or SQLite intero
1ae60 70 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d  p assembly... ".
1ae70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1ae80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1ae90 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1aea0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1aeb0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1aec0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1aed0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1aee0 69 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70  ite3 InteropComp
1aef0 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
1af00 20 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f        } compileO
1af10 70 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68  ptions] == 0} th
1af20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1af30 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1af40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1af50 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
1af60 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
1af70 20 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69            $compi
1af80 6c 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65  leOptions] <none
1af90 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  >] \n]..        
1afa0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1afb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1afc0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e  :test_channel un
1afd0 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20  known\n..       
1afe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1aff0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1b000 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
1b010 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65  ow the active te
1b020 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d  st constraints..
1b030 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b040 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1b050 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1b060 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73  dArgs "---- cons
1b070 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20  traints: " \..  
1b080 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61            [forma
1b090 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65  tList [lsort [ge
1b0a0 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c  tConstraints]] <
1b0b0 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  none>] \n]....  
1b0c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b0d0 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68   # NOTE: Save th
1b0e0 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  e test constrain
1b0f0 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ts for use by th
1b100 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e  reads created in
1b110 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23   this..        #
1b120 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69         applicati
1b130 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73  on domain.  This
1b140 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
1b150 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61  cause all the Ea
1b160 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  gle..        #  
1b170 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65       "test conte
1b180 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  xt" information 
1b190 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a  is per-thread...
1b1a0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1b1b0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
1b1c0 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73  ists ::test_cons
1b1d0 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b  traints]} then {
1b1e0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1b1f0 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e  ::test_constrain
1b200 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74  ts $::eagle_test
1b210 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a  s(constraints)..
1b220 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1b230 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b240 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
1b250 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69   "after-constrai
1b260 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d  nts" custom per-
1b270 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
1b280 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  host..        # 
1b290 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69        test setti
1b2a0 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ngs now...      
1b2b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c    #..        upl
1b2c0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61  evel 1 [list loa
1b2d0 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
1b2e0 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  ngs $::test_chan
1b2f0 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20  nel .after].... 
1b300 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1b310 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
1b320 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
1b330 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e 6f  tually began (no
1b340 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
1b350 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1b360 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1b370 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1b380 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
1b390 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1b3a0 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61 74  e tests began at
1b3b0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
1b3c0 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
1b3d0 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
1b3e0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
1b3f0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1b400 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
1b410 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
1b420 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1b430 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
1b440 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
1b450 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
1b460 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
1b470 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
1b480 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
1b490 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
1b4a0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
1b4b0 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
1b4c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b4d0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
1b4e0 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
1b4f0 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
1b500 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
1b510 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1b520 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1b530 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1b540 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1b550 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
1b560 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
1b570 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
1b580 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
1b590 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
1b5a0 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
1b5b0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b5c0 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65      # BUGFIX: Be
1b5d0 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74 68  fore checking th
1b5e0 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63 65  e final resource
1b5f0 73 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  s in use by SQLi
1b600 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20 20  te, make..      
1b610 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72 65    #         sure
1b620 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52 41   both of the PRA
1b630 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72 65  GMA related dire
1b640 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65 20  ctory names are 
1b650 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20  freed...        
1b660 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  #..        check
1b670 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f  ForSQLiteDirecto
1b680 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ries $::test_cha
1b690 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20  nnel true....   
1b6a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b6b0 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65 70  # NOTE: Also rep
1b6c0 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63 65  ort the resource
1b6d0 20 75 73 61 67 65 20 61 66 74 65 72 20 72 75 6e   usage after run
1b6e0 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d  ning the tests..
1b6f0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1b700 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65      reportSQLite
1b710 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73  Resources $::tes
1b720 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
1b730 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b740 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20 74  # NOTE: Report t
1b750 68 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64  he critical hand
1b760 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72 20  le counts after 
1b770 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74  running the test
1b780 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1b790 20 20 20 20 20 20 20 67 65 74 53 51 4c 69 74 65         getSQLite
1b7a0 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a 3a  HandleCounts $::
1b7b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
1b7c0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
1b7d0 0a 20 20 20 20 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 23 23 23 23 23 23 23 23 23 23 23  ################
1b800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b820 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
1b830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b840 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e  ### END Eagle ON
1b850 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
1b860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b870 23 0d 0a 20 20 20 20 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 23 23 23 23 23 23 23 23 23  ################
1b8a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1b8c0 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ##..  }....  #..
1b8d0 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
1b8e0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
1b8f0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1b900 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a  ing this file...
1b910 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66    #..  if {![inf
1b920 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f  o exists common_
1b930 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
1b940 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   {..    set comm
1b950 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69  on_directory [fi
1b960 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
1b970 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a   script]]..  }..
1b980 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
1b990 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73   Provide the Sys
1b9a0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
1b9b0 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20  test package to 
1b9c0 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
1b9d0 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65  ..  #..  package
1b9e0 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e   provide System.
1b9f0 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74  Data.SQLite.Test
1ba00 20 31 2e 30 0d 0a 7d 0d 0a                        1.0..}..