System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 19d3380cac8688e0c3ceca16f4f7c3820a2c7e3c:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
0fd0: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
0fe0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
0ff0: 6e 20 61 64 64 69 6e 67 20 73 68 69 6d 6d 65 64  n adding shimmed
1000: 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
1010: 73 2e 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 70  s...    #..    p
1020: 72 6f 63 20 67 65 74 42 75 69 6c 64 43 6c 72 56  roc getBuildClrV
1030: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
1040: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1050: 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72 5d 20  sts ::test_clr] 
1060: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
1070: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5d 20 3e  h $::test_clr] >
1080: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
1090: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10a0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
10b0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76 65  pecified test ve
10c0: 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c  rsion for the CL
10d0: 52 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  R.  If this vari
10e0: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
10f0: 20 20 20 20 20 20 69 73 20 6e 6f 74 20 73 65 74        is not set
1100: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  , the default va
1110: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
1120: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
1130: 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  not..        #  
1140: 20 20 20 20 20 45 61 67 6c 65 20 68 61 73 20 62       Eagle has b
1150: 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67 61  een compiled aga
1160: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
1170: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
1180: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1190: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
11a0: 74 5f 63 6c 72 0d 0a 20 20 20 20 20 20 7d 20 65  t_clr..      } e
11b0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
11c0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
11d0: 3a 20 43 68 65 63 6b 20 69 66 20 45 61 67 6c 65  : Check if Eagle
11e0: 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c   has been compil
11f0: 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43  ed against the C
1200: 4c 52 20 76 34 2e 30 2e 20 20 49 66 20 73 6f 2c  LR v4.0.  If so,
1210: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1220: 20 20 6a 75 73 74 20 75 73 65 20 74 68 61 74 20    just use that 
1230: 43 4c 52 20 76 65 72 73 69 6f 6e 2e 20 20 4f 74  CLR version.  Ot
1240: 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65  herwise, use the
1250: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65   version for the
1260: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1270: 20 20 43 4c 52 20 76 32 2e 30 2e 20 20 49 66 20    CLR v2.0.  If 
1280: 61 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 20 5b 69  another major [i
1290: 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65 72  ncompatible] ver
12a0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52 0d  sion of the CLR.
12b0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12c0: 20 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68   is released, th
12d0: 69 73 20 63 68 65 63 6b 20 77 69 6c 6c 20 68 61  is check will ha
12e0: 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ve to be changed
12f0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 0d 0a  .  The default..
1300: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1310: 76 65 72 73 69 6f 6e 20 76 61 6c 75 65 20 66 6f  version value fo
1320: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 43  r a particular C
1330: 4c 52 20 76 65 72 73 69 6f 6e 20 6d 61 79 20 62  LR version may b
1340: 65 20 6f 76 65 72 72 69 64 64 65 6e 0d 0a 20 20  e overridden..  
1350: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
1360: 20 73 65 74 74 69 6e 67 20 74 68 65 20 67 6c 6f   setting the glo
1370: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 22 74 65  bal variable "te
1380: 73 74 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65  st_clr_v$X", whe
1390: 72 65 20 22 24 58 22 20 6d 61 79 0d 0a 20 20 20  re "$X" may..   
13a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 63 75       #       [cu
13b0: 72 72 65 6e 74 6c 79 5d 20 62 65 20 65 69 74 68  rrently] be eith
13c0: 65 72 20 22 32 22 20 6f 72 20 22 34 22 2e 0d 0a  er "2" or "4"...
13d0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e0: 20 20 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73     if {[haveCons
13f0: 74 72 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74  traint imageRunt
1400: 69 6d 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ime40]} then {..
1410: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
1420: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1430: 74 5f 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a  t_clr_v4] && \..
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1450: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
1460: 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 3e 20 30  test_clr_v4] > 0
1470: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1480: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1490: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
14a0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
14b0: 65 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  est version for 
14c0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
14d0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
14e0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14f0: 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 0d   $::test_clr_v4.
1500: 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
1510: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
1520: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1530: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1540: 64 65 66 61 75 6c 74 20 74 65 73 74 20 76 65 72  default test ver
1550: 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43 4c 52  sion for the CLR
1560: 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20   v4.0...        
1570: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1580: 20 20 20 72 65 74 75 72 6e 20 34 2e 30 2e 33 30     return 4.0.30
1590: 33 31 39 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f  319; # TODO: Goo
15a0: 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64 65 66  d "fallback" def
15b0: 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20 20 20  ault?..         
15c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
15d0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
15e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
15f0: 20 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 32 5d 20   ::test_clr_v2] 
1600: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1610: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1620: 74 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76  th $::test_clr_v
1630: 32 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  2] > 0} then {..
1640: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1650: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1660: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
1670: 66 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f  fied test versio
1680: 6e 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32  n for the CLR v2
1690: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .0...           
16a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
16b0: 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63  return $::test_c
16c0: 6c 72 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20  lr_v2..         
16d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
16e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73        # NOTE: Us
1700: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65  e the default te
1710: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
1720: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
1730: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1740: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1750: 32 2e 30 2e 35 30 37 32 37 3b 20 23 20 54 4f 44  2.0.50727; # TOD
1760: 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63  O: Good "fallbac
1770: 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20  k" default?..   
1780: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1790: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20    }..      }..  
17a0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
17b0: 20 67 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b   getBuildYears {
17c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
17d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20      # NOTE: See 
17e0: 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74  if the list of t
17f0: 65 73 74 20 79 65 61 72 73 20 68 61 73 20 62 65  est years has be
1800: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  en overridden by
1810: 20 74 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20   the user..     
1820: 20 23 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f   #       (e.g. o
1830: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1840: 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne)...      #.. 
1850: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1860: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61  xists ::test_yea
1870: 72 73 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20  rs] && [llength 
1880: 24 3a 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e  $::test_years] >
1890: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
18a0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
18b0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
18c0: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
18d0: 20 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20   test years...  
18e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18f0: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
1900: 79 65 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65  years..      } e
1910: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1920: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1930: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
1940: 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 79  t list of test y
1950: 65 61 72 73 20 28 69 2e 65 2e 20 61 6c 6c 29 2e  ears (i.e. all).
1960: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1970: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1980: 74 20 32 30 30 35 20 32 30 30 38 20 32 30 31 30  t 2005 2008 2010
1990: 20 32 30 31 32 20 32 30 31 33 5d 0d 0a 20 20 20   2012 2013]..   
19a0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
19b0: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
19c0: 64 4e 65 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20  dNetFx {} {..   
19d0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
19e0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74  TE: See if the t
19f0: 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  est .NET Framewo
1a00: 72 6b 20 73 65 74 74 69 6e 67 20 68 61 73 20 62  rk setting has b
1a10: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
1a20: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
1a30: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
1a40: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
1a50: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
1a60: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1a70: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65  exists ::test_ne
1a80: 74 5f 66 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20  t_fx] && \..    
1a90: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1aa0: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74  ngth $::test_net
1ab0: 5f 66 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _fx] > 0} then {
1ac0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1ad0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1ae0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
1af0: 65 73 74 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  est .NET Framewo
1b00: 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rk...        #..
1b10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
1b20: 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20  ::test_net_fx.. 
1b30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
1b40: 20 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20         set year 
1b50: 5b 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a  [getBuildYear]..
1b60: 0d 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  ..        switch
1b70: 20 2d 65 78 61 63 74 20 2d 2d 20 24 79 65 61 72   -exact -- $year
1b80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 32 30   {..          20
1b90: 30 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  05 {..          
1ba0: 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32 30    return netFx20
1bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1bc0: 20 20 20 20 20 20 20 20 20 32 30 30 38 20 7b 0d           2008 {.
1bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1be0: 75 72 6e 20 6e 65 74 46 78 33 35 0d 0a 20 20 20  urn netFx35..   
1bf0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c00: 20 20 20 20 32 30 31 30 20 7b 0d 0a 20 20 20 20      2010 {..    
1c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
1c20: 65 74 46 78 34 30 0d 0a 20 20 20 20 20 20 20 20  etFx40..        
1c30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 32    }..          2
1c40: 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  012 {..         
1c50: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34     return netFx4
1c60: 35 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  5..          }..
1c70: 20 20 20 20 20 20 20 20 20 20 32 30 31 33 20 7b            2013 {
1c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1c90: 74 75 72 6e 20 6e 65 74 46 78 34 35 31 0d 0a 20  turn netFx451.. 
1ca0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1cb0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0d        default {.
1cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1cd0: 75 72 6e 20 6e 65 74 46 78 33 35 3b 20 23 20 54  urn netFx35; # T
1ce0: 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62  ODO: Good "fallb
1cf0: 61 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20  ack" default?.. 
1d00: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1d10: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
1d20: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 23 0d      }.....    #.
1d30: 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69  .    # NOTE: Thi
1d40: 73 20 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75  s procedure shou
1d50: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ld return non-ze
1d60: 72 6f 20 69 66 20 74 68 65 20 63 6f 6e 66 69 67  ro if the config
1d70: 75 72 65 64 20 74 65 73 74 0d 0a 20 20 20 20 23  ured test..    #
1d80: 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 20         platform 
1d90: 69 73 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 74  is most likely t
1da0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74  he default for t
1db0: 68 69 73 20 6d 61 63 68 69 6e 65 2e 0d 0a 20 20  his machine...  
1dc0: 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20 69 73    #..    proc is
1dd0: 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c 61 74  DefaultBuildPlat
1de0: 66 6f 72 6d 20 7b 20 7b 76 65 72 62 6f 73 65 20  form { {verbose 
1df0: 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
1e00: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1e10: 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57 6f  E: Running on Wo
1e20: 57 36 34 20 69 73 20 6e 65 76 65 72 20 74 68 65  W64 is never the
1e30: 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72   default platfor
1e40: 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  m...      #..   
1e50: 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e     if {[isRunnin
1e60: 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b 0d  gWoW64]} then {.
1e70: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76 65  .        if {$ve
1e80: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
1e90: 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1ea0: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c  ::test_channel \
1eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ec0: 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 6e  "---- detected n
1ed0: 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c 61 74 66  on-default platf
1ee0: 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d 0a  orm (WoW64)\n"..
1ef0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f00: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
1f10: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1f20: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1f30: 45 3a 20 54 68 69 73 20 68 61 73 20 61 20 67 6f  E: This has a go
1f40: 6f 64 20 63 68 61 6e 63 65 20 6f 66 20 62 65 69  od chance of bei
1f50: 6e 67 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ng the default p
1f60: 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20  latform...      
1f70: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 76 65  #..      if {$ve
1f80: 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  rbose} then {.. 
1f90: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1fa0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 22 2d 2d  test_channel "--
1fb0: 2d 2d 20 64 65 74 65 63 74 65 64 20 64 65 66 61  -- detected defa
1fc0: 75 6c 74 20 70 6c 61 74 66 6f 72 6d 5c 6e 22 0d  ult platform\n".
1fd0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
1fe0: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
1ff0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2000: 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
2010: 20 7b 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20   { native } {.. 
2020: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2030: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 70 6c 61  xists ::test_pla
2040: 74 66 6f 72 6d 5d 20 26 26 20 5c 0d 0a 20 20 20  tform] && \..   
2050: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2060: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 70 6c  ength $::test_pl
2070: 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
2080: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2090: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
20a0: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
20b0: 64 20 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e  d test platform.
20c0: 20 20 49 66 20 74 68 69 73 20 76 61 72 69 61 62    If this variab
20d0: 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c 0d 0a  le is not set,..
20e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20f0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
2100: 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20  e will be based 
2110: 6f 6e 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61  on the machine a
2120: 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
2130: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2140: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
2150: 6e 61 74 69 76 65 20 3f 20 24 3a 3a 74 65 73 74  native ? $::test
2160: 5f 70 6c 61 74 66 6f 72 6d 20 3a 20 22 22 7d 5d  _platform : ""}]
2170: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66  ..      } elseif
2180: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
2190: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 26  :test_machine] &
21a0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
21b0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
21c0: 3a 74 65 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3e  :test_machine] >
21d0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
21e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
21f0: 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 61 74 69 76   NOTE: For nativ
2200: 65 20 62 75 69 6c 64 73 2c 20 72 65 74 75 72 6e  e builds, return
2210: 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61   the platform na
2220: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
2230: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2240: 20 20 20 20 20 74 68 65 20 74 65 73 74 20 6d 61       the test ma
2250: 63 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75  chine architectu
2260: 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 72  re; otherwise, r
2270: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 0d 0a  eturn an empty..
2280: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2290: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
22a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
22b0: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
22c0: 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20        $native ? 
22d0: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
22e0: 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69  rm $::test_machi
22f0: 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20 20 20 20  ne] : ""..      
2300: 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c    }]..      } el
2310: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
2320: 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
2330: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
2340: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
2350: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2360: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
2370: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
2380: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
2390: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
23a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
23b0: 65 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  e machine archit
23c0: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
23d0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
23e0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
23f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
2400: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
2410: 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65           $native
2420: 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61   ? [machineToPla
2430: 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61  tform $::tcl_pla
2440: 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20  tform(machine)] 
2450: 3a 20 22 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d  : ""..        }]
2460: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
2470: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20       # NOTE: No 
2490: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
24a0: 74 75 72 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ture is availabl
24b0: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
24c0: 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20  ty string...    
24d0: 20 20 20 20 23 20 20 20 20 20 20 20 49 74 20 69      #       It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
2500: 74 72 69 6e 67 20 68 65 72 65 20 62 65 63 61 75  tring here becau
2510: 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  se the..        
2520: 23 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 6f  #       result o
2530: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
2540: 20 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74   may be used wit
2550: 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a  h [file join]...
2560: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2570: 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
2580: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
2590: 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69  .    proc getBui
25a0: 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ldConfiguration 
25b0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
25c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65       # NOTE: See
25d0: 20 69 66 20 74 68 65 20 22 63 6f 6e 66 69 67 75   if the "configu
25e0: 72 61 74 69 6f 6e 22 20 73 65 74 74 69 6e 67 20  ration" setting 
25f0: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
2600: 64 65 6e 20 62 79 20 74 68 65 0d 0a 20 20 20 20  den by the..    
2610: 20 20 23 20 20 20 20 20 20 20 75 73 65 72 20 28    #       user (
2620: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
2630: 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54 68 69 73  and line).  This
2640: 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65   helps control e
2650: 78 61 63 74 6c 79 0d 0a 20 20 20 20 20 20 23 20  xactly..      # 
2660: 20 20 20 20 20 20 77 68 69 63 68 20 73 65 74 20        which set 
2670: 6f 66 20 62 69 6e 61 72 69 65 73 20 77 65 20 61  of binaries we a
2680: 72 65 20 74 65 73 74 69 6e 67 20 28 69 2e 65 2e  re testing (i.e.
2690: 20 74 68 6f 73 65 20 62 75 69 6c 74 20 69 6e 20   those built in 
26a0: 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
26b0: 20 20 20 22 44 65 62 75 67 22 20 6f 72 20 22 52     "Debug" or "R
26c0: 65 6c 65 61 73 65 22 20 62 75 69 6c 64 20 63 6f  elease" build co
26d0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 29 2e 20 20  nfigurations).  
26e0: 54 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  To override this
26f0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
2700: 76 61 6c 75 65 20 76 69 61 20 74 68 65 20 63 6f  value via the co
2710: 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65  mmand line, ente
2720: 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69  r a command simi
2730: 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20  lar to one of.. 
2740: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2750: 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20   following (all 
2760: 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20  on one line):.. 
2770: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2780: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2790: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
27a0: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
27b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 44 65 62 75  nfiguration Debu
27c0: 67 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  g"..      #     
27d0: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
27e0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
27f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2800: 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c        EagleShell
2810: 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c  .exe -anyInitial
2820: 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 63 6f  ize "set test_co
2830: 6e 66 69 67 75 72 61 74 69 6f 6e 20 52 65 6c 65  nfiguration Rele
2840: 61 73 65 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ase"..      #   
2850: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
2860: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
2870: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
2880: 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65  #       EagleShe
2890: 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70  ll.exe -file .\p
28a0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
28b0: 20 2d 70 72 65 54 65 73 74 0d 0a 20 20 20 20 20   -preTest..     
28c0: 20 23 20 20 20 20 20 20 20 20 20 22 75 6e 73 65   #         "unse
28d0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65  t -nocomplain te
28e0: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
28f0: 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  "..      #..    
2900: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2910: 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67  ts ::test_config
2920: 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  uration] && \.. 
2930: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2940: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
2950: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e  configuration] >
2960: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2970: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2980: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2990: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
29a0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 20 54 68  nfiguration.  Th
29b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
29c0: 75 73 65 64 0d 0a 20 20 20 20 20 20 20 20 23 20  used..        # 
29d0: 20 20 20 20 20 20 66 6f 72 20 74 68 69 73 20 76        for this v
29e0: 61 72 69 61 62 6c 65 20 69 73 20 74 79 70 69 63  ariable is typic
29f0: 61 6c 6c 79 20 22 52 65 6c 65 61 73 65 22 2c 20  ally "Release", 
2a00: 61 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65  as set by the te
2a10: 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
2a20: 20 20 20 20 73 75 69 74 65 20 69 74 73 65 6c 66      suite itself
2a30: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
2a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
2a50: 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69  test_configurati
2a60: 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  on..      } else
2a70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
2a80: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
2a90: 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c  ormally, we will
2aa0: 20 6e 65 76 65 72 20 68 69 74 20 74 68 69 73 20   never hit this 
2ab0: 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68 65  case because the
2ac0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20   value of the.. 
2ad0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2ae0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
2af0: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c  n variable is al
2b00: 77 61 79 73 20 73 65 74 20 62 79 20 74 68 65 20  ways set by the 
2b10: 74 65 73 74 20 73 75 69 74 65 0d 0a 20 20 20 20  test suite..    
2b20: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
2b30: 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20 69 74 20  lf; however, it 
2b40: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
2b50: 6e 20 75 73 69 6e 67 20 74 68 65 20 75 6e 73 65  n using the unse
2b60: 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20  t command..     
2b70: 20 20 20 23 20 20 20 20 20 20 20 66 72 6f 6d 20     #       from 
2b80: 74 68 65 20 2d 70 72 65 54 65 73 74 20 6f 70 74  the -preTest opt
2b90: 69 6f 6e 20 74 6f 20 74 68 65 20 74 65 73 74 20  ion to the test 
2ba0: 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
2bb0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
2bc0: 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66  n $::eagle_platf
2bd0: 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  orm(configuratio
2be0: 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n)..      }..   
2bf0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
2c00: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
2c10: 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20  ations {} {..   
2c20: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
2c30: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c  TE: See if the l
2c40: 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f 6e 66  ist of test conf
2c50: 69 67 75 72 61 74 69 6f 6e 73 20 68 61 73 20 62  igurations has b
2c60: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62  een overridden b
2c70: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
2c80: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
2c90: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
2ca0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
2cb0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
2cc0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f  exists ::test_co
2cd0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 26 26  nfigurations] &&
2ce0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
2cf0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
2d00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e  onfigurations] >
2d10: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2d20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2d30: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
2d40: 70 65 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66  pecified list of
2d50: 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74   test configurat
2d60: 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ions...        #
2d70: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
2d80: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
2d90: 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d  rations..      }
2da0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
2db0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
2dc0: 54 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61  TE: Use the defa
2dd0: 75 6c 74 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ult list of test
2de0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e   configurations.
2df0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2e00: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
2e10: 74 20 44 65 62 75 67 20 52 65 6c 65 61 73 65 5d  t Debug Release]
2e20: 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
2e30: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
2e40: 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
2e50: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
2e60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2e70: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2e80: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 77  base directory w
2e90: 68 65 72 65 20 61 6c 6c 20 74 68 65 20 62 75 69  here all the bui
2ea0: 6c 64 73 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20  lds should be.. 
2eb0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 6f 63       #       loc
2ec0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
2ed0: 20 62 65 20 74 68 65 20 64 69 72 65 63 74 6f 72   be the director
2ee0: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
2ef0: 74 68 65 20 61 63 74 75 61 6c 0d 0a 20 20 20 20  the actual..    
2f00: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
2f10: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 79  output directory
2f20: 20 28 65 2e 67 2e 20 70 61 72 65 6e 74 20 6f 66   (e.g. parent of
2f30: 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20 20 20 20   "bin")...      
2f40: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
2f50: 66 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c  fo exists ::buil
2f60: 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79  d_base_directory
2f70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2f80: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2f90: 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64   $::build_base_d
2fa0: 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74  irectory] > 0} t
2fb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2fc0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2fd0: 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  : The location o
2fe0: 66 20 74 68 65 20 62 75 69 6c 64 20 62 61 73 65  f the build base
2ff0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
3000: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
3010: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3020: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
3030: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
3040: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
3050: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
3060: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 0d  _base_directory.
3070: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
3080: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
3090: 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
30a0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
30b0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
30c0: 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63   $::common_direc
30d0: 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20  tory] > 0} then 
30e0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
30f0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 65        # NOTE: Ne
3100: 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  xt, fallback to 
3110: 74 68 65 20 67 72 61 6e 64 70 61 72 65 6e 74 20  the grandparent 
3120: 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
3130: 20 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 23 20   one..        # 
3140: 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 69 6e 67        containing
3150: 20 74 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e   this file (i.e.
3160: 20 22 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29   "common.eagle")
3170: 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d  , if available..
3180: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3190: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
31a0: 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
31b0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
31c0: 5f 64 69 72 65 63 74 6f 72 79 5d 5d 0d 0a 20 20  _directory]]..  
31d0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
31e0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74  nfo exists ::pat
31f0: 68 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  h] && \..       
3200: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
3210: 68 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20  h $::path] > 0} 
3220: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3230: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3240: 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c  E: Finally, fall
3250: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
3260: 6e 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  nt directory of 
3270: 74 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20  the EagleTest.. 
3280: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
3290: 61 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54  ath.  The EagleT
32a0: 65 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72  est package guar
32b0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73  antees that this
32c0: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
32d0: 20 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20     #       will 
32e0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69  be set to the di
32f0: 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
3300: 6e 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c  ng the first fil
3310: 65 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20  e to..        # 
3320: 20 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68        execute th
3330: 65 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67  e [runTestProlog
3340: 75 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61  ue] script libra
3350: 72 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20  ry procedure... 
3360: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3370: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
3380: 69 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d  irname $::path].
3390: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
33a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
33b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70      # NOTE: No p
33c0: 61 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ath is available
33d0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  , return an empt
33e0: 79 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20  y string.  This 
33f0: 70 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23  point..        #
3400: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f         should no
3410: 74 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20  t be reached... 
3420: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3430: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
3440: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
3450: 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c 69      proc getSQLi
3460: 74 65 54 65 73 74 44 61 74 61 50 61 74 68 20 7b  teTestDataPath {
3470: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
3480: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75      # NOTE: Figu
3490: 72 65 20 6f 75 74 20 74 68 65 20 64 69 72 65 63  re out the direc
34a0: 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20 74  tory where all t
34b0: 68 65 20 74 65 73 74 20 64 61 74 61 20 66 69 6c  he test data fil
34c0: 65 73 20 73 68 6f 75 6c 64 0d 0a 20 20 20 20 20  es should..     
34d0: 20 23 20 20 20 20 20 20 20 62 65 20 6c 6f 63 61   #       be loca
34e0: 74 65 64 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  ted.  This shoul
34f0: 64 20 62 65 20 74 68 65 20 22 64 61 74 61 22 20  d be the "data" 
3500: 64 69 72 65 63 74 6f 72 79 20 62 65 6e 65 61 74  directory beneat
3510: 68 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  h the..      #  
3520: 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 63       directory c
3530: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 63  ontaining the ac
3540: 74 75 61 6c 20 74 65 73 74 20 73 63 72 69 70 74  tual test script
3550: 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
3560: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3570: 6a 6f 69 6e 20 24 3a 3a 70 61 74 68 20 64 61 74  join $::path dat
3580: 61 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  a]..    }.....  
3590: 20 20 70 72 6f 63 20 69 73 52 75 6e 6e 69 6e 67    proc isRunning
35a0: 57 6f 57 36 34 20 7b 7d 20 7b 0d 0a 20 20 20 20  WoW64 {} {..    
35b0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
35c0: 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 6a 75 73 74  E: For now, just
35d0: 20 75 73 65 20 74 68 65 20 65 78 69 73 74 69 6e   use the existin
35e0: 67 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e  g test constrain
35f0: 74 20 66 6f 72 20 64 65 74 65 63 74 69 6e 67 0d  t for detecting.
3600: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
3610: 20 57 6f 57 36 34 20 70 72 6f 63 65 73 73 2e 0d   WoW64 process..
3620: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
3630: 72 65 74 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73  return [haveCons
3640: 74 72 61 69 6e 74 20 77 6f 77 36 34 5d 0d 0a 20  traint wow64].. 
3650: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
3660: 63 20 69 73 4d 69 78 65 64 4d 6f 64 65 41 73 73  c isMixedModeAss
3670: 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65  embly { fileName
3680: 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20 7d 20   {varName ""} } 
3690: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
36a0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
36b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
36c0: 65 73 74 20 73 75 69 74 65 20 69 6e 66 72 61 73  est suite infras
36d0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
36e0: 77 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 23 20  wed to..      # 
36f0: 20 20 20 20 20 20 75 73 65 20 74 68 65 20 5b 65        use the [e
3700: 78 65 63 5d 20 63 6f 6d 6d 61 6e 64 2e 0d 0a 20  xec] command... 
3710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
3720: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
3730: 3a 3a 6e 6f 28 65 78 65 63 29 5d 20 26 26 20 21  ::no(exec)] && !
3740: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
3750: 6f 28 63 6f 72 46 6c 61 67 73 29 5d 7d 20 74 68  o(corFlags)]} th
3760: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3770: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3780: 20 49 66 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e   If the location
3790: 20 6f 66 20 43 6f 72 46 6c 61 67 73 20 69 73 20   of CorFlags is 
37a0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 65  present in the e
37b0: 6e 76 69 72 6f 6e 6d 65 6e 74 2c 0d 0a 20 20 20  nvironment,..   
37c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
37d0: 20 69 74 3b 20 6f 74 68 65 72 77 69 73 65 20 61   it; otherwise a
37e0: 73 73 75 6d 65 20 69 74 20 69 73 20 69 6e 20 74  ssume it is in t
37f0: 68 65 20 50 41 54 48 2e 0d 0a 20 20 20 20 20 20  he PATH...      
3800: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
3810: 20 63 6f 72 46 6c 61 67 73 20 5b 65 78 70 72 20   corFlags [expr 
3820: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 69 6e  {..          [in
3830: 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28  fo exists ::env(
3840: 43 6f 72 46 6c 61 67 73 29 5d 20 3f 20 24 3a 3a  CorFlags)] ? $::
3850: 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 20 3a 20  env(CorFlags) : 
3860: 22 43 6f 72 46 6c 61 67 73 22 0d 0a 20 20 20 20  "CorFlags"..    
3870: 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20      }]....      
3880: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
3890: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
38a0: 65 78 65 63 75 74 65 20 43 6f 72 46 6c 61 67 73  execute CorFlags
38b0: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
38c0: 64 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  d file...       
38d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
38e0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
38f0: 20 20 20 20 65 78 65 63 20 2d 2d 20 24 63 6f 72      exec -- $cor
3900: 46 6c 61 67 73 20 5b 66 69 6c 65 20 6e 61 74 69  Flags [file nati
3910: 76 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  vename $fileName
3920: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 78 65  ]..        } exe
3930: 63 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  c] == 0} then {.
3940: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
3950: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3960: 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79 20  If requested by 
3970: 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 74 74 65  our caller, atte
3980: 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  mpt to determine
3990: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
39a0: 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d  #       platform
39b0: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
39c0: 65 64 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 2e  ed file as well.
39d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
39e0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
39f0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
3a00: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
3a10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
3a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
3a30: 4e 4f 54 45 3a 20 53 74 6f 72 65 20 74 68 65 20  NOTE: Store the 
3a40: 70 6c 61 74 66 6f 72 6d 20 69 6e 20 74 68 65 20  platform in the 
3a50: 6e 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 69  named variable i
3a60: 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  n the..         
3a70: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65     #       conte
3a80: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
3a90: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
3aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 70  ..            up
3ab0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 70  var 1 $varName p
3ac0: 6c 61 74 66 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20  latform....     
3ad0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
3ae0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
3af0: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
3b00: 20 74 68 65 20 50 45 20 6c 69 6e 65 20 66 72 6f   the PE line fro
3b10: 6d 20 74 68 65 20 63 61 70 74 75 72 65 64 0d 0a  m the captured..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
3b30: 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49 66 20      output.  If 
3b40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 22 50  this value is "P
3b50: 45 33 32 22 20 6f 72 20 22 50 45 33 32 2b 22 2c  E32" or "PE32+",
3b60: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
3b70: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
3b80: 6c 79 20 66 69 6c 65 20 69 73 20 33 32 2d 62 69  ly file is 32-bi
3b90: 74 20 6f 72 20 36 34 2d 62 69 74 2c 20 72 65 73  t or 64-bit, res
3ba0: 70 65 63 74 69 76 65 6c 79 3b 0d 0a 20 20 20 20  pectively;..    
3bb0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
3bc0: 6f 74 68 65 72 77 69 73 65 2c 20 69 74 73 20 74  otherwise, its t
3bd0: 79 70 65 20 69 73 20 75 6e 6b 6e 6f 77 6e 2e 0d  ype is unknown..
3be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
3c00: 70 61 74 74 65 72 6e 20 7b 5e 50 45 20 20 20 20  pattern {^PE    
3c10: 20 20 20 20 3a 20 28 50 45 33 32 7c 50 45 33 32      : (PE32|PE32
3c20: 5c 2b 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20 20 20  \+)\s+$}....    
3c30: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67          if {[reg
3c40: 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70 61  exp -line -- $pa
3c50: 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d 6d  ttern $exec dumm
3c60: 79 20 70 65 33 32 5d 7d 20 74 68 65 6e 20 7b 0d  y pe32]} then {.
3c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
3c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3c90: 23 20 48 41 43 4b 3a 20 54 68 69 73 20 5b 73 77  # HACK: This [sw
3ca0: 69 74 63 68 5d 20 61 73 73 75 6d 65 73 20 74 68  itch] assumes th
3cb0: 61 74 20 33 32 2d 62 69 74 20 65 78 65 63 75 74  at 32-bit execut
3cc0: 61 62 6c 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ables are..     
3cd0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
3ce0: 20 61 6c 77 61 79 73 20 78 38 36 20 61 6e 64 20   always x86 and 
3cf0: 74 68 61 74 20 36 34 2d 62 69 74 20 65 78 65 63  that 64-bit exec
3d00: 75 74 61 62 6c 65 73 20 61 72 65 20 61 6c 77 61  utables are alwa
3d10: 79 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ys..            
3d20: 20 20 23 20 20 20 20 20 20 20 78 36 34 2e 0d 0a    #       x64...
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
3d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
3d50: 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20  witch -exact -- 
3d60: 24 70 65 33 32 20 7b 0d 0a 20 20 20 20 20 20 20  $pe32 {..       
3d70: 20 20 20 20 20 20 20 20 20 50 45 33 32 20 7b 0d           PE32 {.
3d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d90: 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20     set platform 
3da0: 57 69 6e 33 32 0d 0a 20 20 20 20 20 20 20 20 20  Win32..         
3db0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3dc0: 20 20 20 20 20 20 20 20 20 20 50 45 33 32 2b 20            PE32+ 
3dd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3de0: 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
3df0: 6d 20 78 36 34 0d 0a 20 20 20 20 20 20 20 20 20  m x64..         
3e00: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3e10: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
3e20: 74 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t {..           
3e30: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
3e40: 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20  orm ""..        
3e50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
3e60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
3e70: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
3e80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3e90: 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d  set platform "".
3ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
3eb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3ec0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3ed0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
3ee0: 74 65 6d 70 74 20 74 6f 20 65 78 74 72 61 63 74  tempt to extract
3ef0: 20 74 68 65 20 49 4c 4f 4e 4c 59 20 6c 69 6e 65   the ILONLY line
3f00: 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74 75 72   from the captur
3f10: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
3f20: 20 20 20 20 20 20 6f 75 74 70 75 74 2e 20 20 49        output.  I
3f30: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
3f40: 7a 65 72 6f 2c 20 74 68 65 20 73 70 65 63 69 66  zero, the specif
3f50: 69 65 64 20 66 69 6c 65 20 6d 75 73 74 0d 0a 20  ied file must.. 
3f60: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
3f70: 20 62 65 20 61 20 6d 69 78 65 64 2d 6d 6f 64 65   be a mixed-mode
3f80: 20 61 73 73 65 6d 62 6c 79 3b 20 6f 74 68 65 72   assembly; other
3f90: 77 69 73 65 2c 20 69 74 20 63 6f 6e 74 61 69 6e  wise, it contain
3fa0: 73 20 6f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  s only..        
3fb0: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67 65    #       manage
3fc0: 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0d 0a 20  d components... 
3fd0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
3fe0: 20 20 20 20 20 20 73 65 74 20 70 61 74 74 65 72        set patter
3ff0: 6e 20 7b 5e 49 4c 4f 4e 4c 59 20 20 20 20 3a 20  n {^ILONLY    : 
4000: 28 30 7c 31 29 5c 73 2b 24 7d 0d 0a 0d 0a 20 20  (0|1)\s+$}....  
4010: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 72 65          if {![re
4020: 67 65 78 70 20 2d 6c 69 6e 65 20 2d 2d 20 24 70  gexp -line -- $p
4030: 61 74 74 65 72 6e 20 24 65 78 65 63 20 64 75 6d  attern $exec dum
4040: 6d 79 20 69 6c 4f 6e 6c 79 5d 7d 20 74 68 65 6e  my ilOnly]} then
4050: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4060: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
4070: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4080: 20 20 20 20 20 20 20 69 66 20 7b 21 24 69 6c 4f         if {!$ilO
4090: 6e 6c 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  nly} then {..   
40a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
40b0: 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20  true..          
40c0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
40d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
40e0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
40f0: 49 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  If the test suit
4100: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 5b 65 78  e cannot use [ex
4110: 65 63 5d 20 6f 72 20 65 78 65 63 75 74 69 6f 6e  ec] or execution
4120: 20 6f 66 20 43 6f 72 46 6c 61 67 73 0d 0a 20 20   of CorFlags..  
4130: 20 20 20 20 23 20 20 20 20 20 20 20 66 61 69 6c      #       fail
4140: 65 64 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  ed, return false
4150: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
4160: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
4170: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
4180: 6f 63 20 69 73 42 75 69 6c 64 41 76 61 69 6c 61  oc isBuildAvaila
4190: 62 6c 65 20 7b 20 6e 61 74 69 76 65 20 64 69 72  ble { native dir
41a0: 65 63 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20  ectory {varName 
41b0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
41c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
41d0: 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20  Build the fully 
41e0: 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e  qualified file n
41f0: 61 6d 65 20 66 6f 72 20 74 68 65 20 70 72 69 6d  ame for the prim
4200: 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ary assembly..  
4210: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74      #       cont
4220: 61 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65  aining the Syste
4230: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61  m.Data.SQLite ma
4240: 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  naged components
4250: 2e 20 20 49 74 0d 0a 20 20 20 20 20 20 23 20 20  .  It..      #  
4260: 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6e       should be n
4270: 6f 74 65 64 20 74 68 61 74 20 74 68 69 73 20 61  oted that this a
4280: 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6d 61 79  ssembly file may
4290: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 74 68   also contain th
42a0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
42b0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
42c0: 74 73 2c 20 69 66 20 61 20 6e 61 74 69 76 65 20  ts, if a native 
42d0: 62 75 69 6c 64 20 69 73 20 69 6e 20 75 73 65 2e  build is in use.
42e0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
42f0: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
4300: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
4310: 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63  file join $direc
4320: 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
4330: 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
4340: 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20  Lite.dll]]....  
4350: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
4360: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
4370: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
4380: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a    return false..
4390: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
43a0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
43b0: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 61 75 74  : Attempt to aut
43c0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 74 65 63  omatically detec
43d0: 74 20 69 66 20 74 68 65 20 70 72 69 6d 61 72 79  t if the primary
43e0: 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   assembly..     
43f0: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
4400: 73 20 61 6e 79 20 6e 61 74 69 76 65 20 63 6f 6d  s any native com
4410: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 6e 65 63 65  ponents, if nece
4420: 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ssary...      #.
4430: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
4440: 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76  ng length $nativ
4450: 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  e] == 0} then {.
4460: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
4470: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
4480: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
4490: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 76  {..          upv
44a0: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76  ar 1 $varName $v
44b0: 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  arName..        
44c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
44d0: 20 6e 61 74 69 76 65 20 5b 69 73 4d 69 78 65 64   native [isMixed
44e0: 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 24 66 69  ModeAssembly $fi
44f0: 6c 65 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 5d  leName $varName]
4500: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4510: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4520: 54 45 3a 20 49 66 20 74 68 65 20 70 72 69 6d 61  TE: If the prima
4530: 72 79 20 61 73 73 65 6d 62 6c 79 20 61 6c 73 6f  ry assembly also
4540: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
4550: 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c  tive components,
4560: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4570: 77 65 20 68 61 76 65 20 65 76 65 72 79 74 68 69  we have everythi
4580: 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20  ng we need...   
4590: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
45a0: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
45b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
45c0: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
45d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
45e0: 23 20 4e 4f 54 45 3a 20 57 68 61 74 20 69 73 20  # NOTE: What is 
45f0: 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72  the platform for
4600: 20 74 68 69 73 20 6d 61 63 68 69 6e 65 3f 0d 0a   this machine?..
4610: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
4620: 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 6d 61 63  et platform [mac
4630: 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
4640: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
4650: 61 63 68 69 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20  achine)]....    
4660: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
4670: 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c  E: Build the ful
4680: 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c  ly qualified fil
4690: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69  e name for the i
46a0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 0d  nterop assembly.
46b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
46c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 53 79  ontaining the Sy
46d0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
46e0: 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e   native componen
46f0: 74 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20  ts.  If this..  
4700: 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65      #       file
4710: 20 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75   exists, we shou
4720: 6c 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69  ld have everythi
4730: 6e 67 20 77 65 20 6e 65 65 64 2e 0d 0a 20 20 20  ng we need...   
4740: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
4750: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
4760: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
4770: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
4780: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 70 6c  \..          $pl
4790: 61 74 66 6f 72 6d 20 53 51 4c 69 74 65 2e 49 6e  atform SQLite.In
47a0: 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  terop.dll]].... 
47b0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
47c0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
47d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
47e0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
47f0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4800: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4810: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4820: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4830: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4840: 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e   SQLite.Interop.
4850: 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  dll]]....      i
4860: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
4870: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
4880: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
4890: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
48a0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
48b0: 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
48c0: 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
48d0: 66 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 66  fied file name f
48e0: 6f 72 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  or the SQLite co
48f0: 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  re..      #     
4900: 20 20 6c 69 62 72 61 72 79 2e 20 20 49 66 20 74    library.  If t
4910: 68 69 73 20 66 69 6c 65 20 65 78 69 73 74 73 2c  his file exists,
4920: 20 77 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20   we should have 
4930: 65 76 65 72 79 74 68 69 6e 67 20 77 65 0d 0a 20  everything we.. 
4940: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 65       #       nee
4950: 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
4960: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
4970: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
4980: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
4990: 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20  ectory \..      
49a0: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 73 71      $platform sq
49b0: 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  lite3.dll]].... 
49c0: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
49d0: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
49e0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
49f0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
4a00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4a10: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
4a20: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
4a30: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
4a40: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
4a50: 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 0d 0a   sqlite3.dll]]..
4a60: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c  ..      if {[fil
4a70: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
4a80: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
4a90: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
4aa0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4ab0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
4ac0: 54 45 3a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20  TE: One or more 
4ad0: 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74  native component
4ae0: 73 20 6e 65 65 64 65 64 20 62 79 20 53 79 73 74  s needed by Syst
4af0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a  em.Data.SQLite..
4b00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
4b10: 65 20 6d 69 73 73 69 6e 67 2e 0d 0a 20 20 20 20  e missing...    
4b20: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
4b30: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
4b40: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 52 65  ...    proc isRe
4b50: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 7b  leaseAvailable {
4b60: 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72 4e   directory {varN
4b70: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
4b80: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
4b90: 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65 5d 20  ength $varName] 
4ba0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4bb0: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
4bc0: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a  rName $varName..
4bd0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4be0: 20 72 65 74 75 72 6e 20 5b 69 73 42 75 69 6c 64   return [isBuild
4bf0: 41 76 61 69 6c 61 62 6c 65 20 22 22 20 24 64 69  Available "" $di
4c00: 72 65 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65  rectory $varName
4c10: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
4c20: 20 70 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44   proc joinBuildD
4c30: 69 72 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76  irectory { nativ
4c40: 65 20 70 61 74 68 20 79 65 61 72 20 70 6c 61 74  e path year plat
4c50: 66 6f 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69  form configurati
4c60: 6f 6e 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  on } {..      #.
4c70: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
4c80: 69 67 75 72 65 20 6f 75 74 20 61 6e 64 20 74 68  igure out and th
4c90: 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 66 75  en return the fu
4ca0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 70 61  lly qualified pa
4cb0: 74 68 20 74 6f 20 74 68 65 20 62 75 69 6c 64 0d  th to the build.
4cc0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
4cd0: 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f  irectory based o
4ce0: 6e 20 61 6c 6c 20 74 68 65 20 61 72 67 75 6d 65  n all the argume
4cf0: 6e 74 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  nts provided by 
4d00: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
4d10: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
4d20: 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d  $native} then {.
4d30: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4d40: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
4d50: 20 62 69 6e 20 24 79 65 61 72 20 24 70 6c 61 74   bin $year $plat
4d60: 66 6f 72 6d 20 24 63 6f 6e 66 69 67 75 72 61 74  form $configurat
4d70: 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ion]..      } el
4d80: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
4d90: 74 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  turn [file join 
4da0: 24 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20  $path bin $year 
4db0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62  $configuration b
4dc0: 69 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  in]..      }..  
4dd0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4de0: 20 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f   getBuildDirecto
4df0: 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ry {} {..      #
4e00: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
4e10: 53 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69  See if the "nati
4e20: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
4e30: 6f 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  on has been set.
4e40: 20 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65    If so, use the
4e50: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4e60: 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68  directory for th
4e70: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
4e80: 65 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68  embly (a.k.a. th
4e90: 65 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70  e native interop
4ea0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4eb0: 61 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65  assembly).  To e
4ec0: 6e 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f  nable this optio
4ed0: 6e 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  n via the comman
4ee0: 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d  d line, enter a.
4ef0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
4f00: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
4f10: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  o one of the fol
4f20: 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f  lowing (all on o
4f30: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
4f40: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
4f50: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
4f60: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75   -initialize -ru
4f70: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69  ntimeOption nati
4f80: 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ve..      #     
4f90: 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68      -file .\path
4fa0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20  \to\all.eagle.. 
4fb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
4fc0: 20 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20        To enable 
4fd0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
4fe0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
4ff0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62   prior to the "b
5000: 65 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23  eta 16"..      #
5010: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f         release o
5020: 66 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c  f Eagle, the fol
5030: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d  lowing command m
5040: 75 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  ust be used inst
5050: 65 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ead..      #    
5060: 20 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20     (also all on 
5070: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
5080: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
5090: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
50a0: 65 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70  e -initialize -p
50b0: 6f 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20  ostInitialize.. 
50c0: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22       #         "
50d0: 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e  object invoke In
50e0: 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74  terpreter.GetAct
50f0: 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70  ive AddRuntimeOp
5100: 74 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20  tion native"..  
5110: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
5120: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
5130: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
5140: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
5150: 6f 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64  o exists ::build
5160: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
5170: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
5180: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75  ing length $::bu
5190: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  ild_directory] >
51a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
51b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
51c0: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
51d0: 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64  ion of the build
51e0: 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
51f0: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
5200: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5210: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
5220: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
5230: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5240: 20 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64   return $::build
5250: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
5260: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
5270: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
5280: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e   NOTE: If the "n
5290: 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f  ative" runtime o
52a0: 70 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68  ption is set, th
52b0: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  e mixed-mode ass
52c0: 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  embly..        #
52d0: 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
52e0: 74 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74  tested.  In that
52f0: 20 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20   case, the path 
5300: 74 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  to the build dir
5310: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
5320: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e  #       will con
5330: 74 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  tain the platfor
5340: 6d 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74  m name and all t
5350: 68 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65  he binaries unde
5360: 72 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20  r test..        
5370: 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62  #       should b
5380: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61  e present in tha
5390: 74 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66  t directory.  If
53a0: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
53b0: 6e 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23  ntime..        #
53c0: 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73         option is
53d0: 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75   not set, the bu
53e0: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69  ild directory wi
53f0: 6c 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  ll be considered
5400: 20 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20   to be..        
5410: 23 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72  #       "platfor
5420: 6d 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68  m-neutral", with
5430: 20 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63   the notable exc
5440: 65 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61  eption of any na
5450: 74 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20  tive..        # 
5460: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28        assembly (
5470: 65 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74  e.g. "SQLite.Int
5480: 65 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65  erop.dll") copie
5490: 64 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74  d there during t
54a0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
54b0: 20 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73      build proces
54c0: 73 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68  s itself.  If th
54d0: 65 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20  e build process 
54e0: 73 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74  somehow does not
54f0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5500: 20 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76    copy the nativ
5510: 65 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74  e assembly for t
5520: 68 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f  his platform, mo
5530: 73 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d  st of the tests.
5540: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5550: 20 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69   in the suite wi
5560: 6c 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69  ll simply be ski
5570: 70 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79  pped.  Generally
5580: 20 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65   speaking, there
5590: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
55a0: 20 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74    are two ways t
55b0: 6f 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61  o build the bina
55c0: 72 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72  ries when prepar
55d0: 69 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a  ing to run the..
55e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
55f0: 74 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20  test suite:..   
5600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5610: 23 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64  #       1. Build
5620: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61   the separate ma
5630: 6e 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65  naged and native
5640: 20 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e   assemblies usin
5650: 67 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20  g some..        
5660: 23 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61  #          comma
5670: 6e 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d  nds similar to:.
5680: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5690: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
56a0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
56b0: 67 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64  guration}Managed
56c0: 4f 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d  Only ${Platform}
56d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
56e0: 20 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24       build.bat $
56f0: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e  {Configuration}N
5700: 61 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74  ativeOnly ${Plat
5710: 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23  form}..        #
5720: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5730: 20 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e       Where ${Con
5740: 66 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65  figuration} is e
5750: 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72  ither "Debug" or
5760: 20 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a   "Release" and..
5770: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5780: 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69     ${Platform} i
5790: 73 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22  s either "Win32"
57a0: 20 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20   or "x64"...    
57b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
57c0: 20 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20         2. Build 
57d0: 74 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61  the mixed-mode a
57e0: 73 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20  ssembly using a 
57f0: 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20  command similar 
5800: 74 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  to:..        #..
5810: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5820: 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43     build.bat ${C
5830: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b  onfiguration} ${
5840: 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20  Platform}..     
5850: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
5860: 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24           Where $
5870: 7b 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20  {Configuration} 
5880: 69 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67  is either "Debug
5890: 22 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61  " or "Release" a
58a0: 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  nd..        #   
58b0: 20 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72         ${Platfor
58c0: 6d 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69  m} is either "Wi
58d0: 6e 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20  n32" or "x64".  
58e0: 49 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  If this command 
58f0: 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  is..        #   
5900: 20 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72         used, var
5910: 69 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20  ious tests that 
5920: 72 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65  require suppleme
5930: 6e 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20  ntary managed.. 
5940: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
5950: 20 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e    assemblies (e.
5960: 67 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20  g. LINQ) may be 
5970: 73 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74  skipped unless t
5980: 68 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20  hose binaries.. 
5990: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
59a0: 20 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74    are subsequent
59b0: 6c 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  ly copied into t
59c0: 68 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63  he correct direc
59d0: 74 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20  tory (i.e. by.. 
59e0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
59f0: 20 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22    "test_all.bat"
5a00: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
5a10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
5a20: 6f 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20  ote that all of 
5a30: 74 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e  the build comman
5a40: 64 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65  ds above will de
5a50: 66 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a  fault to using..
5a60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5a70: 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
5a80: 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76  on of MSBuild av
5a90: 61 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20  ailable and the 
5aa0: 22 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d  "test_year" may.
5ab0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
5ac0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75   need to be adju
5ad0: 73 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  sted accordingly
5ae0: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e   to actually run
5af0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
5b00: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5b10: 20 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63    Refer to the c
5b20: 6f 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42  omments in [getB
5b30: 75 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f  uildYear] for mo
5b40: 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  re information o
5b50: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
5b60: 20 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68     how to set th
5b70: 69 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20  is variable...  
5b80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5b90: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 68 61 73   set native [has
5ba0: 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
5bb0: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
5bc0: 20 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 42 75 69   return [joinBui
5bd0: 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74  ldDirectory $nat
5be0: 69 76 65 20 5b 67 65 74 42 75 69 6c 64 42 61 73  ive [getBuildBas
5bf0: 65 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a 20  eDirectory] \.. 
5c00: 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
5c10: 75 69 6c 64 59 65 61 72 5d 20 5b 67 65 74 42 75  uildYear] [getBu
5c20: 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61 74  ildPlatform $nat
5c30: 69 76 65 5d 20 5b 67 65 74 42 75 69 6c 64 43 6f  ive] [getBuildCo
5c40: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 5d 0d 0a 20  nfiguration]].. 
5c50: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
5c60: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 52 65  ..    proc getRe
5c70: 6c 65 61 73 65 56 65 72 73 69 6f 6e 20 7b 7d 20  leaseVersion {} 
5c80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5c90: 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65    # NOTE: Figure
5ca0: 20 6f 75 74 20 74 68 65 20 72 65 6c 65 61 73 65   out the release
5cb0: 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 75 73 65   version for use
5cc0: 20 77 69 74 68 20 74 68 65 20 62 75 69 6c 64 20   with the build 
5cd0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
5ce0: 20 23 20 20 20 20 20 20 20 77 68 65 6e 20 63 68   #       when ch
5cf0: 65 63 6b 69 6e 67 20 66 6f 72 20 61 76 61 69 6c  ecking for avail
5d00: 61 62 6c 65 20 72 65 6c 65 61 73 65 73 2e 0d 0a  able releases...
5d10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5d20: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5d30: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
5d40: 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  n] && \..       
5d50: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
5d60: 68 20 24 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72  h $::release_ver
5d70: 73 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e 20  sion] > 0} then 
5d80: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5d90: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68        # NOTE: Th
5da0: 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f  e release versio
5db0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  n has been overr
5dc0: 69 64 64 65 6e 3b 20 74 68 65 72 65 66 6f 72 65  idden; therefore
5dd0: 2c 20 75 73 65 20 69 74 0d 0a 20 20 20 20 20 20  , use it..      
5de0: 20 20 23 20 20 20 20 20 20 20 76 65 72 62 61 74    #       verbat
5df0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
5e00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
5e10: 3a 3a 72 65 6c 65 61 73 65 5f 76 65 72 73 69 6f  ::release_versio
5e20: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
5e30: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
5e40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
5e50: 20 72 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e   release version
5e60: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
5e70: 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 73  eturn an empty s
5e80: 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  tring...        
5e90: 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69 6d  #       It is im
5ea0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75 72  portant to retur
5eb0: 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  n an empty strin
5ec0: 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20 74  g here because t
5ed0: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
5ee0: 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74 68      result of th
5ef0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61 79  is procedure may
5f00: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b 66   be used with [f
5f10: 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20 20  ile join]...    
5f20: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5f30: 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20  eturn ""..      
5f40: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
5f50: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 46 69   proc getBuildFi
5f60: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
5f70: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
5f80: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
5f90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
5fa0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
5fb0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
5fc0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
5fd0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5fe0: 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 64 69  #       build di
5ff0: 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72 64  rectory, discard
6000: 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f 72  ing any director
6010: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 72  y information pr
6020: 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  esent..      #  
6030: 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c 65       in the file
6040: 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64 65   name as provide
6050: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e  d by our caller.
6060: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6070: 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66 69 6c   set result [fil
6080: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
6090: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
60a0: 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44 69  join [getBuildDi
60b0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
60c0: 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  rm [file tail $f
60d0: 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20  ileName]]]....  
60e0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 48      #..      # H
60f0: 41 43 4b 3a 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ACK: When runnin
6100: 67 20 6f 6e 20 57 6f 57 36 34 2c 20 61 73 73 75  g on WoW64, assu
6110: 6d 65 20 74 68 65 20 74 65 73 74 20 65 78 65 63  me the test exec
6120: 75 74 61 62 6c 65 73 20 61 72 65 20 70 72 65 73  utables are pres
6130: 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ent..      #    
6140: 20 20 20 77 69 74 68 20 74 68 65 20 22 33 32 22     with the "32"
6150: 20 73 75 66 66 69 78 20 6f 6e 20 74 68 65 6d 2e   suffix on them.
6160: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6170: 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69 6e 67 57   if {[isRunningW
6180: 6f 57 36 34 5d 20 26 26 20 5b 66 69 6c 65 20 65  oW64] && [file e
6190: 78 74 65 6e 73 69 6f 6e 20 24 72 65 73 75 6c 74  xtension $result
61a0: 5d 20 65 71 20 22 2e 65 78 65 22 7d 20 74 68 65  ] eq ".exe"} the
61b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74  n {..        set
61c0: 20 72 65 73 75 6c 74 20 5b 61 70 70 65 6e 64 41   result [appendA
61d0: 72 67 73 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61  rgs [file rootna
61e0: 6d 65 20 24 72 65 73 75 6c 74 5d 20 33 32 2e 65  me $result] 32.e
61f0: 78 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  xe]..      }....
6200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
6210: 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
6220: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
6230: 72 6e 61 6c 44 69 72 65 63 74 6f 72 79 20 7b 7d  rnalDirectory {}
6240: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
6250: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20     # NOTE: This 
6260: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e  procedure return
6270: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
6280: 77 68 65 72 65 20 74 68 65 20 65 78 74 65 72 6e  where the extern
6290: 61 6c 20 62 69 6e 61 72 79 0d 0a 20 20 20 20 20  al binary..     
62a0: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 61   #       files a
62b0: 72 65 20 6c 6f 63 61 74 65 64 2e 0d 0a 20 20 20  re located...   
62c0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
62d0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
62e0: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
62f0: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
6300: 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 5d 5d 5d  [info binary]]]]
6310: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
6320: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 44 69  proc getBinaryDi
6330: 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20  rectory {} {..  
6340: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
6350: 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64  OTE: This proced
6360: 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ure returns the 
6370: 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65 20  directory where 
6380: 74 68 65 20 74 65 73 74 20 61 70 70 6c 69 63 61  the test applica
6390: 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  tion..      #   
63a0: 20 20 20 20 69 74 73 65 6c 66 20 28 69 2e 65 2e      itself (i.e.
63b0: 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c 6c   the Eagle shell
63c0: 29 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 54  ) is located.  T
63d0: 68 69 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  his will be used
63e0: 20 61 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20   as..      #    
63f0: 20 20 20 74 68 65 20 64 65 73 74 69 6e 61 74 69     the destinati
6400: 6f 6e 20 66 6f 72 20 74 68 65 20 63 6f 70 69 65  on for the copie
6410: 64 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  d System.Data.SQ
6420: 4c 69 74 65 20 6e 61 74 69 76 65 20 61 6e 64 0d  Lite native and.
6430: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
6440: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69 65  anaged assemblie
6450: 73 20 28 69 2e 65 2e 20 62 65 63 61 75 73 65 20  s (i.e. because 
6460: 74 68 69 73 20 69 73 20 6f 6e 65 20 6f 66 20 74  this is one of t
6470: 68 65 20 66 65 77 20 70 6c 61 63 65 73 0d 0a 20  he few places.. 
6480: 20 20 20 20 20 23 20 20 20 20 20 20 20 77 68 65       #       whe
6490: 72 65 20 74 68 65 20 43 4c 52 20 77 69 6c 6c 20  re the CLR will 
64a0: 61 63 74 75 61 6c 6c 79 20 66 69 6e 64 20 61 6e  actually find an
64b0: 64 20 6c 6f 61 64 20 74 68 65 6d 20 70 72 6f 70  d load them prop
64c0: 65 72 6c 79 29 2e 0d 0a 20 20 20 20 20 20 23 0d  erly)...      #.
64d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
64e0: 20 65 78 69 73 74 73 20 3a 3a 62 69 6e 61 72 79   exists ::binary
64f0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
6500: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
6510: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 69  ing length $::bi
6520: 6e 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20  nary_directory] 
6530: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
6540: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6550: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
6560: 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 69 6e 61  tion of the bina
6570: 72 79 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ry directory has
6580: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
6590: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
65a0: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
65b0: 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a  e it verbatim...
65c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
65d0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 69 6e     return $::bin
65e0: 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  ary_directory.. 
65f0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
6600: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 69         return [i
6610: 6e 66 6f 20 62 69 6e 61 72 79 5d 0d 0a 20 20 20  nfo binary]..   
6620: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
6630: 20 20 20 20 70 72 6f 63 20 67 65 74 45 78 74 65      proc getExte
6640: 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 7b 20 66  rnalFileName { f
6650: 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  ileName } {..   
6660: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
6670: 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20  TE: Returns the 
6680: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e  specified file n
6690: 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65 72  ame as if it wer
66a0: 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  e located in the
66b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
66c0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
66d0: 6e 69 6e 67 20 74 68 65 20 65 78 74 65 72 6e 61  ning the externa
66e0: 6c 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20  l binaries...   
66f0: 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
6700: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
6710: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
6720: 67 65 74 45 78 74 65 72 6e 61 6c 44 69 72 65 63  getExternalDirec
6730: 74 6f 72 79 5d 20 24 66 69 6c 65 4e 61 6d 65 5d  tory] $fileName]
6740: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
6750: 20 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46   proc getBinaryF
6760: 69 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61  ileName { fileNa
6770: 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  me {platform ""}
6780: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
6790: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74       # NOTE: Ret
67a0: 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69  urns the specifi
67b0: 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20  ed file name as 
67c0: 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74  if it were locat
67d0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
67e0: 20 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20   #       binary 
67f0: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
6800: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
6810: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
6820: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
6830: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
6840: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
6850: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
6860: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
6870: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
6880: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
6890: 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f          [file jo
68a0: 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72  in [getBinaryDir
68b0: 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72  ectory] $platfor
68c0: 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  m [file tail $fi
68d0: 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d  leName]]]..    }
68e0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
68f0: 74 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e  tCoreBinaryFileN
6900: 61 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20  ame { {platform 
6910: 22 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 66 61  ""} {standard fa
6920: 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  lse} } {..      
6930: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6940: 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c   Returns the ful
6950: 6c 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66  l path for the f
6960: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
6970: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
6980: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
6990: 74 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64  tive library cod
69a0: 65 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66  e for this platf
69b0: 6f 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65  orm.  First, che
69c0: 63 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20  ck and see if.. 
69d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
69e0: 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74   SQLite core nat
69f0: 69 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20  ive library has 
6a00: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61  already been loa
6a10: 64 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20  ded.  Next,..   
6a20: 20 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62     #       fallb
6a30: 61 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20  ack to what the 
6a40: 66 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64  full path should
6a50: 20 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68   be, based on wh
6a60: 65 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20  ether the..     
6a70: 20 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d   #       mixed-m
6a80: 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20  ode assembly is 
6a90: 62 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74  being used and t
6aa0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  he name of the c
6ab0: 75 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  urrent..      # 
6ac0: 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d        platform..
6ad0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
6ae0: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
6af0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
6b00: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
6b10: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
6b20: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
6b30: 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
6b40: 74 69 76 65 4d 65 74 68 6f 64 73 20 5f 53 51 4c  tiveMethods _SQL
6b50: 69 74 65 4e 61 74 69 76 65 4d 6f 64 75 6c 65 46  iteNativeModuleF
6b60: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
6b70: 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20   fileName] == 0 
6b80: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
6b90: 68 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  h $fileName] > 0
6ba0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6bb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6bc0: 4f 54 45 3a 20 54 68 65 20 53 51 4c 69 74 65 20  OTE: The SQLite 
6bd0: 63 6f 72 65 20 6e 61 74 69 76 65 20 6c 69 62 72  core native libr
6be0: 61 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 20  ary has already 
6bf0: 62 65 65 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d  been loaded via.
6c00: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c10: 20 74 68 65 20 6e 61 74 69 76 65 20 6c 69 62 72   the native libr
6c20: 61 72 79 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20  ary pre-loader. 
6c30: 20 52 65 74 75 72 6e 20 74 68 61 74 20 66 69 6c   Return that fil
6c40: 65 20 6e 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20  e name now...   
6c50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6c60: 72 65 74 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65  return $fileName
6c70: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6c80: 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74 69     if {[hasRunti
6c90: 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d  meOption native]
6ca0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6cb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6cc0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
6cd0: 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
6ce0: 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a  bly file name...
6cf0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6d00: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
6d10: 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20  nativename \..  
6d20: 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
6d30: 6a 6f 69 6e 20 5b 67 65 74 42 69 6e 61 72 79 44  join [getBinaryD
6d40: 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66  irectory] $platf
6d50: 6f 72 6d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  orm System.Data.
6d60: 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20  SQLite.dll]]..  
6d70: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73      } elseif {$s
6d80: 74 61 6e 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d  tandard} then {.
6d90: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
6da0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
6db0: 72 6e 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e  rn the native-on
6dc0: 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69  ly standard SQLi
6dd0: 74 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20  te library file 
6de0: 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  name...        #
6df0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6e00: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
6e10: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
6e20: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
6e30: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
6e40: 20 24 70 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74   $platform sqlit
6e50: 65 33 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20  e3.dll]]..      
6e60: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
6e70: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6e80: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
6e90: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
6ea0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
6eb0: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
6ec0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6ed0: 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  rn [file nativen
6ee0: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
6ef0: 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67     [file join [g
6f00: 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72  etBinaryDirector
6f10: 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c  y] $platform SQL
6f20: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d  ite.Interop.dll]
6f30: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
6f40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
6f50: 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72  etCommonDirector
6f60: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
6f70: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
6f80: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
6f90: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
6fa0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
6fb0: 73 74 20 73 63 72 69 70 74 73 0d 0a 20 20 20 20  st scripts..    
6fc0: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
6fd0: 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 42 79   be located.  By
6fe0: 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73 20 6a   default, this j
6ff0: 75 73 74 20 72 65 74 75 72 6e 73 20 74 68 65 20  ust returns the 
7000: 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20 20  Eagle..      #  
7010: 20 20 20 20 20 62 69 6e 61 72 79 20 64 69 72 65       binary dire
7020: 63 74 6f 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d  ctory...      #.
7030: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
7040: 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e   exists ::common
7050: 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c  _directory] && \
7060: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
7070: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f  ing length $::co
7080: 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20  mmon_directory] 
7090: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
70a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
70b0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61  # NOTE: The loca
70c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d  tion of the comm
70d0: 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  on directory has
70e0: 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20   been set;..    
70f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
7100: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
7110: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
7120: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d     return $::com
7130: 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20  mon_directory.. 
7140: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
7150: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 76 65  info exists ::ve
7160: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d 20  ndor_directory] 
7170: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
7180: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7190: 3a 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f  ::vendor_directo
71a0: 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ry] > 0} then {.
71b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
71c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
71d0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
71e0: 76 65 6e 64 6f 72 20 64 69 72 65 63 74 6f 72 79  vendor directory
71f0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a   has been set;..
7200: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
7210: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
7220: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
7230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
7240: 3a 76 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72  :vendor_director
7250: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  y..      } elsei
7260: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
7270: 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26  ::tcl_library] &
7280: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
7290: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a  string length $:
72a0: 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20  :tcl_library] > 
72b0: 30 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  0 && \..        
72c0: 20 20 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74    [file isdirect
72d0: 6f 72 79 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61  ory $::tcl_libra
72e0: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
72f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7300: 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
7310: 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  able with the lo
7320: 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63  cation of the sc
7330: 72 69 70 74 20 6c 69 62 72 61 72 79 20 69 73 0d  ript library is.
7340: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7350: 20 73 65 74 20 61 6e 64 20 61 70 70 65 61 72 73   set and appears
7360: 20 74 6f 20 62 65 20 61 20 72 65 61 6c 20 64 69   to be a real di
7370: 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f  rectory (i.e. no
7380: 74 20 65 6d 62 65 64 64 65 64 0d 0a 20 20 20 20  t embedded..    
7390: 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74 68      #       with
73a0: 69 6e 20 61 20 66 69 6c 65 29 3b 20 74 68 65 72  in a file); ther
73b0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
73c0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
73d0: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c     return $::tcl
73e0: 5f 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20  _library..      
73f0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
7400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
7410: 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f  OTE: Fallback to
7420: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
7430: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 78  ontaining the ex
7440: 65 63 75 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20  ecutable...     
7450: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
7460: 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72  turn [info binar
7470: 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  y]..      }..   
7480: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
7490: 67 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63  getDatabaseDirec
74a0: 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  tory {} {..     
74b0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
74c0: 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  : This procedure
74d0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72   returns the dir
74e0: 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65  ectory where the
74f0: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 73 0d   test databases.
7500: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
7510: 68 6f 75 6c 64 20 62 65 20 6c 6f 63 61 74 65 64  hould be located
7520: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
7530: 68 69 73 20 6a 75 73 74 20 75 73 65 73 20 74 68  his just uses th
7540: 65 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20  e temporary..   
7550: 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63     #       direc
7560: 74 6f 72 79 20 63 6f 6e 66 69 67 75 72 65 64 20  tory configured 
7570: 66 6f 72 20 74 68 69 73 20 73 79 73 74 65 6d 2e  for this system.
7580: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7590: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
75a0: 73 20 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72  s ::database_dir
75b0: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
75c0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
75d0: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 61 62 61  length $::databa
75e0: 73 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  se_directory] > 
75f0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
7600: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
7610: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
7620: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
7630: 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  se directory has
7640: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
7650: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
7660: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
7670: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
7680: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7690: 20 24 3a 3a 64 61 74 61 62 61 73 65 5f 64 69 72   $::database_dir
76a0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
76b0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
76c0: 69 73 74 73 20 3a 3a 73 63 72 61 74 63 68 5f 64  ists ::scratch_d
76d0: 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a  irectory] && \..
76e0: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
76f0: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 73 63 72 61  g length $::scra
7700: 74 63 68 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e  tch_directory] >
7710: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7720: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
7730: 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74   NOTE: The locat
7740: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 61 74  ion of the scrat
7750: 63 68 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ch directory has
7760: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
7770: 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ;..        #    
7780: 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73     therefore, us
7790: 65 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23  e it...        #
77a0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
77b0: 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65   $::scratch_dire
77c0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
77d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
77e0: 65 74 75 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72  eturn [getTempor
77f0: 61 72 79 50 61 74 68 5d 0d 0a 20 20 20 20 20 20  aryPath]..      
7800: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
7810: 20 70 72 6f 63 20 67 65 74 54 65 6d 70 6f 72 61   proc getTempora
7820: 72 79 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b  ryDirectory {} {
7830: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
7840: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
7850: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
7860: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 77 68  the directory wh
7870: 65 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ere the temporar
7880: 79 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 23  y files..      #
7890: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
78a0: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
78b0: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
78c0: 20 75 73 65 73 20 74 68 65 20 74 65 6d 70 6f 72   uses the tempor
78d0: 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ary..      #    
78e0: 20 20 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e     directory con
78f0: 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73  figured for this
7900: 20 73 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20   system...      
7910: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
7920: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 6d 70  fo exists ::temp
7930: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 5d  orary_directory]
7940: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
7950: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
7960: 24 3a 3a 74 65 6d 70 6f 72 61 72 79 5f 64 69 72  $::temporary_dir
7970: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
7980: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
7990: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
79a0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
79b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
79c0: 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
79d0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20   overridden;..  
79e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
79f0: 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e  erefore, use it.
7a00: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
7a10: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
7a20: 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f  emporary_directo
7a30: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
7a40: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
7a50: 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63   ::scratch_direc
7a60: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
7a70: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
7a80: 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68 5f  ngth $::scratch_
7a90: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
7aa0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7ab0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7ac0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
7ad0: 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20 64  of the scratch d
7ae0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
7af0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
7b00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
7b10: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
7b20: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
7b30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a        return $::
7b40: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
7b50: 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  y..      } else 
7b60: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
7b70: 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 50  n [getTemporaryP
7b80: 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ath]..      }.. 
7b90: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
7ba0: 63 20 67 65 74 45 78 65 63 75 74 65 4f 6e 53 65  c getExecuteOnSe
7bb0: 74 75 70 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  tup {} {..      
7bc0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
7bd0: 20 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65   ::execute_on_se
7be0: 74 75 70 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  tup] && \..     
7bf0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
7c00: 67 74 68 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f  gth $::execute_o
7c10: 6e 5f 73 65 74 75 70 5d 20 3e 20 30 7d 20 74 68  n_setup] > 0} th
7c20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
7c30: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
7c40: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6e 66   Return the conf
7c50: 69 67 75 72 65 64 20 53 51 4c 20 74 6f 20 65 78  igured SQL to ex
7c60: 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68 65  ecute during the
7c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20   connection..   
7c80: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
7c90: 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69 2e  up procedure (i.
7ca0: 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65 73  e. for every tes
7cb0: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
7cc0: 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20  ction)...       
7cd0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
7ce0: 72 6e 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e  rn $::execute_on
7cf0: 5f 73 65 74 75 70 0d 0a 20 20 20 20 20 20 7d 20  _setup..      } 
7d00: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
7d10: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
7d20: 45 3a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  E: By default, t
7d30: 68 65 72 65 20 69 73 20 6e 6f 20 53 51 4c 20 74  here is no SQL t
7d40: 6f 20 65 78 65 63 75 74 65 20 64 75 72 69 6e 67  o execute during
7d50: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d   the connection.
7d60: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
7d70: 20 73 65 74 75 70 20 70 72 6f 63 65 64 75 72 65   setup procedure
7d80: 20 28 69 2e 65 2e 20 66 6f 72 20 65 76 65 72 79   (i.e. for every
7d90: 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20 63   test database c
7da0: 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20  onnection)...   
7db0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
7dc0: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
7dd0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
7de0: 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 4f 76    proc getTestOv
7df0: 65 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20  erridesPreamble 
7e00: 7b 20 7b 65 78 74 72 61 56 61 72 4e 61 6d 65 73  { {extraVarNames
7e10: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
7e20: 73 65 74 20 76 61 72 4e 61 6d 65 73 20 5b 6c 69  set varNames [li
7e30: 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  st]....      #..
7e40: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
7e50: 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 74 61 72   available, star
7e60: 74 20 77 69 74 68 20 74 68 65 20 6d 61 73 74 65  t with the maste
7e70: 72 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 6f  r list of test o
7e80: 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 23  verride..      #
7e90: 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 73         variables
7ea0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
7eb0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
7ec0: 74 73 20 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  ts ::test_overri
7ed0: 64 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  des] && \..     
7ee0: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
7ef0: 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65 73 5d  :test_overrides]
7f00: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
7f10: 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65        eval lappe
7f20: 6e 64 20 76 61 72 4e 61 6d 65 73 20 24 3a 3a 74  nd varNames $::t
7f30: 65 73 74 5f 6f 76 65 72 72 69 64 65 73 0d 0a 20  est_overrides.. 
7f40: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
7f50: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
7f60: 20 49 66 20 72 65 71 75 65 73 74 65 64 20 62 79   If requested by
7f70: 20 6f 75 72 20 63 61 6c 6c 65 72 2c 20 61 64 64   our caller, add
7f80: 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 61 6c 20   any additional 
7f90: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
7fa0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 20 74 6f  #       names to
7fb0: 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a 20 20 20 20   copy now...    
7fc0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7fd0: 6c 6c 65 6e 67 74 68 20 24 65 78 74 72 61 56 61  llength $extraVa
7fe0: 72 4e 61 6d 65 73 5d 20 3e 20 30 7d 20 74 68 65  rNames] > 0} the
7ff0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76 61  n {..        eva
8000: 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61 6d  l lappend varNam
8010: 65 73 20 24 65 78 74 72 61 56 61 72 4e 61 6d 65  es $extraVarName
8020: 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
8030: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
8040: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 73  OTE: Build the s
8050: 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20 74  cript fragment t
8060: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
8070: 20 70 72 6f 63 65 73 73 69 6e 67 20 65 61 63 68   processing each
8080: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8090: 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 61 6e  variable name an
80a0: 64 20 61 64 64 69 6e 67 20 74 68 65 20 6e 65 63  d adding the nec
80b0: 65 63 65 73 73 61 72 79 20 73 63 72 69 70 74 20  ecessary script 
80c0: 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 0d 0a 20  fragments for.. 
80d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 61 63       #       eac
80e0: 68 20 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d  h one...      #.
80f0: 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c  .      set resul
8100: 74 20 22 22 0d 0a 0d 0a 20 20 20 20 20 20 66 6f  t ""....      fo
8110: 72 65 61 63 68 20 76 61 72 4e 61 6d 65 20 24 76  reach varName $v
8120: 61 72 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  arNames {..     
8130: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8140: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
8150: 71 75 61 6c 69 66 69 65 64 20 67 6c 6f 62 61 6c  qualified global
8160: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 2e 0d   variable name..
8170: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8180: 20 20 20 20 73 65 74 20 66 75 6c 6c 56 61 72 4e      set fullVarN
8190: 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ame [appendArgs 
81a0: 3a 3a 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 0d 0a  :: $varName]....
81b0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
81c0: 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20     # NOTE: Does 
81d0: 74 68 65 20 76 61 72 69 61 62 6c 65 20 65 78 69  the variable exi
81e0: 73 74 20 69 6e 20 74 68 69 73 20 69 6e 74 65 72  st in this inter
81f0: 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74 3f 0d  preter context?.
8200: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
8210: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
8220: 69 73 74 73 20 24 66 75 6c 6c 56 61 72 4e 61 6d  ists $fullVarNam
8230: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
8240: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
8250: 20 20 20 23 20 4e 4f 54 45 3a 20 41 70 70 65 6e     # NOTE: Appen
8260: 64 20 61 20 73 63 72 69 70 74 20 66 72 61 67 6d  d a script fragm
8270: 65 6e 74 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ent to the resul
8280: 74 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72  t that will corr
8290: 65 63 74 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  ectly..         
82a0: 20 23 20 20 20 20 20 20 20 63 6f 70 79 20 61 6e   #       copy an
82b0: 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 75  y contained valu
82c0: 65 20 74 6f 20 61 6e 6f 74 68 65 72 20 69 6e 74  e to another int
82d0: 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65 78 74  erpreter context
82e0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
82f0: 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
8300: 20 72 65 73 75 6c 74 20 5c 6e 20 22 73 65 74 20   result \n "set 
8310: 22 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 20 22  " $fullVarName "
8320: 20 5c 7b 22 20 5b 73 65 74 20 24 66 75 6c 6c 56   \{" [set $fullV
8330: 61 72 4e 61 6d 65 5d 20 5c 7d 0d 0a 20 20 20 20  arName] \}..    
8340: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
8350: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8360: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
8370: 72 65 73 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20  result contains 
8380: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 63 72 69  one or more scri
8390: 70 74 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 70  pt fragments, ap
83a0: 70 65 6e 64 20 61 0d 0a 20 20 20 20 20 20 23 20  pend a..      # 
83b0: 20 20 20 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a        newline...
83c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
83d0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
83e0: 68 20 24 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20  h $result] > 0} 
83f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
8400: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e  append result \n
8410: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
8420: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
8430: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
8440: 20 70 72 6f 63 20 67 65 74 41 70 70 44 6f 6d 61   proc getAppDoma
8450: 69 6e 50 72 65 61 6d 62 6c 65 20 7b 20 7b 70 72  inPreamble { {pr
8460: 65 66 69 78 20 22 22 7d 20 7b 73 75 66 66 69 78  efix ""} {suffix
8470: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
8480: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
8490: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
84a0: 72 65 74 75 72 6e 73 20 61 20 74 65 73 74 20 73  returns a test s
84b0: 65 74 75 70 20 73 63 72 69 70 74 20 66 72 61 67  etup script frag
84c0: 6d 65 6e 74 20 73 75 69 74 61 62 6c 65 20 66 6f  ment suitable fo
84d0: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
84e0: 20 65 76 61 6c 75 61 74 69 6f 6e 20 62 79 20 61   evaluation by a
84f0: 6e 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 72  n interpreter cr
8500: 65 61 74 65 64 20 69 6e 20 61 6e 20 69 73 6f 6c  eated in an isol
8510: 61 74 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e  ated application
8520: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8530: 64 6f 6d 61 69 6e 2e 20 20 54 68 65 20 73 63 72  domain.  The scr
8540: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69  ipt fragment bei
8550: 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ng returned will
8560: 20 62 65 20 73 75 72 72 6f 75 6e 64 65 64 20 62   be surrounded b
8570: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
8580: 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20   the prefix and 
8590: 73 75 66 66 69 78 20 22 73 63 72 69 70 74 20 66  suffix "script f
85a0: 72 61 67 6d 65 6e 74 73 22 20 73 70 65 63 69 66  ragments" specif
85b0: 69 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ied by our calle
85c0: 72 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  r,..      #     
85d0: 20 20 69 66 20 61 6e 79 2e 20 20 54 68 65 20 65    if any.  The e
85e0: 6e 74 69 72 65 20 73 63 72 69 70 74 20 62 65 69  ntire script bei
85f0: 6e 67 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ng returned will
8600: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
8610: 76 69 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  via..      #    
8620: 20 20 20 5b 73 75 62 73 74 5d 2c 20 69 6e 20 74     [subst], in t
8630: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
8640: 72 20 63 61 6c 6c 65 72 2c 20 62 65 66 6f 72 65  r caller, before
8650: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 2e   being returned.
8660: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8670: 54 68 69 73 20 73 74 65 70 20 69 73 20 6e 65 63  This step is nec
8680: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 73  essary so that s
8690: 6f 6d 65 20 6c 69 6d 69 74 65 64 20 63 6f 6e 74  ome limited cont
86a0: 65 78 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c  ext information,
86b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
86c0: 70 72 69 6d 61 72 69 6c 79 20 72 65 6c 61 74 65  primarily relate
86d0: 64 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  d to the testing
86e0: 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61   directories, ca
86f0: 6e 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  n be transferred
8700: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8710: 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  to the interpret
8720: 65 72 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74  er in the isolat
8730: 65 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ed application d
8740: 6f 6d 61 69 6e 2c 20 6d 61 6b 69 6e 67 20 69 74  omain, making it
8750: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8760: 61 62 6c 65 20 74 6f 20 73 75 63 63 65 73 73 66  able to successf
8770: 75 6c 6c 79 20 72 75 6e 20 74 65 73 74 73 20 74  ully run tests t
8780: 68 61 74 20 72 65 71 75 69 72 65 20 6f 6e 65 20  hat require one 
8790: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 0d 0a  or more of the..
87a0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69        #       fi
87b0: 6c 65 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68  les in one of th
87c0: 65 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74  e testing direct
87d0: 6f 72 69 65 73 2e 20 20 43 61 6c 6c 65 72 73 20  ories.  Callers 
87e0: 73 68 6f 75 6c 64 20 6b 65 65 70 20 69 6e 0d 0a  should keep in..
87f0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
8800: 6e 64 20 74 68 61 74 20 74 68 65 20 74 65 73 74  nd that the test
8810: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
8820: 20 62 65 69 6e 67 20 72 65 74 75 72 6e 65 64 20   being returned 
8830: 63 61 6e 6e 6f 74 20 72 65 6c 79 20 6f 6e 0d 0a  cannot rely on..
8840: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
8850: 79 20 73 63 72 69 70 74 20 6c 69 62 72 61 72 79  y script library
8860: 20 70 72 6f 63 65 64 75 72 65 73 20 74 68 61 74   procedures that
8870: 20 61 72 65 20 6e 6f 74 20 70 72 6f 76 69 64 65   are not provide
8880: 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 0d 0a  d by the Eagle..
8890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
88a0: 62 72 61 72 79 20 70 61 63 6b 61 67 65 20 28 69  brary package (i
88b0: 2e 65 2e 20 22 69 6e 69 74 2e 65 61 67 6c 65 22  .e. "init.eagle"
88c0: 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 6f  ), including tho
88d0: 73 65 20 70 72 6f 76 69 64 65 64 20 62 79 0d 0a  se provided by..
88e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
88f0: 65 20 45 61 67 6c 65 20 74 65 73 74 20 70 61 63  e Eagle test pac
8900: 6b 61 67 65 2c 20 75 6e 6c 65 73 73 20 74 68 65  kage, unless the
8910: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
8920: 20 74 68 65 6d 20 69 73 20 6c 6f 61 64 65 64 0d   them is loaded.
8930: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d  .      #       m
8940: 61 6e 75 61 6c 6c 79 20 76 69 61 20 73 6f 6d 65  anually via some
8950: 20 6f 74 68 65 72 20 6d 65 63 68 61 6e 69 73 6d   other mechanism
8960: 20 28 65 2e 67 2e 20 62 79 20 69 6e 63 6c 75 64   (e.g. by includ
8970: 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 0d  ing appropriate.
8980: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b  .      #       [
8990: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 5d  package require]
89a0: 20 6f 72 20 5b 73 6f 75 72 63 65 5d 20 63 6f 6d   or [source] com
89b0: 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72 65  mands in the pre
89c0: 66 69 78 20 6f 72 20 73 75 66 66 69 78 0d 0a 20  fix or suffix.. 
89d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72       #       scr
89e0: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 29 2e 20  ipt fragments). 
89f0: 20 41 6c 73 6f 2c 20 61 6c 6c 20 76 61 72 69 61   Also, all varia
8a00: 62 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  ble references a
8a10: 6e 64 20 61 6c 6c 20 6e 65 73 74 65 64 0d 0a 20  nd all nested.. 
8a20: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
8a30: 6d 61 6e 64 73 20 28 69 2e 65 2e 20 74 68 6f 73  mands (i.e. thos
8a40: 65 20 69 6e 20 73 71 75 61 72 65 20 62 72 61 63  e in square brac
8a50: 6b 65 74 73 29 20 63 6f 6e 74 61 69 6e 65 64 20  kets) contained 
8a60: 69 6e 20 74 68 65 20 66 69 6e 61 6c 0d 0a 20 20  in the final..  
8a70: 20 20 20 20 23 20 20 20 20 20 20 20 73 63 72 69      #       scri
8a80: 70 74 20 66 72 61 67 6d 65 6e 74 20 77 69 6c 6c  pt fragment will
8a90: 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 65 76   end up being ev
8aa0: 61 6c 75 61 74 65 64 20 69 6e 20 74 68 65 20 63  aluated in the c
8ab0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 0d 0a 20  ontext of the.. 
8ac0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61 6c       #       cal
8ad0: 6c 69 6e 67 20 69 6e 74 65 72 70 72 65 74 65 72  ling interpreter
8ae0: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 72   and not the tar
8af0: 67 65 74 20 69 6e 74 65 72 70 72 65 74 65 72 20  get interpreter 
8b00: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  created in the..
8b10: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73        #       is
8b20: 6f 6c 61 74 65 64 20 61 70 70 6c 69 63 61 74 69  olated applicati
8b30: 6f 6e 20 64 6f 6d 61 69 6e 20 75 6e 6c 65 73 73  on domain unless
8b40: 20 74 68 65 20 64 6f 6c 6c 61 72 20 73 69 67 6e   the dollar sign
8b50: 73 20 61 6e 64 2f 6f 72 20 73 71 75 61 72 65 0d  s and/or square.
8b60: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
8b70: 72 61 63 6b 65 74 73 20 61 72 65 20 73 70 65 63  rackets are spec
8b80: 69 61 6c 6c 79 20 71 75 6f 74 65 64 20 77 69 74  ially quoted wit
8b90: 68 20 62 61 63 6b 73 6c 61 73 68 65 73 2e 0d 0a  h backslashes...
8ba0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
8bb0: 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31  eturn [uplevel 1
8bc0: 20 5b 6c 69 73 74 20 73 75 62 73 74 20 5b 61 70   [list subst [ap
8bd0: 70 65 6e 64 41 72 67 73 20 24 70 72 65 66 69 78  pendArgs $prefix
8be0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
8bf0: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
8c00: 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20  n native]} then 
8c10: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
8c20: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
8c30: 3a 20 54 68 65 20 5c 5b 6f 62 6a 65 63 74 5c 5d  : The \[object\]
8c40: 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 62 65 20   command may be 
8c50: 6d 69 73 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  missing in some 
8c60: 45 61 67 6c 65 20 63 6f 72 65 0d 0a 20 20 20 20  Eagle core..    
8c70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
8c80: 62 72 61 72 79 20 63 6f 6e 66 69 67 75 72 61 74  brary configurat
8c90: 69 6f 6e 73 2e 20 20 49 6e 20 74 68 61 74 20 63  ions.  In that c
8ca0: 61 73 65 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63  ase, we cannot c
8cb0: 6f 70 79 20 74 68 65 0d 0a 20 20 20 20 20 20 20  opy the..       
8cc0: 20 20 20 23 20 20 20 20 20 20 20 22 6e 61 74 69     #       "nati
8cd0: 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69  ve" runtime opti
8ce0: 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  on...          #
8cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
8d00: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
8d10: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49   object invoke I
8d20: 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41 63  nterpreter.GetAc
8d30: 74 69 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f  tive AddRuntimeO
8d40: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
8d50: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8d60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
8d70: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
8d80: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
8d90: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
8da0: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
8db0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
8dc0: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
8dd0: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
8de0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
8df0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
8e00: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
8e10: 62 6f 73 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d  bose false} } {.
8e20: 0a 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63  .      set sourc
8e30: 65 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78  eFileName [getEx
8e40: 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24  ternalFileName $
8e50: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20  fileName]....   
8e60: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
8e70: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
8e80: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
8e90: 20 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62         if {$verb
8ea0: 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ose} then {..   
8eb0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
8ec0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
8ed0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
8ee0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
8ef0: 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20  skipped copying 
8f00: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22  external file \"
8f10: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
8f20: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
8f30: 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20     "\", it does 
8f40: 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20  not exist\n"].. 
8f50: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8f60: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
8f70: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
8f80: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
8f90: 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d  ewFileName] > 0}
8fa0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
8fb0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
8fc0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
8fd0: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
8fe0: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
8ff0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9000: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
9010: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
9020: 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66  inaryFileName $f
9030: 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72  ileName $platfor
9040: 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  m]..      }.... 
9050: 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74 44       set targetD
9060: 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 64  irectory [file d
9070: 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46 69  irname $targetFi
9080: 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20  leName]....     
9090: 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
90a0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c         if {![fil
90b0: 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65 74  e exists $target
90c0: 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  Directory]} then
90d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 69   {..          fi
90e0: 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65 74  le mkdir $target
90f0: 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
9100: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 66 69     }..        fi
9110: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24  le copy -force $
9120: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24  sourceFileName $
9130: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a  targetFileName..
9140: 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74        }] == 0} t
9150: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
9160: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
9170: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9180: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9190: 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 65 78 74  "---- copied ext
91a0: 65 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20  ernal file from 
91b0: 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  \"" $sourceFileN
91c0: 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c  ame "\" to \"" \
91d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 74  ..            $t
91e0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22  argetFileName \"
91f0: 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
9200: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
9210: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
9220: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9230: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
9240: 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 63 6f  --- failed to co
9250: 70 79 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65  py external file
9260: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
9270: 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  eFileName \..   
9280: 20 20 20 20 20 20 20 20 20 22 5c 22 20 74 6f 20           "\" to 
9290: 5c 22 22 20 24 74 61 72 67 65 74 46 69 6c 65 4e  \"" $targetFileN
92a0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
92b0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
92c0: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42 69    proc tryCopyBi
92d0: 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20 20 20 20  naryFile {..    
92e0: 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
92f0: 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b   {platform ""} {
9300: 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 20  newFileName ""} 
9310: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
9320: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73  } {..      set s
9330: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5b 67  ourceFileName [g
9340: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
9350: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
9360: 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69  form]....      i
9370: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
9380: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
9390: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
93a0: 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d     if {$verbose}
93b0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
93c0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
93d0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
93e0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
93f0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70        "---- skip
9400: 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69 6e 61  ped copying bina
9410: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73 6f 75  ry file \"" $sou
9420: 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  rceFileName \.. 
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
9440: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
9450: 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20  ist\n"]..       
9460: 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   }..        retu
9470: 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  rn..      }.... 
9480: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
9490: 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65   length $newFile
94a0: 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
94b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
94c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
94d0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
94e0: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
94f0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
9500: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9510: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
9520: 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ame [getBuildFil
9530: 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20  eName $fileName 
9540: 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20  $platform]..    
9550: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74    }....      set
9560: 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72 79   targetDirectory
9570: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
9580: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d 0d  targetFileName].
9590: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
95a0: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  tch {..        i
95b0: 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73  f {![file exists
95c0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
95d0: 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
95e0: 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72        file mkdir
95f0: 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f 72   $targetDirector
9600: 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  y..        }..  
9610: 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20        file copy 
9620: 2d 66 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69  -force $sourceFi
9630: 6c 65 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69  leName $targetFi
9640: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 5d  leName..      }]
9650: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
9660: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9670: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9680: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9690: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f          "---- co
96a0: 70 69 65 64 20 62 69 6e 61 72 79 20 66 69 6c 65  pied binary file
96b0: 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63   from \"" $sourc
96c0: 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f  eFileName "\" to
96d0: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
96e0: 20 20 20 20 24 74 61 72 67 65 74 46 69 6c 65 4e      $targetFileN
96f0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
9700: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9710: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
9720: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
9730: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
9740: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
9750: 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72 79 20   to copy binary 
9760: 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73  file from \"" $s
9770: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
9790: 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46   to \"" $targetF
97a0: 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20  ileName \"\n].. 
97b0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
97c0: 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f  ..    proc tryCo
97d0: 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 0d 0a 20  pyBuildFile {.. 
97e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
97f0: 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  ame {platform ""
9800: 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20 22  } {newFileName "
9810: 22 7d 20 7b 76 65 72 62 6f 73 65 20 66 61 6c 73  "} {verbose fals
9820: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
9830: 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65  t sourceFileName
9840: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
9850: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
9860: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
9870: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
9880: 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61  ts $sourceFileNa
9890: 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
98a0: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
98b0: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
98c0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
98d0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
98e0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
98f0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
9900: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 75  ipped copying bu
9910: 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24 73 6f  ild file \"" $so
9920: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
9940: 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  ", it does not e
9950: 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  xist\n"]..      
9960: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
9970: 75 72 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  urn..      }....
9980: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
9990: 67 20 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c  g length $newFil
99a0: 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e  eName] > 0} then
99b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
99c0: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b  targetFileName [
99d0: 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
99e0: 65 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24  e $newFileName $
99f0: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20  platform]..     
9a00: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
9a10: 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c     set targetFil
9a20: 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79  eName [getBinary
9a30: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
9a40: 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20  me $platform].. 
9a50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
9a60: 73 65 74 20 74 61 72 67 65 74 44 69 72 65 63 74  set targetDirect
9a70: 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ory [file dirnam
9a80: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
9a90: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  e]....      if {
9aa0: 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
9ab0: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
9ac0: 73 74 73 20 24 74 61 72 67 65 74 44 69 72 65 63  sts $targetDirec
9ad0: 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
9ae0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b           file mk
9af0: 64 69 72 20 24 74 61 72 67 65 74 44 69 72 65 63  dir $targetDirec
9b00: 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d  tory..        }.
9b10: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
9b20: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
9b30: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
9b40: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
9b50: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
9b60: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
9b70: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
9b80: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
9b90: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
9ba0: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
9bb0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
9bc0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
9bd0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
9be0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
9bf0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
9c00: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
9c10: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
9c20: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
9c30: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
9c40: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
9c50: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
9c60: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
9c70: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
9c80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
9c90: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
9ca0: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
9cb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9cc0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
9cd0: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
9ce0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
9cf0: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
9d00: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
9d10: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
9d20: 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
9d30: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ame $fileName $p
9d40: 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20  latform]....    
9d50: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
9d60: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
9d70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9d80: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
9d90: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9da0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
9db0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
9dc0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
9dd0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
9de0: 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79   deleting binary
9df0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
9e00: 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ame \..         
9e10: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
9e20: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
9e30: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
9e40: 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20      return..    
9e50: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
9e60: 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65  {[catch {file de
9e70: 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d  lete $fileName}]
9e80: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
9e90: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
9ea0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
9eb0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
9ec0: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65          "---- de
9ed0: 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69 6c  leted binary fil
9ee0: 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
9ef0: 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
9f00: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
9f10: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
9f20: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
9f30: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9f40: 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20  "---- failed to 
9f50: 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66 69  delete binary fi
9f60: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
9f70: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d   \"\n]..      }.
9f80: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
9f90: 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75 69  roc tryDeleteBui
9fa0: 6c 64 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d  ldFile { fileNam
9fb0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
9fc0: 7b 76 65 72 62 6f 73 65 20 66 61 6c 73 65 7d 20  {verbose false} 
9fd0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
9fe0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c  ileName [getBuil
9ff0: 64 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  dFileName $fileN
a000: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
a010: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69  ..      if {![fi
a020: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
a030: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
a040: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
a050: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
a060: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
a070: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
a080: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a090: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
a0a0: 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
a0b0: 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20 24  build file \"" $
a0c0: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
a0d0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
a0e0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
a0f0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
a100: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
a110: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
a120: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66 69    if {[catch {fi
a130: 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e  le delete $fileN
a140: 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ame}] == 0} then
a150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
a160: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
a170: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
a180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
a190: 2d 2d 20 64 65 6c 65 74 65 64 20 62 75 69 6c 64  -- deleted build
a1a0: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
a1b0: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
a1c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
a1d0: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
a1e0: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
a1f0: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
a200: 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64      "---- failed
a210: 20 74 6f 20 64 65 6c 65 74 65 20 62 75 69 6c 64   to delete build
a220: 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e   file \"" $fileN
a230: 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ame \"\n]..     
a240: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
a250: 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 41 73    proc tryCopyAs
a260: 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20  sembly {..      
a270: 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b        fileName {
a280: 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64  platform ""} {pd
a290: 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65  b true} {verbose
a2a0: 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
a2b0: 20 20 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46     tryCopyBuildF
a2c0: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
a2d0: 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62  latform "" $verb
a2e0: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
a2f0: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
a300: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
a310: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
a320: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
a330: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
a340: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
a350: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 22 22 20  b] $platform "" 
a360: 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20  $verbose..      
a370: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
a380: 20 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 41   proc tryDeleteA
a390: 73 73 65 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20  ssembly {..     
a3a0: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
a3b0: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70  {platform ""} {p
a3c0: 64 62 20 74 72 75 65 7d 20 7b 76 65 72 62 6f 73  db true} {verbos
a3d0: 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  e false} } {..  
a3e0: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
a3f0: 61 72 79 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  aryFile $fileNam
a400: 65 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65 72  e $platform $ver
a410: 62 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66  bose....      if
a420: 20 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a   {$pdb} then {..
a430: 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
a440: 65 42 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70  eBinaryFile [app
a450: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
a460: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f         [file roo
a470: 74 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d  tname $fileName]
a480: 20 2e 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d   .pdb] $platform
a490: 20 24 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20   $verbose..     
a4a0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
a4b0: 20 20 70 72 6f 63 20 74 72 79 4c 6f 61 64 41 73    proc tryLoadAs
a4c0: 73 65 6d 62 6c 79 20 7b 20 66 69 6c 65 4e 61 6d  sembly { fileNam
a4d0: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
a4e0: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
a4f0: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61  ileName [getBina
a500: 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
a510: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
a520: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  ...      if {[ca
a530: 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  tch {..        s
a540: 65 74 20 61 73 73 65 6d 62 6c 79 20 5b 6f 62 6a  et assembly [obj
a550: 65 63 74 20 6c 6f 61 64 20 2d 6c 6f 61 64 74 79  ect load -loadty
a560: 70 65 20 46 69 6c 65 20 2d 61 6c 69 61 73 20 24  pe File -alias $
a570: 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20  fileName]..     
a580: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
a590: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a5a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
a5b0: 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65 73 73  , add the necess
a5c0: 61 72 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61  ary test constra
a5d0: 69 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  int...        #.
a5e0: 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
a5f0: 74 72 61 69 6e 74 20 5b 66 69 6c 65 20 72 6f 6f  traint [file roo
a600: 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
a610: 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a   $fileName]]....
a620: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
a630: 20 20 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20     # NOTE: Grab 
a640: 74 68 65 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  the image runtim
a650: 65 20 76 65 72 73 69 6f 6e 20 66 72 6f 6d 20 74  e version from t
a660: 68 65 20 61 73 73 65 6d 62 6c 79 20 62 65 63 61  he assembly beca
a670: 75 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  use..        #  
a680: 20 20 20 20 20 73 65 76 65 72 61 6c 20 74 65 73       several tes
a690: 74 73 20 72 65 6c 79 20 6f 6e 20 69 74 20 68 61  ts rely on it ha
a6a0: 76 69 6e 67 20 61 20 63 65 72 74 61 69 6e 20 76  ving a certain v
a6b0: 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  alue...        #
a6c0: 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
a6d0: 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
a6e0: 72 67 73 20 5b 66 69 6c 65 20 74 61 69 6c 20 24  rgs [file tail $
a6f0: 66 69 6c 65 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20  fileName] _ \.. 
a700: 20 20 20 20 20 20 20 20 20 20 20 5b 24 61 73 73             [$ass
a710: 65 6d 62 6c 79 20 49 6d 61 67 65 52 75 6e 74 69  embly ImageRunti
a720: 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20  meVersion]].... 
a730: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a740: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
a750: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6f   the full path o
a760: 66 20 74 68 65 20 6c 6f 61 64 65 64 20 66 69 6c  f the loaded fil
a770: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
a780: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66         return $f
a790: 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d  ileName..      }
a7a0: 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
a7b0: 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20   ""..    }..... 
a7c0: 20 20 20 70 72 6f 63 20 69 73 53 51 4c 69 74 65     proc isSQLite
a7d0: 52 65 61 64 79 20 7b 7d 20 7b 0d 0a 20 20 20 20  Ready {} {..    
a7e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
a7f0: 45 3a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72  E: This procedur
a800: 65 20 6d 75 73 74 20 72 65 74 75 72 6e 20 6e 6f  e must return no
a810: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 69 66 20 74  n-zero only if t
a820: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
a830: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a840: 6c 69 62 72 61 72 79 20 61 6e 64 20 74 68 65 20  library and the 
a850: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
a860: 74 65 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  te managed assem
a870: 62 6c 79 20 61 72 65 20 6c 6f 61 64 65 64 0d 0a  bly are loaded..
a880: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
a890: 64 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20  d ready for use 
a8a0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
a8b0: 65 2e 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 74  e.  Currently, t
a8c0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 0d 0a 20  his procedure.. 
a8d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f       #       sho
a8e0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
a8f0: 6c 79 20 61 66 74 65 72 20 74 68 65 20 5b 74 72  ly after the [tr
a900: 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 5d 20 70  yLoadAssembly] p
a910: 72 6f 63 65 64 75 72 65 20 68 61 73 0d 0a 20 20  rocedure has..  
a920: 20 20 20 20 23 20 20 20 20 20 20 20 62 65 65 6e      #       been
a930: 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 62 65   called to probe
a940: 20 66 6f 72 20 74 68 65 20 53 79 73 74 65 6d 2e   for the System.
a950: 44 61 74 61 2e 53 51 4c 69 74 65 20 6d 61 6e 61  Data.SQLite mana
a960: 67 65 64 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  ged assembly..  
a970: 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
a980: 74 68 65 20 5b 63 68 65 63 6b 46 6f 72 53 51 4c  the [checkForSQL
a990: 69 74 65 5d 20 70 72 6f 63 65 64 75 72 65 20 68  ite] procedure h
a9a0: 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
a9b0: 6f 20 70 72 6f 62 65 20 66 6f 72 0d 0a 20 20 20  o probe for..   
a9c0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
a9d0: 51 4c 69 74 65 20 6e 61 74 69 76 65 20 6c 69 62  QLite native lib
a9e0: 72 61 72 79 3b 20 6f 74 68 65 72 77 69 73 65 2c  rary; otherwise,
a9f0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
aa00: 77 69 6c 6c 20 73 69 6d 70 6c 79 0d 0a 20 20 20  will simply..   
aa10: 20 20 20 23 20 20 20 20 20 20 20 61 6c 77 61 79     #       alway
aa20: 73 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a  s return zero...
aa30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
aa40: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
aa50: 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
aa60: 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61  traint System.Da
aa70: 74 61 2e 53 51 4c 69 74 65 5d 20 26 26 20 5b 68  ta.SQLite] && [h
aa80: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  aveConstraint SQ
aa90: 4c 69 74 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d  Lite]..      }].
aaa0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
aab0: 72 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65  roc matchMachine
aac0: 20 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d   { platform } {.
aad0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
aae0: 23 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79  # NOTE: An empty
aaf0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
ab00: 70 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74  platform means t
ab10: 68 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73  hat the build is
ab20: 20 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20   not..      #   
ab30: 20 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20      [primarily] 
ab40: 61 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20  a native build; 
ab50: 74 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c  therefore, it al
ab60: 77 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20  ways matches... 
ab70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
ab80: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
ab90: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
aba0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
abb0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
abc0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
abd0: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
abe0: 20 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66   Does the specif
abf0: 69 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74  ied platform mat
ac00: 63 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72  ch up to the cur
ac10: 72 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20  rent process?.. 
ac20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
ac30: 20 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b   {$platform eq [
ac40: 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72  machineToPlatfor
ac50: 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  m $::tcl_platfor
ac60: 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65  m(machine)]} the
ac70: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
ac80: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
ac90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
aca0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
acb0: 73 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f  specified platfo
acc0: 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  rm does not matc
acd0: 68 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c  h up with the pl
ace0: 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20  atform..      # 
acf0: 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75        for the cu
ad00: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a  rrent process...
ad10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
ad20: 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
ad30: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
ad40: 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
ad50: 43 6f 6d 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20  Command {} {..  
ad60: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
ad70: 4f 54 45 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a  OTE: Is the [obj
ad80: 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72  ect] command cur
ad90: 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
ada0: 3f 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ?..      #..    
adb0: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
adc0: 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63  [llength [info c
add0: 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d  ommands object]]
ade0: 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c   > 0}]..    }...
adf0: 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b  ..    proc check
ae00: 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  ForSQLiteObjectC
ae10: 6f 6d 6d 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c  ommand { channel
ae20: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
ae30: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
ae40: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22   checking for \"
ae50: 6f 62 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64  object\" command
ae60: 20 75 73 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20   usage... ".... 
ae70: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
ae80: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
ae90: 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29  teObjectCommand)
aea0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
aeb0: 20 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a    [haveSQLiteObj
aec0: 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
aed0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
aee0: 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c  ts $channel yes\
aef0: 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  n..      } else 
af00: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
af10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e        # NOTE: Un
af20: 6c 65 73 73 20 77 65 20 61 72 65 20 66 6f 72 62  less we are forb
af30: 69 64 64 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67  idden from doing
af40: 20 73 6f 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f   so, add some co
af50: 6e 73 74 72 61 69 6e 74 73 0d 0a 20 20 20 20 20  nstraints..     
af60: 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
af70: 77 69 6c 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20  will allow most 
af80: 6f 66 20 74 68 65 20 74 65 73 74 20 73 75 69 74  of the test suit
af90: 65 20 74 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74  e to run (i.e. t
afa0: 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
afb0: 20 20 20 20 20 20 74 65 73 74 73 20 74 68 61 74        tests that
afc0: 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74 6c 79   do not directly
afd0: 20 72 65 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b   rely upon the [
afe0: 6f 62 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29  object] command)
aff0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
b000: 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
b010: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69   exists ::no(shi
b020: 6d 53 51 4c 69 74 65 41 73 73 65 6d 62 6c 79 43  mSQLiteAssemblyC
b030: 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74 68  onstraints)]} th
b040: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
b050: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
b060: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
b070: 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51  addConstraint SQ
b080: 4c 69 74 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20  LiteInterop..   
b090: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
b0a0: 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
b0b0: 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
b0c0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
b0d0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
b0e0: 69 74 65 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a  ite.Encryption..
b0f0: 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
b100: 73 74 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44  straint System.D
b110: 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d  ata.SQLite.Linq.
b120: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ...          add
b130: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
b140: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
b150: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
b160: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76  ata.SQLite.dll_v
b170: 20 5b 67 65 74 42 75 69 6c 64 43 6c 72 56 65 72   [getBuildClrVer
b180: 73 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20  sion]]..        
b190: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
b1a0: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
b1b0: 3a 6e 6f 28 73 68 69 6d 53 51 4c 69 74 65 44 65  :no(shimSQLiteDe
b1c0: 66 69 6e 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73  fineConstantCons
b1d0: 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
b1e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  {..          for
b1f0: 65 61 63 68 20 64 65 66 69 6e 65 43 6f 6e 73 74  each defineConst
b200: 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  ant [list \..   
b210: 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
b220: 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
b230: 43 54 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 54  CTIONS INTEROP_T
b240: 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d  EST_EXTENSION \.
b250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49  .              I
b260: 4e 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54  NTEROP_VIRTUAL_T
b270: 41 42 4c 45 20 55 53 45 5f 49 4e 54 45 52 4f 50  ABLE USE_INTEROP
b280: 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20  _DLL] {..       
b290: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
b2a0: 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
b2b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b2c0: 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74    defineConstant
b2d0: 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  .System.Data.SQL
b2e0: 69 74 65 2e 20 24 64 65 66 69 6e 65 43 6f 6e 73  ite. $defineCons
b2f0: 74 61 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20  tant]..         
b300: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
b310: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69  .        if {![i
b320: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
b330: 73 68 69 6d 53 51 4c 69 74 65 56 69 73 75 61 6c  shimSQLiteVisual
b340: 53 74 75 64 69 6f 43 6f 6e 73 74 72 61 69 6e 74  StudioConstraint
b350: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
b360: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
b370: 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
b380: 20 76 69 73 75 61 6c 53 74 75 64 69 6f 20 5b 67   visualStudio [g
b390: 65 74 42 75 69 6c 64 59 65 61 72 5d 5d 0d 0a 20  etBuildYear]].. 
b3a0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
b3b0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
b3c0: 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d  el no\n..      }
b3d0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
b3e0: 70 72 6f 63 20 63 68 61 6e 67 65 4e 61 74 69 76  proc changeNativ
b3f0: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b  eRuntimeOption {
b400: 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
b410: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
b420: 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64  [info commands d
b430: 65 62 75 67 5d 5d 20 3e 20 30 20 26 26 20 5c 0d  ebug]] > 0 && \.
b440: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
b450: 67 74 68 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d  gth [info subcom
b460: 6d 61 6e 64 73 20 64 65 62 75 67 20 72 75 6e 74  mands debug runt
b470: 69 6d 65 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30 20  imeoption]] > 0 
b480: 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
b490: 20 20 20 20 20 64 65 62 75 67 20 72 75 6e 74 69       debug runti
b4a0: 6d 65 6f 70 74 69 6f 6e 20 5b 65 78 70 72 20 7b  meoption [expr {
b4b0: 24 6e 61 74 69 76 65 20 3f 20 22 61 64 64 22 20  $native ? "add" 
b4c0: 3a 20 22 72 65 6d 6f 76 65 22 7d 5d 20 6e 61 74  : "remove"}] nat
b4d0: 69 76 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d  ive..      }] ==
b4e0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
b4f0: 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d      return true.
b500: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
b510: 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
b520: 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20  eObjectCommand] 
b530: 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
b540: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
b550: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
b560: 65 74 41 63 74 69 76 65 20 5b 65 78 70 72 20 7b  etActive [expr {
b570: 24 6e 61 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20  $native ? \..   
b580: 20 20 20 20 20 20 20 20 20 22 41 64 64 52 75 6e           "AddRun
b590: 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52  timeOption" : "R
b5a0: 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70 74 69  emoveRuntimeOpti
b5b0: 6f 6e 22 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20  on"}] native..  
b5c0: 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
b5d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
b5e0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
b5f0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
b600: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
b610: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
b620: 6b 46 6f 72 53 51 4c 69 74 65 42 75 69 6c 64 73  kForSQLiteBuilds
b630: 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65   { channel {sele
b640: 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20  ct false} } {.. 
b650: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b660: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
b670: 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 76  every possible v
b680: 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alid combination
b690: 20 6f 66 20 76 61 6c 75 65 73 20 75 73 65 64 20   of values used 
b6a0: 77 68 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  when..      #   
b6b0: 20 20 20 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74      locating out
b6c0: 20 74 68 65 20 62 75 69 6c 64 20 6f 75 74 70 75   the build outpu
b6d0: 74 20 64 69 72 65 63 74 6f 72 79 2c 20 73 68 6f  t directory, sho
b6e0: 77 69 6e 67 20 65 61 63 68 20 61 76 61 69 6c 61  wing each availa
b6f0: 62 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ble..      #    
b700: 20 20 20 62 75 69 6c 64 20 76 61 72 69 61 74 69     build variati
b710: 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  on along the way
b720: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
b730: 20 20 66 6f 72 65 61 63 68 20 6e 61 74 69 76 65    foreach native
b740: 20 5b 6c 69 73 74 20 66 61 6c 73 65 20 74 72 75   [list false tru
b750: 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f  e] {..        fo
b760: 72 65 61 63 68 20 79 65 61 72 20 5b 67 65 74 42  reach year [getB
b770: 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20  uildYears] {..  
b780: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
b790: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67  configuration [g
b7a0: 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
b7b0: 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
b7c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b7d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67       # NOTE: Fig
b7e0: 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65  ure out the effe
b7f0: 63 74 69 76 65 20 62 75 69 6c 64 20 70 6c 61 74  ctive build plat
b800: 66 6f 72 6d 2e 20 20 54 68 69 73 20 69 73 0d 0a  form.  This is..
b810: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
b820: 20 20 20 20 62 61 73 65 64 20 6f 6e 20 77 68 65      based on whe
b830: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 5b 70  ther or not a [p
b840: 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74 69 76 65  rimarily] native
b850: 20 62 75 69 6c 64 0d 0a 20 20 20 20 20 20 20 20   build..        
b860: 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20 62      #       is b
b870: 65 69 6e 67 20 75 73 65 64 2e 20 20 46 6f 72 20  eing used.  For 
b880: 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 6f 6e 2d  [primarily] non-
b890: 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c 0d 0a  native builds,..
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
b8b0: 20 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65      this will be
b8c0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
b8d0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
b8e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
b8f0: 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67 65 74 42  t platform [getB
b900: 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24 6e 61  uildPlatform $na
b910: 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tive]....       
b920: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
b930: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
b940: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
b950: 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
b960: 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
b970: 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 5c  a.SQLite build \
b980: 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20 20 20 20  "" [expr \..    
b990: 20 20 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61              {$na
b9a0: 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22  tive ? "native/"
b9b0: 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b   : ""}] [expr {[
b9c0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d  string length \.
b9d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b9e0: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20   $platform] > 0 
b9f0: 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 70  ? [appendArgs $p
ba00: 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d  latform /] : ""}
ba10: 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20 20 20 20  ] $year \..     
ba20: 20 20 20 20 20 20 20 20 20 20 20 2f 20 24 63 6f             / $co
ba30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 5c 22 2e  nfiguration "\".
ba40: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
ba50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ba60: 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c      # NOTE: Buil
ba70: 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  d the fully qual
ba80: 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20  ified directory 
ba90: 77 68 65 72 65 20 74 68 65 20 6e 65 63 65 73 73  where the necess
baa0: 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ary..           
bab0: 20 23 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65   #       compone
bac0: 6e 74 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  nts for System.D
bad0: 61 74 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c  ata.SQLite shoul
bae0: 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20  d be found...   
baf0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
bb00: 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72 65          set dire
bb10: 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75 69 6c 64  ctory [joinBuild
bb20: 44 69 72 65 63 74 6f 72 79 20 24 6e 61 74 69 76  Directory $nativ
bb30: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
bb40: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 42 61       [getBuildBa
bb50: 73 65 44 69 72 65 63 74 6f 72 79 5d 20 24 79 65  seDirectory] $ye
bb60: 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24 63 6f  ar $platform $co
bb70: 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a  nfiguration]....
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
bb90: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
bba0: 45 3a 20 44 6f 20 74 68 65 20 6e 65 63 65 73 73  E: Do the necess
bbb0: 61 72 79 20 66 69 6c 65 73 20 65 78 69 73 74 3f  ary files exist?
bbc0: 20 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20    Currently, no 
bbd0: 6f 74 68 65 72 20 73 74 65 70 73 0d 0a 20 20 20  other steps..   
bbe0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
bbf0: 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65   are taken to ve
bc00: 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20  rify this build 
bc10: 69 73 20 61 63 74 75 61 6c 6c 79 20 76 69 61 62  is actually viab
bc20: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
bc30: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
bc40: 69 66 20 7b 5b 69 73 42 75 69 6c 64 41 76 61 69  if {[isBuildAvai
bc50: 6c 61 62 6c 65 20 24 6e 61 74 69 76 65 20 24 64  lable $native $d
bc60: 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20  irectory]} then 
bc70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
bc80: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
bc90: 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69    # NOTE: When i
bca0: 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c  n "select" mode,
bcb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
bcc0: 65 6c 65 63 74 20 74 68 65 20 66 69 72 73 74 0d  elect the first.
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
bce0: 20 20 20 20 20 20 20 61 76 61 69 6c 61 62 6c 65         available
bcf0: 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d   build of System
bd00: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61 6e 64  .Data.SQLite and
bd10: 20 74 68 65 6e 20 72 65 74 75 72 6e 0d 0a 20 20   then return..  
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
bd30: 20 20 20 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e      immediately.
bd40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bd50: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
bd60: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
bd70: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
bd80: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
bd90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bda0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
bdb0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6e       # NOTE: Man
bdc0: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 65 20 61  ually override a
bdd0: 6c 6c 20 74 68 65 20 62 75 69 6c 64 20 64 69 72  ll the build dir
bde0: 65 63 74 6f 72 79 20 73 65 6c 65 63 74 69 6f 6e  ectory selection
bdf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
be00: 20 20 23 20 20 20 20 20 20 20 72 65 6c 61 74 65    #       relate
be10: 64 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  d test settings 
be20: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 6f 72 63  in order to forc
be30: 65 20 74 68 69 73 20 62 75 69 6c 64 0d 0a 20 20  e this build..  
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
be50: 20 20 20 20 20 20 6f 66 20 53 79 73 74 65 6d 2e        of System.
be60: 44 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62  Data.SQLite to b
be70: 65 20 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20  e used...       
be80: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
be90: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
bea0: 21 5b 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  ![changeNativeRu
beb0: 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 6e 61 74  ntimeOption $nat
bec0: 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ive]} then {..  
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
bef0: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 22 6e 6f 2c 20 66 61 69 6c 65 64 20      "no, failed 
bf20: 74 6f 20 22 20 5b 65 78 70 72 20 7b 24 6e 61 74  to " [expr {$nat
bf30: 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22 72  ive ? "add" : "r
bf40: 65 6d 6f 76 65 22 7d 5d 20 5c 0d 0a 20 20 20 20  emove"}] \..    
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65    " the \"native
bf70: 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  \" runtime optio
bf80: 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n\n"]....       
bf90: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
bfa0: 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  n false..       
bfb0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
bfd0: 74 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79  t ::test_year $y
bfe0: 65 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ear..           
bff0: 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f       set ::test_
c000: 70 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  platform $platfo
c010: 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  rm..            
c020: 20 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 63      set ::test_c
c030: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 63 6f  onfiguration $co
c040: 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 0d 0a 20  nfiguration.... 
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c060: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
c070: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20   "yes, selected 
c0a0: 28 22 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  (" [expr {$nativ
c0b0: 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a 20  e ? "native/" : 
c0c0: 22 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ""}] \..        
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
c0e0: 72 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  r {[string lengt
c0f0: 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
c100: 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c   ? [appendArgs \
c110: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c120: 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20        $platform 
c130: 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65 61 72 20  /] : ""}] $year 
c140: 2f 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  / $configuration
c150: 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20   ")\n"]....     
c160: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
c170: 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  n true..        
c180: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
c1b0: 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  es\n..          
c1c0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
c1d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
c1e0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
c1f0: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
c200: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
c210: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
c220: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
c230: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
c240: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
c250: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
c260: 72 53 51 4c 69 74 65 52 65 6c 65 61 73 65 73 20  rSQLiteReleases 
c270: 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63  { channel {selec
c280: 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
c290: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
c2a0: 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 70  OTE: Check for p
c2b0: 61 73 74 20 72 65 6c 65 61 73 65 73 20 6f 66 20  ast releases of 
c2c0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
c2d0: 74 65 20 69 6e 20 74 68 65 20 64 69 72 65 63 74  te in the direct
c2e0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
c2f0: 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20     contained in 
c300: 74 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61  the "System.Data
c310: 2e 53 51 4c 69 74 65 22 20 65 6e 76 69 72 6f 6e  .SQLite" environ
c320: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 69  ment variable, i
c330: 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  f..      #      
c340: 20 70 72 65 73 65 6e 74 2e 0d 0a 20 20 20 20 20   present...     
c350: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
c360: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76  nfo exists ::env
c370: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
c380: 69 74 65 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  ite)] && \..    
c390: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
c3a0: 6e 67 74 68 20 24 3a 3a 65 6e 76 28 53 79 73 74  ngth $::env(Syst
c3b0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d  em.Data.SQLite)]
c3c0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
c3d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
c3e0: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
c3f0: 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
c400: 65 64 20 64 69 72 65 63 74 6f 72 79 20 77 68 65  ed directory whe
c410: 72 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  re the necessary
c420: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
c430: 20 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 66 6f 72    components for
c440: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
c450: 69 74 65 20 73 68 6f 75 6c 64 20 62 65 20 66 6f  ite should be fo
c460: 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  und...        #.
c470: 0a 20 20 20 20 20 20 20 20 73 65 74 20 64 69 72  .        set dir
c480: 65 63 74 6f 72 79 20 5b 66 69 6c 65 20 6e 61 74  ectory [file nat
c490: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
c4a0: 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
c4b0: 20 20 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e    $::env(System.
c4c0: 44 61 74 61 2e 53 51 4c 69 74 65 29 20 5b 67 65  Data.SQLite) [ge
c4d0: 74 52 65 6c 65 61 73 65 56 65 72 73 69 6f 6e 5d  tReleaseVersion]
c4e0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  ]]....        tp
c4f0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
c500: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
c510: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
c520: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
c530: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 72 65  m.Data.SQLite re
c540: 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20  lease \"" \..   
c550: 20 20 20 20 20 20 20 20 20 24 64 69 72 65 63 74           $direct
c560: 6f 72 79 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d  ory "\"... "]...
c570: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73  .        if {[is
c580: 52 65 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65  ReleaseAvailable
c590: 20 24 64 69 72 65 63 74 6f 72 79 20 70 6c 61 74   $directory plat
c5a0: 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  form]} then {.. 
c5b0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
c5c0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61  ring length $pla
c5d0: 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65  tform] == 0} the
c5e0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
c5f0: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
c600: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
c610: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
c620: 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b  if {$select && [
c630: 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70 6c  matchMachine $pl
c640: 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
c650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74  .            set
c660: 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63 74 6f   ::build_directo
c670: 72 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 0d  ry $directory...
c680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
c690: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
c6a0: 65 6e 64 41 72 67 73 20 22 79 65 73 2c 20 73 65  endArgs "yes, se
c6b0: 6c 65 63 74 65 64 20 28 22 20 24 70 6c 61 74 66  lected (" $platf
c6c0: 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20  orm ")\n"]....  
c6d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c6e0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20   true..         
c6f0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c700: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
c710: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
c720: 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66  s "yes (" $platf
c730: 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  orm ")\n"]..    
c740: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
c750: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
c760: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
c770: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20  nel no\n....    
c780: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 70 61        foreach pa
c790: 74 68 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 65  th [lsort -decre
c7a0: 61 73 69 6e 67 20 5b 66 69 6c 65 20 6c 69 73 74  asing [file list
c7b0: 20 24 64 69 72 65 63 74 6f 72 79 20 2a 5d 5d 20   $directory *]] 
c7c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
c7d0: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
c7e0: 24 70 61 74 68 5d 20 26 26 20 5b 66 69 6c 65 20  $path] && [file 
c7f0: 69 73 64 69 72 65 63 74 6f 72 79 20 24 70 61 74  isdirectory $pat
c800: 68 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  h]} then {..    
c810: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c820: 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
c830: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
c840: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
c850: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73  checking for Sys
c860: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
c870: 72 65 6c 65 61 73 65 20 5c 22 22 20 5c 0d 0a 20  release \"" \.. 
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 24 70 61 74 68 20 22 5c 22 2e 2e 2e 20 22 5d   $path "\"... "]
c8a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c8b0: 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61 73 65    if {[isRelease
c8c0: 41 76 61 69 6c 61 62 6c 65 20 24 70 61 74 68 20  Available $path 
c8d0: 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20  platform]} then 
c8e0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
c8f0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
c900: 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d  ength $platform]
c910: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 75 6e   set platform un
c940: 6b 6e 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 20  known..         
c950: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
c960: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
c970: 24 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63  $select && [matc
c980: 68 4d 61 63 68 69 6e 65 20 24 70 6c 61 74 66 6f  hMachine $platfo
c990: 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c9b0: 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  et ::build_direc
c9c0: 74 6f 72 79 20 24 70 61 74 68 0d 0a 0d 0a 20 20  tory $path....  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
c9f0: 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 2c  appendArgs "yes,
ca00: 20 73 65 6c 65 63 74 65 64 20 28 22 20 24 70 6c   selected (" $pl
ca10: 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 0d  atform ")\n"]...
ca20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca30: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ca70: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
ca80: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
ca90: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
caa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cab0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
cac0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
cae0: 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d  s $channel no\n.
caf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
cb00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
cb10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
cb20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
cb30: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
cb40: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
cb50: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
cb60: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
cb70: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
cb80: 69 61 62 6c 65 20 5c 22 53 79 73 74 65 6d 2e 44  iable \"System.D
cb90: 61 74 61 2e 53 51 4c 69 74 65 5c 22 20 69 73 20  ata.SQLite\" is 
cba0: 6e 6f 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  not " \..       
cbb0: 20 20 20 20 20 22 73 65 74 2c 20 73 6b 69 70 70       "set, skipp
cbc0: 69 6e 67 20 63 68 65 63 6b 20 66 6f 72 20 72 65  ing check for re
cbd0: 6c 65 61 73 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20  leases...\n"].. 
cbe0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
cbf0: 72 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20  return false..  
cc00: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
cc10: 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 4c   checkForSQLiteL
cc20: 69 62 72 61 72 79 20 7b 20 63 68 61 6e 6e 65 6c  ibrary { channel
cc30: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74   } {..      tput
cc40: 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
cc50: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51   checking for SQ
cc60: 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
cc70: 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20  y... "....      
cc80: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
cc90: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
cca0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
ccb0: 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
ccc0: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
ccd0: 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
cce0: 53 51 4c 69 74 65 56 65 72 73 69 6f 6e 0d 0a 20  SQLiteVersion.. 
ccf0: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
cd00: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
cd10: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
cd20: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
cd30: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
cd40: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
cd50: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
cd60: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
cd70: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
cd80: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
cd90: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
cda0: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
cdb0: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
cdc0: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
cdd0: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
cde0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
cdf0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
ce00: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
ce10: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
ce20: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
ce30: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
ce40: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
ce50: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
ce60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ce70: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
ce80: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
ce90: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
cea0: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
cec0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
ced0: 51 4c 69 74 65 33 20 53 51 4c 69 74 65 53 6f 75  QLite3 SQLiteSou
cee0: 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d  rceId..        }
cef0: 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e   sourceId]} then
cf00: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
cf10: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
cf20: 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20  E: We failed to 
cf30: 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c  query the Fossil
cf40: 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69   source identifi
cf50: 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
cf60: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
cf70: 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e  sourceId unknown
cf80: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
cf90: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
cfa0: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
cfb0: 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  if the returned 
cfc0: 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64  Fossil source id
cfd0: 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c  entifier was nul
cfe0: 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  l.  If..        
cff0: 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65  #       so, make
d000: 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74   it easy to spot
d010: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d020: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
d030: 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65  g length $source
d040: 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  Id] == 0} then {
d050: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
d060: 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20  sourceId null.. 
d070: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
d080: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
d090: 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65 20   NOTE: Yes, the 
d0a0: 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
d0b0: 61 72 79 20 61 70 70 65 61 72 73 20 74 6f 20 62  ary appears to b
d0c0: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  e available...  
d0d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d0e0: 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53   addConstraint S
d0f0: 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20 20 20 20  QLite....       
d100: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
d110: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
d120: 20 28 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22   (" $version " "
d130: 20 24 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22   $sourceId ")\n"
d140: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
d150: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
d160: 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
d170: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
d180: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
d190: 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f  kForSQLiteIntero
d1a0: 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  p { channel } {.
d1b0: 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
d1c0: 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
d1d0: 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20  king for SQLite 
d1e0: 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79  interop assembly
d1f0: 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69  ... "....      i
d200: 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
d210: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
d220: 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
d230: 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
d240: 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
d250: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49  SQLite.SQLite3 I
d260: 6e 74 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20  nteropVersion.. 
d270: 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20       } version] 
d280: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
d290: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
d2a0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
d2b0: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
d2c0: 65 72 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e  ersion was null.
d2d0: 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74    If so, make it
d2e0: 20 65 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23   easy..        #
d2f0: 20 20 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d         to spot..
d300: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
d310: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
d320: 6c 65 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d  length $version]
d330: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
d340: 20 20 20 20 20 20 20 20 20 73 65 74 20 76 65 72           set ver
d350: 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20  sion null..     
d360: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
d370: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
d380: 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75  E: Attempt to qu
d390: 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73  ery the Fossil s
d3a0: 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65 72  ource identifier
d3b0: 20 66 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d   for the SQLite.
d3c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
d3d0: 20 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a   core library...
d3e0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d3f0: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
d400: 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63  .          objec
d410: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
d420: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
d430: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
d440: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
d450: 51 4c 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f  QLite3 InteropSo
d460: 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
d470: 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65  } sourceId]} the
d480: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  n {..          #
d490: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
d4a0: 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f  TE: We failed to
d4b0: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
d4c0: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
d4d0: 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ier...          
d4e0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
d4f0: 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77   sourceId unknow
d500: 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  n..        }....
d510: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
d520: 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
d530: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   if the returned
d540: 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69   Fossil source i
d550: 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75  dentifier was nu
d560: 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20  ll.  If..       
d570: 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b   #       so, mak
d580: 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f  e it easy to spo
d590: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
d5a0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
d5b0: 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63  ng length $sourc
d5c0: 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  eId] == 0} then 
d5d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
d5e0: 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
d5f0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
d600: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d610: 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 65  # NOTE: Yes, the
d620: 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
d630: 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72 73  assembly appears
d640: 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65   to be available
d650: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
d660: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
d670: 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72 6f  int SQLiteIntero
d680: 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  p....        tpu
d690: 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
d6a0: 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20  endArgs "yes (" 
d6b0: 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
d6c0: 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
d6d0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
d6e0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
d6f0: 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
d700: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
d710: 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
d720: 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
d730: 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
d740: 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
d750: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
d760: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d770: 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
d780: 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
d790: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
d7a0: 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
d7b0: 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
d7c0: 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
d7d0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
d7e0: 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
d7f0: 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
d800: 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
d810: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
d820: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
d830: 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
d840: 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  stants..      } 
d850: 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
d860: 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
d870: 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
d880: 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
d890: 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
d8a0: 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
d8b0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
d8c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
d8d0: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
d8e0: 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
d8f0: 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
d900: 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
d910: 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
d920: 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
d930: 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
d940: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
d950: 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
d960: 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66 69  [appendArgs defi
d970: 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65  neConstant.Syste
d980: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20 24  m.Data.SQLite. $
d990: 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
d9a0: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
d9b0: 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
d9c0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d9d0: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
d9e0: 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
d9f0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
da00: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
da10: 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
da20: 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  r\n..      }..  
da30: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
da40: 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d   getDateTimeForm
da50: 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  at {} {..      #
da60: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
da70: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73  This procedure s
da80: 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74 68  imply returns th
da90: 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74 65  e "default" Date
daa0: 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65 64  Time format used
dab0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
dac0: 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69 74  by the test suit
dad0: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
dae0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
daf0: 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f 66  sts ::datetime_f
db00: 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20 20  ormat] && \..   
db10: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
db20: 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69 6d  ength $::datetim
db30: 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20 74  e_format] > 0} t
db40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
db50: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
db60: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 6e  : Return the man
db70: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
db80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 44   value for the D
db90: 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e 0d  ateTime format..
dba0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
dbb0: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64 61      return $::da
dbc0: 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a 20  tetime_format.. 
dbd0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
dbe0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
dbf0: 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e    # NOTE: Return
dc00: 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74 65   an ISO8601 Date
dc10: 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d 70  Time format comp
dc20: 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c 69  atible with SQLi
dc30: 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  te,..        #  
dc40: 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
dc50: 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75 69  .SQLite, and sui
dc60: 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64 2d  table for round-
dc70: 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74 68  tripping with th
dc80: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
dc90: 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61 73     DateTime clas
dca0: 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  s of the framewo
dcb0: 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  rk.  If this val
dcc0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d 0a  ue is changed,..
dcd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
dce0: 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d 61  various tests ma
dcf0: 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  y fail...       
dd00: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
dd10: 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20 48  rn "yyyy-MM-dd H
dd20: 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46 4b  H:mm:ss.FFFFFFFK
dd30: 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  "..      }..    
dd40: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
dd50: 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74 20  numerableToList 
dd60: 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20 7b  { enumerable } {
dd70: 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
dd80: 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  lt [list]....   
dd90: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
dda0: 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62 6c  ength $enumerabl
ddb0: 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75 6d  e] == 0 || $enum
ddc0: 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c 22  erable eq "null"
ddd0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
dde0: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
ddf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
de00: 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
de10: 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24 65  h -alias item $e
de20: 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20 20  numerable {..   
de30: 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
de40: 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20 3e   length $item] >
de50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
de60: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
de70: 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53 74  sult [$item ToSt
de80: 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ring]..        }
de90: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
dea0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
deb0: 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  t..    }.....   
dec0: 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52 65   proc catchAndRe
ded0: 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b 73  turn { script {s
dee0: 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65 7d  tackTrace false}
def0: 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20 7d   {strict true} }
df00: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
df10: 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c 75     # NOTE: Evalu
df20: 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20 70  ate the script p
df30: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
df40: 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20 63  aller in their c
df50: 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20 23  ontext,..      #
df60: 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e 67         capturing
df70: 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c 74   both the result
df80: 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20   and the return 
df90: 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  code...      #..
dfa0: 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 5b        set code [
dfb0: 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31  catch {uplevel 1
dfc0: 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c 74   $script} result
dfd0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
dfe0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64 20      # NOTE: Did 
dff0: 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76 69  the script provi
e000: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
e010: 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20 65  r NOT raise an e
e020: 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d 0a  rror?..      #..
e030: 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69 63        if {$stric
e040: 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30 20  t && $code == 0 
e050: 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20 24  || !$strict && $
e060: 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e 20  code != 1} then 
e070: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
e080: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75        # NOTE: Su
e090: 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20 61  ccess.  Return a
e0a0: 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20 72   list with the r
e0b0: 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74  eturn code and t
e0c0: 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
e0d0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
e0e0: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64  eturn [list $cod
e0f0: 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20  e $result]..    
e100: 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61    } elseif {$sta
e110: 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b 0d  ckTrace} then {.
e120: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e130: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c      # NOTE: Fail
e140: 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65 72  ure.  Our caller
e150: 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73 74   wants a full st
e160: 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61 70  ack trace (if ap
e170: 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20 20  plicable),..    
e180: 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74 75      #       retu
e190: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
e1a0: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 61  he return code a
e1b0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76 65  nd the result ve
e1c0: 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20  rbatim...       
e1d0: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
e1e0: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
e1f0: 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d  result]..      }
e200: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
e210: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
e220: 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f 75  TE: Failure.  Ou
e230: 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e 6f  r caller does no
e240: 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73 74  t want a full st
e250: 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a 20  ack trace (if.. 
e260: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
e270: 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74 75  pplicable), retu
e280: 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20 74  rn a list with t
e290: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c 20  he return code, 
e2a0: 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  the error..     
e2b0: 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65 20     #       code 
e2c0: 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  for the interpre
e2d0: 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72 72  ter, and the err
e2e0: 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74 6f  or message up to
e2f0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
e300: 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65 72        point wher
e310: 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61 63  e the stack trac
e320: 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e 0d  e should start..
e330: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
e340: 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b 73      set index [s
e350: 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20 20  tring first "   
e360: 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20 23  at " $result]; #
e370: 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65 3f   HACK: Reliable?
e380: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  ....        retu
e390: 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20 24  rn [list $code $
e3a0: 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78 70  ::errorCode [exp
e3b0: 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31 20  r {$index != -1 
e3c0: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
e3d0: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 73   [string trim [s
e3e0: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65 73  tring range $res
e3f0: 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20 3a  ult 0 $index]] :
e400: 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20 20   $result}]]..   
e410: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
e420: 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c 65      proc compile
e430: 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20 20  CSharpWith {..  
e440: 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20 6d            text m
e450: 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73 74  emory symbols st
e460: 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72 4e  rict resultsVarN
e470: 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61 6d  ame errorsVarNam
e480: 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20 20  e fileNames..   
e490: 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d 20           args } 
e4a0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
e4b0: 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65 20    # NOTE: Since 
e4c0: 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f 20  we are going to 
e4d0: 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  use this method 
e4e0: 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73 69  name a lot, assi
e4f0: 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20 20  gn it to a..    
e500: 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61 62    #       variab
e510: 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20 20  le first...     
e520: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61 64   #..      set ad
e530: 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73 65  d ReferencedAsse
e540: 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20 20  mblies.Add....  
e550: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
e560: 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65 20  OTE: Create the 
e570: 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  base command to 
e580: 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64 64  evaluate and add
e590: 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73 65   the property se
e5a0: 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23 20  ttings..      # 
e5b0: 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20 61        that are a
e5c0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65  lmost always nee
e5d0: 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20  ded by our unit 
e5e0: 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65 20  tests (i.e. the 
e5f0: 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23 20  System..      # 
e600: 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65 6d        and System
e610: 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
e620: 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
e630: 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
e640: 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c 0d  command [list \.
e650: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 69  .          compi
e660: 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20 24  leCSharp $text $
e670: 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73 20  memory $symbols 
e680: 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73 20  $strict results 
e690: 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20 20  errors \..      
e6a0: 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
e6b0: 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d 2e  dll $add System.
e6c0: 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53 79  Data.dll $add Sy
e6d0: 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f 6e  stem.Transaction
e6e0: 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20 20  s.dll \..       
e6f0: 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e 58     $add System.X
e700: 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  ml.dll]....     
e710: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e720: 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72  : Add all the pr
e730: 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65  ovided file name
e740: 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65  s as assembly re
e750: 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20  ferences...     
e760: 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63   #..      foreac
e770: 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  h fileName $file
e780: 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
e790: 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e 64   lappend command
e7a0: 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72 79   $add [getBinary
e7b0: 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61  FileName $fileNa
e7c0: 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
e7d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
e7e0: 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20 65   NOTE: Add the e
e7f0: 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c 20  xtra arguments, 
e800: 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20 63  if any, to the c
e810: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75 61  ommand to evalua
e820: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
e830: 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64      eval lappend
e840: 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d 0a   command $args..
e850: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e860: 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74   # NOTE: Alias t
e870: 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61  he compiler loca
e880: 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72  l results and er
e890: 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20 74  rors variables t
e8a0: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  o the..      #  
e8b0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61       variable na
e8c0: 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
e8d0: 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
e8e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
e8f0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
e900: 72 65 73 75 6c 74 73 56 61 72 4e 61 6d 65 5d 20  resultsVarName] 
e910: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
e920: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 72 65       upvar 1 $re
e930: 73 75 6c 74 73 56 61 72 4e 61 6d 65 20 72 65 73  sultsVarName res
e940: 75 6c 74 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ults..      }...
e950: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
e960: 6e 67 20 6c 65 6e 67 74 68 20 24 65 72 72 6f 72  ng length $error
e970: 73 56 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  sVarName] > 0} t
e980: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
e990: 70 76 61 72 20 31 20 24 65 72 72 6f 72 73 56 61  pvar 1 $errorsVa
e9a0: 72 4e 61 6d 65 20 65 72 72 6f 72 73 0d 0a 20 20  rName errors..  
e9b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
e9c0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
e9d0: 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 6f 6e  Evaluate the con
e9e0: 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70 69 6c  structed [compil
e9f0: 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61 6e 64  eCSharp] command
ea00: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0d   and return the.
ea10: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72  .      #       r
ea20: 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20 23 0d  esult...      #.
ea30: 0a 20 20 20 20 20 20 65 76 61 6c 20 24 63 6f 6d  .      eval $com
ea40: 6d 61 6e 64 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  mand..    }.....
ea50: 20 20 20 20 70 72 6f 63 20 69 73 4d 65 6d 6f 72      proc isMemor
ea60: 79 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7d  yDb { fileName }
ea70: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
ea80: 20 20 20 23 20 4e 4f 54 45 3a 20 49 73 20 74 68     # NOTE: Is th
ea90: 65 20 73 70 65 63 69 66 69 65 64 20 64 61 74 61  e specified data
eaa0: 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 72  base file name r
eab0: 65 61 6c 6c 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f  eally an in-memo
eac0: 72 79 20 64 61 74 61 62 61 73 65 3f 0d 0a 20 20  ry database?..  
ead0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74      #..      ret
eae0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  urn [expr {$file
eaf0: 4e 61 6d 65 20 65 71 20 22 3a 6d 65 6d 6f 72 79  Name eq ":memory
eb00: 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  :" || \..       
eb10: 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65     [string range
eb20: 20 24 66 69 6c 65 4e 61 6d 65 20 30 20 31 32 5d   $fileName 0 12]
eb30: 20 65 71 20 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72   eq "file::memor
eb40: 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  y:"}]..    }....
eb50: 0a 20 20 20 20 70 72 6f 63 20 69 73 54 61 62 6c  .    proc isTabl
eb60: 65 49 6e 44 62 20 7b 20 6e 61 6d 65 20 7b 76 61  eInDb { name {va
eb70: 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20  rName db} } {.. 
eb80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
eb90: 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74  NOTE: Refer to t
eba0: 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72  he specified var
ebb0: 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62 22  iable (e.g. "db"
ebc0: 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74  ) in the context
ebd0: 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20 23   of our..      #
ebe0: 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20 20         caller.  
ebf0: 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  It contains the 
ec00: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ec10: 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ion handle that 
ec20: 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20 23  will be..      #
ec30: 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20 65         used to e
ec40: 78 65 63 75 74 65 20 74 68 65 20 71 75 65 72 79  xecute the query
ec50: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
ec60: 6e 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ne if the named 
ec70: 74 61 62 6c 65 20 69 73 0d 0a 20 20 20 20 20 20  table is..      
ec80: 23 20 20 20 20 20 20 20 70 72 65 73 65 6e 74 20  #       present 
ec90: 69 6e 20 74 68 61 74 20 64 61 74 61 62 61 73 65  in that database
eca0: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ecb0: 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
ecc0: 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
ecd0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
ece0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  Use the sqlite_m
ecf0: 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20 64  aster table to d
ed00: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
ed10: 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a  named table is..
ed20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 72        #       pr
ed30: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  esent in the dat
ed40: 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  abase...      #.
ed50: 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 7b  .      set sql {
ed60: 0d 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ..        SELECT
ed70: 20 43 4f 55 4e 54 28 2a 29 20 46 52 4f 4d 20 73   COUNT(*) FROM s
ed80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
ed90: 52 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65  RE type = 'table
eda0: 27 20 41 4e 44 20 6e 61 6d 65 20 3d 20 3f 3b 0d  ' AND name = ?;.
edb0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
edc0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
edd0: 45 3a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  E: Return non-ze
ede0: 72 6f 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  ro if the named 
edf0: 74 61 62 6c 65 20 69 73 20 70 72 65 73 65 6e 74  table is present
ee00: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ee10: 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b    return [expr {
ee20: 0d 0a 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65  ..        [sql e
ee30: 78 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20  xecute -execute 
ee40: 73 63 61 6c 61 72 20 24 64 62 20 24 73 71 6c 20  scalar $db $sql 
ee50: 5b 6c 69 73 74 20 70 61 72 61 6d 31 20 53 74 72  [list param1 Str
ee60: 69 6e 67 20 24 6e 61 6d 65 5d 5d 20 3e 20 30 0d  ing $name]] > 0.
ee70: 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 7d  .      }]..    }
ee80: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72  .....    proc tr
ee90: 69 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d  imSql { sql } {.
eea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72  .      return [r
eeb0: 65 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c  egsub -all -- {\
eec0: 73 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d  s+} [string trim
eed0: 20 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20   $sql] " "]..   
eee0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
eef0: 65 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c  executeSql { sql
ef00: 20 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20   {execute none} 
ef10: 7b 66 6f 72 6d 61 74 20 6e 6f 6e 65 7d 20 7b 66  {format none} {f
ef20: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d  ileName ""} } {.
ef30: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
ef40: 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  ng length $fileN
ef50: 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ame] == 0} then 
ef60: 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a 6d  {set fileName :m
ef70: 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20 73  emory:}..      s
ef80: 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d 65  etupDb $fileName
ef90: 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22 20   "" "" "" "" "" 
efa0: 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73  false false fals
efb0: 65 20 66 61 6c 73 65 20 64 62 20 74 72 75 65 0d  e false db true.
efc0: 0a 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a  ...      try {..
efd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
efe0: 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
eff0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  \..            s
f000: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
f010: 75 74 65 20 24 65 78 65 63 75 74 65 20 2d 66 6f  ute $execute -fo
f020: 72 6d 61 74 20 24 66 6f 72 6d 61 74 20 24 64 62  rmat $format $db
f030: 20 24 73 71 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d   $sql]]..      }
f040: 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20 20 20   finally {..    
f050: 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20 24 66      cleanupDb $f
f060: 69 6c 65 4e 61 6d 65 20 64 62 20 66 61 6c 73 65  ileName db false
f070: 20 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20   false false..  
f080: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
f090: 0a 20 20 20 20 70 72 6f 63 20 68 61 73 4e 6f 46  .    proc hasNoF
f0a0: 6c 61 67 73 20 7b 20 76 61 72 4e 61 6d 65 20 6e  lags { varName n
f0b0: 6f 6e 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 75  one } {..      u
f0c0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
f0d0: 66 6c 61 67 73 0d 0a 0d 0a 20 20 20 20 20 20 69  flags....      i
f0e0: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f0f0: 20 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b 0d   flags]} then {.
f100: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
f110: 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  true..      }...
f120: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
f130: 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
f140: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
f150: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
f160: 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rue..      }....
f170: 20 20 20 20 20 20 69 66 20 7b 24 6e 6f 6e 65 20        if {$none 
f180: 26 26 20 24 66 6c 61 67 73 20 65 71 20 22 4e 6f  && $flags eq "No
f190: 6e 65 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ne"} then {..   
f1a0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
f1b0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
f1c0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
f1d0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
f1e0: 72 6f 63 20 67 65 74 43 6f 6e 6e 65 63 74 69 6f  roc getConnectio
f1f0: 6e 46 6c 61 67 73 20 7b 20 66 69 6c 65 4e 61 6d  nFlags { fileNam
f200: 65 20 66 6c 61 67 73 20 7b 71 75 69 65 74 20 66  e flags {quiet f
f210: 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
f220: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
f230: 3a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  : Figure out whi
f240: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
f250: 20 6e 61 6d 65 20 6f 72 20 63 6f 6e 6e 65 63 74   name or connect
f260: 69 6f 6e 20 73 74 72 69 6e 67 20 74 68 65 73 65  ion string these
f270: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
f280: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
f290: 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79 20 61   will actually a
f2a0: 70 70 6c 79 20 74 6f 2e 20 20 54 68 69 73 20 69  pply to.  This i
f2b0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 0d  s not necessary.
f2c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
f2d0: 6e 20 71 75 69 65 74 20 6d 6f 64 65 20 62 65 63  n quiet mode bec
f2e0: 61 75 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d  ause this inform
f2f0: 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ation is only us
f300: 65 64 20 66 6f 72 20 6c 6f 67 67 69 6e 67 0d 0a  ed for logging..
f310: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 6e        #       an
f320: 64 20 72 65 70 6f 72 74 69 6e 67 20 70 75 72 70  d reporting purp
f330: 6f 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  oses...      #..
f340: 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
f350: 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
f360: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
f370: 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 5d  ength $fileName]
f380: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
f390: 20 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61          set data
f3a0: 62 61 73 65 20 5b 61 70 70 65 6e 64 41 72 67 73  base [appendArgs
f3b0: 20 22 66 69 6c 65 20 6e 61 6d 65 20 5c 22 22 20   "file name \"" 
f3c0: 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5d 0d 0a 20  $fileName \"].. 
f3d0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20         } elseif 
f3e0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
f3f0: 64 61 74 61 53 6f 75 72 63 65 5d 20 26 26 20 5c  dataSource] && \
f400: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 21 5b  ..            ![
f410: 61 72 72 61 79 20 65 78 69 73 74 73 20 3a 3a 64  array exists ::d
f420: 61 74 61 53 6f 75 72 63 65 5d 7d 20 74 68 65 6e  ataSource]} then
f430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
f440: 74 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65  t database [appe
f450: 6e 64 41 72 67 73 20 22 64 61 74 61 20 73 6f 75  ndArgs "data sou
f460: 72 63 65 20 5c 22 22 20 24 3a 3a 64 61 74 61 53  rce \"" $::dataS
f470: 6f 75 72 63 65 20 5c 22 5d 0d 0a 20 20 20 20 20  ource \"]..     
f480: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
f490: 20 20 20 20 20 20 20 73 65 74 20 64 61 74 61 62         set datab
f4a0: 61 73 65 20 3c 75 6e 6b 6e 6f 77 6e 3e 0d 0a 20  ase <unknown>.. 
f4b0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f4c0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f4d0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
f4e0: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 6c   (and log) the l
f4f0: 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
f500: 66 6c 61 67 73 20 61 6e 64 20 74 68 65 20 61 73  flags and the as
f510: 73 6f 63 69 61 74 65 64 0d 0a 20 20 20 20 20 20  sociated..      
f520: 23 20 20 20 20 20 20 20 64 61 74 61 20 73 6f 75  #       data sou
f530: 72 63 65 20 6f 72 20 66 69 6c 65 20 6e 61 6d 65  rce or file name
f540: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
f550: 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
f560: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
f570: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
f580: 20 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46   ::no(emitLocalF
f590: 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  lags)] && \..   
f5a0: 20 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f           (![info
f5b0: 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69   exists ::no(emi
f5c0: 74 4c 6f 63 61 6c 46 6c 61 67 73 49 66 4e 6f 6e  tLocalFlagsIfNon
f5d0: 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
f5e0: 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
f5f0: 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
f600: 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
f610: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
f620: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
f630: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
f640: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f          "---- lo
f650: 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  cal connection f
f660: 6c 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61  lags for " $data
f670: 62 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  base \..        
f680: 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b        " are: " [
f690: 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61  expr {![hasNoFla
f6a0: 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d 20  gs flags false] 
f6b0: 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ? \..           
f6c0: 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c     [appendArgs \
f6d0: 22 20 24 66 6c 61 67 73 20 5c 22 5d 20 3a 20 22  " $flags \"] : "
f6e0: 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20  <none>"}] \n].. 
f6f0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
f700: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
f710: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
f720: 20 28 61 6e 64 20 6c 6f 67 29 20 74 68 65 20 73   (and log) the s
f730: 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
f740: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 23   flags...      #
f750: 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71 75  ..      if {!$qu
f760: 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
f770: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
f780: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
f790: 65 63 74 20 69 6e 76 6f 6b 65 20 53 79 73 74 65  ect invoke Syste
f7a0: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
f7b0: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 53  LiteConnection S
f7c0: 68 61 72 65 64 46 6c 61 67 73 0d 0a 20 20 20 20  haredFlags..    
f7d0: 20 20 20 20 7d 20 73 68 61 72 65 64 46 6c 61 67      } sharedFlag
f7e0: 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
f7f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
f800: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
f810: 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
f820: 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
f830: 20 20 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20          (![info 
f840: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
f850: 53 68 61 72 65 64 46 6c 61 67 73 49 66 4e 6f 6e  SharedFlagsIfNon
f860: 65 29 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20  e)] || \..      
f870: 20 20 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f           ![hasNo
f880: 46 6c 61 67 73 20 73 68 61 72 65 64 46 6c 61 67  Flags sharedFlag
f890: 73 20 74 72 75 65 5d 29 7d 20 74 68 65 6e 20 7b  s true])} then {
f8a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
f8b0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
f8c0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f8d0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
f8e0: 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64 20     "---- shared 
f8f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
f900: 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73 65   for " $database
f910: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f920: 20 20 20 20 22 20 61 72 65 3a 20 22 20 5b 65 78      " are: " [ex
f930: 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c 61 67 73  pr {![hasNoFlags
f940: 20 73 68 61 72 65 64 46 6c 61 67 73 20 74 72 75   sharedFlags tru
f950: 65 5d 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  e] ? \..        
f960: 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41          [appendA
f970: 72 67 73 20 5c 22 20 24 73 68 61 72 65 64 46 6c  rgs \" $sharedFl
f980: 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
f990: 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
f9a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
f9b0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
f9c0: 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
f9d0: 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
f9e0: 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
f9f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fa00: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
fa10: 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61  no(emitSharedFla
fa20: 67 73 49 66 55 6e 61 76 61 69 6c 61 62 6c 65 29  gsIfUnavailable)
fa30: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fa40: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
fa50: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
fa60: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
fa80: 2d 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  - shared connect
fa90: 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20  ion flags for " 
faa0: 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20  $database \..   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61               " a
fac0: 72 65 3a 20 3c 75 6e 61 76 61 69 6c 61 62 6c 65  re: <unavailable
fad0: 3e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  >\n"]..         
fae0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
faf0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
fb00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
fb10: 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20   Show (and log) 
fb20: 74 68 65 20 64 65 74 65 63 74 65 64 20 67 6c 6f  the detected glo
fb30: 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  bal connection f
fb40: 6c 61 67 73 2c 20 69 66 20 61 6e 79 2e 0d 0a 20  lags, if any... 
fb50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
fb60: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
fb70: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
fb80: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
fb90: 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
fba0: 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
fbb0: 20 20 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78        (![info ex
fbc0: 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
fbd0: 6f 62 61 6c 46 6c 61 67 73 49 66 4e 6f 6e 65 29  obalFlagsIfNone)
fbe0: 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
fbf0: 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c 61 67       ![hasNoFlag
fc00: 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66  s ::connection_f
fc10: 6c 61 67 73 20 66 61 6c 73 65 5d 29 7d 20 74 68  lags false])} th
fc20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
fc30: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
fc40: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
fc50: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
fc60: 20 20 20 22 2d 2d 2d 2d 20 67 6c 6f 62 61 6c 20     "---- global 
fc70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
fc80: 20 61 72 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20   are: " \..     
fc90: 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b           [expr {
fca0: 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63  ![hasNoFlags ::c
fcb0: 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20  onnection_flags 
fcc0: 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20 20  false] ? \..    
fcd0: 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e            [appen
fce0: 64 41 72 67 73 20 5c 22 20 24 3a 3a 63 6f 6e 6e  dArgs \" $::conn
fcf0: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 22 5d  ection_flags \"]
fd00: 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e   : "<none>"}] \n
fd10: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
fd20: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
fd30: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
fd40: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
fd50: 20 67 6c 6f 62 61 6c 20 28 70 65 72 20 74 65 73   global (per tes
fd60: 74 20 72 75 6e 29 20 63 6f 6e 6e 65 63 74 69 6f  t run) connectio
fd70: 6e 20 66 6c 61 67 73 20 63 75 72 72 65 6e 74 6c  n flags currentl
fd80: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
fd90: 20 73 65 74 2c 20 75 73 65 20 74 68 65 6d 20 6e   set, use them n
fda0: 6f 77 20 28 69 2e 65 2e 20 62 79 20 63 6f 6d 62  ow (i.e. by comb
fdb0: 69 6e 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20  ining them with 
fdc0: 74 68 65 20 6f 6e 65 73 20 66 6f 72 20 74 68 69  the ones for thi
fdd0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
fde0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0d 0a 20   connection)... 
fdf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
fe00: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
fe10: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67  :connection_flag
fe20: 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  s]} then {..    
fe30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
fe40: 20 4e 4f 54 45 3a 20 43 6f 6d 62 69 6e 65 20 61   NOTE: Combine a
fe50: 6e 64 2f 6f 72 20 72 65 70 6c 61 63 65 20 74 68  nd/or replace th
fe60: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  e connection fla
fe70: 67 73 20 61 6e 64 20 74 68 65 6e 20 73 68 6f 77  gs and then show
fe80: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
fe90: 20 20 20 20 20 20 6e 65 77 20 76 61 6c 75 65 2e        new value.
fea0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
feb0: 20 20 20 20 20 73 65 74 20 66 6c 61 67 73 20 5b       set flags [
fec0: 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24 66 6c  combineFlags $fl
fed0: 61 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ags $::connectio
fee0: 6e 5f 66 6c 61 67 73 5d 0d 0a 0d 0a 20 20 20 20  n_flags]....    
fef0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
ff00: 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64   NOTE: Show (and
ff10: 20 6c 6f 67 29 20 74 68 65 20 6e 65 77 20 65 66   log) the new ef
ff20: 66 65 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69  fective connecti
ff30: 6f 6e 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20  on flags...     
ff40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
ff50: 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
ff60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
ff70: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
ff80: 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62 69 6e 65 64  :no(emitCombined
ff90: 46 6c 61 67 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Flags)] && \..  
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 21 5b 69              (![i
ffb0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
ffc0: 65 6d 69 74 43 6f 6d 62 69 6e 65 64 46 6c 61 67  emitCombinedFlag
ffd0: 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
fff0: 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
10000 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
10010 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
10020 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
10030 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
10040 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10050 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 62 69 6e      "---- combin
10060 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c  ed connection fl
10070 61 67 73 20 66 6f 72 20 22 20 24 64 61 74 61 62  ags for " $datab
10080 61 73 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ase \..         
10090 20 20 20 20 20 20 20 22 20 61 72 65 3a 20 22 20         " are: " 
100a0 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46 6c  [expr {![hasNoFl
100b0 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
100c0 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
100d0 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
100e0 73 20 5c 22 20 24 66 6c 61 67 73 20 5c 22 5d 20  s \" $flags \"] 
100f0 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
10100 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10110 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10120 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
10130 6e 20 24 66 6c 61 67 73 0d 0a 20 20 20 20 7d 0d  n $flags..    }.
10140 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
10150 46 6c 61 67 73 50 72 6f 70 65 72 74 79 20 7b 20  FlagsProperty { 
10160 7b 66 6c 61 67 73 20 22 22 7d 20 7b 71 75 69 65  {flags ""} {quie
10170 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20  t false} } {..  
10180 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
10190 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20 77  OTE: Determine w
101a0 68 61 74 20 74 68 65 20 63 6f 6d 62 69 6e 65 64  hat the combined
101b0 20 28 67 6c 6f 62 61 6c 20 61 6e 64 20 6c 6f 63   (global and loc
101c0 61 6c 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  al) connection..
101d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6c        #       fl
101e0 61 67 73 20 73 68 6f 75 6c 64 20 62 65 2c 20 70  ags should be, p
101f0 6f 73 73 69 62 6c 79 20 71 75 69 65 74 6c 79 2e  ossibly quietly.
10200 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10210 20 73 65 74 20 66 6c 61 67 73 20 5b 67 65 74 43   set flags [getC
10220 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 22  onnectionFlags "
10230 22 20 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d  " $flags $quiet]
10240 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
10250 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 6f     # NOTE: If no
10260 20 67 6c 6f 62 61 6c 20 6f 72 20 6c 6f 63 61 6c   global or local
10270 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
10280 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
10290 2c 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  , the..      #  
102a0 20 20 20 20 20 64 65 66 61 75 6c 74 20 63 6f 6e       default con
102b0 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 73 68  nection flags sh
102c0 6f 75 6c 64 20 62 65 20 75 73 65 64 3b 20 74 68  ould be used; th
102d0 65 72 65 66 6f 72 65 2c 20 72 65 74 75 72 6e 0d  erefore, return.
102e0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
102f0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
10300 6e 20 74 68 61 74 20 63 61 73 65 2e 0d 0a 20 20  n that case...  
10310 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
10320 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
10330 24 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68  $flags] == 0} th
10340 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
10350 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
10360 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
10370 20 20 20 23 20 4e 4f 54 45 3a 20 49 6e 20 6f 72     # NOTE: In or
10380 64 65 72 20 74 6f 20 63 68 65 63 6b 20 69 66 20  der to check if 
10390 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  the default conn
103a0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65  ection flags are
103b0 20 62 65 69 6e 67 20 75 73 65 64 0d 0a 20 20 20   being used..   
103c0 20 20 20 23 20 20 20 20 20 20 20 69 74 20 69 73     #       it is
103d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 74   necessary to at
103e0 74 65 6d 70 74 20 61 20 63 6f 6e 76 65 72 73 69  tempt a conversi
103f0 6f 6e 20 74 6f 20 74 68 65 20 61 63 74 75 61 6c  on to the actual
10400 20 65 6e 75 6d 65 72 61 74 65 64 0d 0a 20 20 20   enumerated..   
10410 20 20 20 23 20 20 20 20 20 20 20 74 79 70 65 2e     #       type.
10420 20 20 46 61 69 6c 69 6e 67 20 74 68 61 74 2c 20    Failing that, 
10430 74 68 65 20 63 68 65 63 6b 20 61 67 61 69 6e 73  the check agains
10440 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  t the default va
10450 6c 75 65 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  lue will be..   
10460 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70 70     #       skipp
10470 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ed...      #..  
10480 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
10490 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 65 72  ..        set er
104a0 72 6f 72 20 6e 75 6c 6c 3b 20 23 20 49 47 4e 4f  ror null; # IGNO
104b0 52 45 44 0d 0a 0d 0a 20 20 20 20 20 20 20 20 6f  RED....        o
104c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 55 74 69  bject invoke Uti
104d0 6c 69 74 79 20 54 72 79 50 61 72 73 65 46 6c 61  lity TryParseFla
104e0 67 73 45 6e 75 6d 20 22 22 20 5c 0d 0a 20 20 20  gsEnum "" \..   
104f0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
10500 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
10510 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  teConnectionFlag
10520 73 20 22 22 20 24 66 6c 61 67 73 20 6e 75 6c 6c  s "" $flags null
10530 20 74 72 75 65 20 5c 0d 0a 20 20 20 20 20 20 20   true \..       
10540 20 20 20 20 20 74 72 75 65 20 65 72 72 6f 72 0d       true error.
10550 0a 20 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d  .      } value]}
10560 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10570 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
10580 54 45 3a 20 41 74 74 65 6d 70 74 69 6e 67 20 74  TE: Attempting t
10590 6f 20 70 61 72 73 65 20 74 68 65 20 63 6f 6e 6e  o parse the conn
105a0 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 63 61 75  ection flags cau
105b0 73 65 64 20 61 20 73 63 72 69 70 74 0d 0a 20 20  sed a script..  
105c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65 72        #       er
105d0 72 6f 72 2e 20 20 45 6d 69 74 20 61 20 77 61 72  ror.  Emit a war
105e0 6e 69 6e 67 20 74 6f 20 74 68 65 20 74 65 73 74  ning to the test
105f0 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 63 6f   log file and co
10600 6e 74 69 6e 75 65 0d 0a 20 20 20 20 20 20 20 20  ntinue..        
10610 23 20 20 20 20 20 20 20 75 73 69 6e 67 20 61 6e  #       using an
10620 20 65 6d 74 70 79 20 73 74 72 69 6e 67 20 69 6e   emtpy string in
10630 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20 20 20  stead...        
10640 23 0d 0a 20 20 20 20 20 20 20 20 74 6c 6f 67 20  #..        tlog 
10650 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10660 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
10670 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
10680 20 74 6f 20 70 61 72 73 65 20 63 6f 6e 6e 65 63   to parse connec
10690 74 69 6f 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f  tion flags, erro
106a0 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  r: " \..        
106b0 20 20 20 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20      \n\t $value 
106c0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73  \n]....        s
106d0 65 74 20 76 61 6c 75 65 20 22 22 0d 0a 20 20 20  et value ""..   
106e0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
106f0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
10700 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66  f the combined f
10710 6c 61 67 73 20 73 74 72 69 6e 67 20 63 6f 75 6c  lags string coul
10720 64 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  d not actually b
10730 65 20 63 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20  e converted..   
10740 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
10750 65 20 65 6e 75 6d 65 72 61 74 65 64 20 74 79 70  e enumerated typ
10760 65 20 69 74 20 69 73 20 74 68 65 20 64 65 66 61  e it is the defa
10770 75 6c 74 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  ult value, then 
10780 6a 75 73 74 20 75 73 65 0d 0a 20 20 20 20 20 20  just use..      
10790 23 20 20 20 20 20 20 20 69 74 20 76 65 72 62 61  #       it verba
107a0 74 69 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tim; otherwise, 
107b0 6a 75 73 74 20 72 65 74 75 72 6e 20 61 6e 20 65  just return an e
107c0 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 6e  mpty string.  In
107d0 20 74 68 61 74 0d 0a 20 20 20 20 20 20 23 20 20   that..      #  
107e0 20 20 20 20 20 63 61 73 65 2c 20 74 68 65 20 64       case, the d
107f0 65 66 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f  efault connectio
10800 6e 20 66 6c 61 67 73 20 77 69 6c 6c 20 62 65 20  n flags will be 
10810 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  used...      #..
10820 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
10830 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d  g length $value]
10840 20 3d 3d 20 30 20 7c 7c 20 24 76 61 6c 75 65 20   == 0 || $value 
10850 6e 65 20 22 44 65 66 61 75 6c 74 22 7d 20 74 68  ne "Default"} th
10860 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
10870 0a 20 20 20 20 20 20 20 20 23 20 57 41 52 4e 49  .        # WARNI
10880 4e 47 3a 20 54 68 69 73 20 72 65 74 75 72 6e 73  NG: This returns
10890 20 74 68 65 20 73 74 72 69 6e 67 20 76 61 6c 75   the string valu
108a0 65 20 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65  e of the combine
108b0 64 20 66 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20  d flags, not..  
108c0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
108d0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 20   the enumerated 
108e0 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
108f0 62 79 20 64 65 73 69 67 6e 20 61 6e 64 20 73 68  by design and sh
10900 6f 75 6c 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20  ould not..      
10910 20 20 23 20 20 20 20 20 20 20 20 20 20 62 65 20    #          be 
10920 63 68 61 6e 67 65 64 20 77 69 74 68 6f 75 74 20  changed without 
10930 63 61 72 65 66 75 6c 20 63 6f 6e 73 69 64 65 72  careful consider
10940 61 74 69 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77  ation (e.g. it w
10950 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 23 20  ould..        # 
10960 20 20 20 20 20 20 20 20 20 70 72 65 76 65 6e 74           prevent
10970 20 74 68 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65   the SQLiteConne
10980 63 74 69 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d  ction class from
10990 20 61 6c 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69   allowing invali
109a0 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
109b0 20 20 20 20 20 20 5b 22 6d 61 67 69 63 61 6c 22        ["magical"
109c0 5d 20 6d 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a  ] meta-flags)...
109d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
109e0 20 20 20 72 65 74 75 72 6e 20 5b 61 70 70 65 6e     return [appen
109f0 64 41 72 67 73 20 22 46 6c 61 67 73 3d 22 20 24  dArgs "Flags=" $
10a00 66 6c 61 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20  flags \;]..     
10a10 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
10a20 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
10a30 0a 20 20 20 20 70 72 6f 63 20 65 6e 61 62 6c 65  .    proc enable
10a40 53 68 61 72 65 64 43 61 63 68 65 20 7b 20 63 68  SharedCache { ch
10a50 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20 7b 71 75  annel enable {qu
10a60 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
10a70 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10a80 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
10a90 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
10aa0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
10ab0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
10ac0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
10ad0 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
10ae0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10af0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
10b00 73 68 61 72 65 64 5f 63 61 63 68 65 20 5b 65 78  shared_cache [ex
10b10 70 72 20 69 6e 74 28 24 65 6e 61 62 6c 65 29 5d  pr int($enable)]
10b20 0d 0a 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74  ..      } result
10b30 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
10b40 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
10b50 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
10b60 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
10b70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
10b80 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
10b90 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
10ba0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61  lite3_enable_sha
10bb0 72 65 64 5f 63 61 63 68 65 28 22 20 24 65 6e 61  red_cache(" $ena
10bc0 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ble \..         
10bd0 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b 3a 20 22       ")... ok: "
10be0 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
10bf0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10c00 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
10c10 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
10c20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
10c30 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10c40 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
10c60 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65  - call sqlite3_e
10c70 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
10c80 68 65 28 22 20 24 65 6e 61 62 6c 65 20 5c 0d 0a  he(" $enable \..
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 29                ")
10ca0 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  ... error: " \n\
10cb0 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  t $result \n].. 
10cc0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
10cd0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
10ce0 20 70 72 6f 63 20 73 65 74 75 70 44 62 20 7b 0d   proc setupDb {.
10cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c  .            fil
10d00 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22 22 7d 20  eName {mode ""} 
10d10 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  {dateTimeFormat 
10d20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65 4b 69 6e  ""} {dateTimeKin
10d30 64 20 22 22 7d 20 7b 66 6c 61 67 73 20 22 22 7d  d ""} {flags ""}
10d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 65  ..            {e
10d50 78 74 72 61 20 22 22 7d 20 7b 71 75 61 6c 69 66  xtra ""} {qualif
10d60 79 20 74 72 75 65 7d 20 7b 64 65 6c 65 74 65 20  y true} {delete 
10d70 74 72 75 65 7d 20 7b 75 72 69 20 66 61 6c 73 65  true} {uri false
10d80 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  }..            {
10d90 74 65 6d 70 6f 72 61 72 79 20 74 72 75 65 7d 20  temporary true} 
10da0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 71 75  {varName db} {qu
10db0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
10dc0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10dd0 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 73 65   NOTE: First, se
10de0 65 20 69 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  e if our caller 
10df0 68 61 73 20 72 65 71 75 65 73 74 65 64 20 61 6e  has requested an
10e00 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10e10 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
10e20 20 20 20 20 20 73 65 74 20 69 73 4d 65 6d 6f 72       set isMemor
10e30 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62 20 24 66  y [isMemoryDb $f
10e40 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
10e50 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10e60 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61 6c 6c 20  E: For now, all 
10e70 74 65 73 74 20 64 61 74 61 62 61 73 65 73 20 75  test databases u
10e80 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  sed by the test 
10e90 73 75 69 74 65 20 61 72 65 20 70 6c 61 63 65 64  suite are placed
10ea0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10eb0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
10ec0 65 20 64 69 72 65 63 74 6f 72 79 2e 20 20 45 61  e directory.  Ea
10ed0 63 68 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ch database and 
10ee0 72 65 6c 61 74 65 64 20 66 69 6c 65 73 0d 0a 20  related files.. 
10ef0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
10f00 64 20 62 79 20 61 20 74 65 73 74 20 73 68 6f 75  d by a test shou
10f10 6c 64 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  ld be cleaned up
10f20 20 62 79 20 74 68 61 74 20 74 65 73 74 20 75 73   by that test us
10f30 69 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ing the..      #
10f40 20 20 20 20 20 20 20 22 63 6c 65 61 6e 75 70 44         "cleanupD
10f50 62 22 20 70 72 6f 63 65 64 75 72 65 2c 20 62 65  b" procedure, be
10f60 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  low...      #.. 
10f70 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d       if {!$isMem
10f80 6f 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d  ory && $qualify}
10f90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
10fa0 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66   set fileName [f
10fb0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74  ile join [getDat
10fc0 61 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  abaseDirectory] 
10fd0 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
10fe0 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d  Name]]..      }.
10ff0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11000 20 20 23 20 4e 4f 54 45 3a 20 42 79 20 64 65 66    # NOTE: By def
11010 61 75 6c 74 2c 20 64 65 6c 65 74 65 20 61 6e 79  ault, delete any
11020 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 64 61   pre-existing da
11030 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
11040 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20 20 20 20  same file..     
11050 20 23 20 20 20 20 20 20 20 6e 61 6d 65 20 69 66   #       name if
11060 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 65 78   it currently ex
11070 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
11080 20 20 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65        if {!$isMe
11090 6d 6f 72 79 20 26 26 20 24 64 65 6c 65 74 65 20  mory && $delete 
110a0 26 26 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  && [file exists 
110b0 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
110c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
110d0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
110e0 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
110f0 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e   any pre-existin
11100 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  g database with 
11110 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20  the same file.. 
11120 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e         #       n
11130 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
11140 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
11150 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
11160 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
11170 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
11180 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
11190 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f     # NOTE: We so
111a0 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f 20  mehow failed to 
111b0 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 2c  delete the file,
111c0 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20   report why...  
111d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
111e0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
111f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11200 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
11210 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
11220 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
11230 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
11240 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
11250 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62   to delete datab
11260 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ase file \"" $fi
11270 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
11280 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
11290 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f  ring setup, erro
112a0 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
112b0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
112c0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
112d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
112e0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
112f0 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
11300 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
11310 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
11320 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
11330 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
11340 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
11350 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f 70 65 6e  ndle to the open
11360 65 64 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  ed database will
11370 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
11380 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11390 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
113a0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
113b0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
113c0 53 74 61 72 74 20 62 75 69 6c 64 69 6e 67 20 74  Start building t
113d0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  he connection st
113e0 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ring.  The only 
113f0 72 65 71 75 69 72 65 64 20 70 6f 72 74 69 6f 6e  required portion
11400 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
11410 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
11420 6e 20 73 74 72 69 6e 67 20 69 73 20 74 68 65 20  n string is the 
11430 64 61 74 61 20 73 6f 75 72 63 65 2c 20 77 68 69  data source, whi
11440 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0d  ch contains the.
11450 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
11460 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
11470 65 20 69 74 73 65 6c 66 2e 20 20 49 66 20 6f 75  e itself.  If ou
11480 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74  r caller wants t
11490 6f 20 75 73 65 20 61 20 55 52 49 20 61 73 0d 0a  o use a URI as..
114a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
114b0 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20 75  e data source, u
114c0 73 65 20 74 68 65 20 46 75 6c 6c 55 72 69 20 63  se the FullUri c
114d0 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
114e0 20 70 72 6f 70 65 72 74 79 20 74 6f 0d 0a 20 20   property to..  
114f0 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 76      #       prev
11500 65 6e 74 20 74 68 65 20 64 61 74 61 20 73 6f 75  ent the data sou
11510 72 63 65 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  rce string from 
11520 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64 2e 0d 0a  being mangled...
11530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
11540 66 20 7b 24 75 72 69 7d 20 74 68 65 6e 20 7b 0d  f {$uri} then {.
11550 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e  .        set con
11560 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c 55 72 69  nection {FullUri
11570 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d 0a 20  =${fileName}}.. 
11580 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
11590 20 20 20 20 20 20 20 73 65 74 20 63 6f 6e 6e 65         set conne
115a0 63 74 69 6f 6e 20 7b 44 61 74 61 20 53 6f 75 72  ction {Data Sour
115b0 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d 0d  ce=${fileName}}.
115c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
115d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
115e0 45 3a 20 53 69 6e 63 65 20 74 68 69 73 20 70 72  E: Since this pr
115f0 6f 63 65 64 75 72 65 20 68 61 73 20 6e 6f 20 73  ocedure has no s
11600 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65 64 67 65  pecial knowledge
11610 20 6f 66 20 77 68 61 74 20 74 68 65 20 64 65 66   of what the def
11620 61 75 6c 74 0d 0a 20 20 20 20 20 20 23 20 20 20  ault..      #   
11630 20 20 20 20 73 65 74 74 69 6e 67 20 69 73 20 66      setting is f
11640 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c 50 61 74  or the ToFullPat
11650 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  h connection str
11660 69 6e 67 20 70 72 6f 70 65 72 79 2c 20 61 6c 77  ing propery, alw
11670 61 79 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ays..      #    
11680 20 20 20 61 64 64 20 74 68 65 20 76 61 6c 75 65     add the value
11690 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75 74 20 74   we know about t
116a0 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  o the connection
116b0 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
116c0 23 0d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20  #..      append 
116d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 54 6f 46  connection {;ToF
116e0 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61 6c 69 66  ullPath=${qualif
116f0 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a  y}}....      #..
11700 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
11710 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
11720 69 66 69 65 64 20 61 20 6a 6f 75 72 6e 61 6c 20  ified a journal 
11730 6d 6f 64 65 2c 20 61 64 64 20 74 68 65 20 6e 65  mode, add the ne
11740 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d  cessary portion.
11750 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
11760 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
11770 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20   string now...  
11780 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
11790 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
117a0 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74 68 65 6e  $mode] > 0} then
117b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
117c0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
117d0 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d 24 7b 6d  Journal Mode=${m
117e0 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ode}}..      }..
117f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11800 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
11810 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
11820 20 61 20 44 61 74 65 54 69 6d 65 20 66 6f 72 6d   a DateTime form
11830 61 74 2c 20 61 64 64 20 74 68 65 20 6e 65 63 65  at, add the nece
11840 73 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  ssary..      #  
11850 20 20 20 20 20 70 6f 72 74 69 6f 6e 20 6f 66 20       portion of 
11860 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
11870 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
11880 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
11890 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
118a0 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 5d 20 3e  ateTimeFormat] >
118b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
118c0 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
118d0 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65  ction {;DateTime
118e0 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65 54 69 6d  Format=${dateTim
118f0 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20 20 20 20  eFormat}}..     
11900 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
11910 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
11920 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69  our caller speci
11930 66 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 4b  fied a DateTimeK
11940 69 6e 64 2c 20 61 64 64 20 74 68 65 20 6e 65 63  ind, add the nec
11950 65 73 73 61 72 79 20 70 6f 72 74 69 6f 6e 0d 0a  essary portion..
11960 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66        #       of
11970 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
11980 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20  string now...   
11990 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
119a0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
119b0 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d 20 3e 20  dateTimeKind] > 
119c0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
119d0 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
119e0 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69 6d 65 4b  tion {;DateTimeK
119f0 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d 65 4b 69  ind=${dateTimeKi
11a00 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  nd}}..      }...
11a10 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11a20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
11a30 75 74 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  ut what the fina
11a40 6c 20 66 6c 61 67 73 20 66 6f 72 20 74 68 69 73  l flags for this
11a50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 65 65 64   connection need
11a60 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20 20 20 23   to be...      #
11a70 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67  ..      set flag
11a80 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f 6e  s [getConnection
11a90 46 6c 61 67 73 20 24 66 69 6c 65 4e 61 6d 65 20  Flags $fileName 
11aa0 24 66 6c 61 67 73 20 24 71 75 69 65 74 5d 0d 0a  $flags $quiet]..
11ab0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
11ac0 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75 72 20   # NOTE: If our 
11ad0 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69 65 64  caller specified
11ae0 20 73 6f 6d 65 20 53 51 4c 69 74 65 43 6f 6e 6e   some SQLiteConn
11af0 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20 61 64 64  ectionFlags, add
11b00 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
11b10 20 20 20 20 6e 65 63 65 73 73 61 72 79 20 70 6f      necessary po
11b20 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e  rtion of the con
11b30 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20 6e  nection string n
11b40 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ow...      #..  
11b50 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
11b60 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20 3e  length $flags] >
11b70 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
11b80 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65      append conne
11b90 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73 3d 24 7b  ction {;Flags=${
11ba0 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20 20 20 7d  flags}}..      }
11bb0 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11bc0 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f 75     # NOTE: If ou
11bd0 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66 69  r caller specifi
11be0 65 64 20 61 6e 20 65 78 74 72 61 20 70 61 79 6c  ed an extra payl
11bf0 6f 61 64 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65  oad to the conne
11c00 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20  ction..      #  
11c10 20 20 20 20 20 73 74 72 69 6e 67 2c 20 61 70 70       string, app
11c20 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a 20 20 20  end it now...   
11c30 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
11c40 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
11c50 65 78 74 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e  extra] > 0} then
11c60 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65   {..        appe
11c70 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 3b  nd connection \;
11c80 20 24 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d   $extra..      }
11c90 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
11ca0 20 20 20 23 20 4e 4f 54 45 3a 20 4f 70 65 6e 20     # NOTE: Open 
11cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
11cc0 6e 65 63 74 69 6f 6e 20 6e 6f 77 2c 20 70 6c 61  nection now, pla
11cd0 63 69 6e 67 20 74 68 65 20 6f 70 61 71 75 65 20  cing the opaque 
11ce0 68 61 6e 64 6c 65 20 76 61 6c 75 65 0d 0a 20 20  handle value..  
11cf0 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 74 6f      #       into
11d00 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 73 70   the variable sp
11d10 65 63 69 66 69 65 64 20 62 79 20 6f 75 72 20 63  ecified by our c
11d20 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
11d30 0a 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 73  .      set db [s
11d40 71 6c 20 6f 70 65 6e 20 2d 74 79 70 65 20 53 51  ql open -type SQ
11d50 4c 69 74 65 20 5b 73 75 62 73 74 20 24 63 6f 6e  Lite [subst $con
11d60 6e 65 63 74 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20  nection]]....   
11d70 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
11d80 54 45 3a 20 43 6f 6e 66 69 67 75 72 65 20 74 68  TE: Configure th
11d90 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
11da0 63 74 6f 72 79 20 66 6f 72 20 74 68 65 20 6e 65  ctory for the ne
11db0 77 6c 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62  wly opened datab
11dc0 61 73 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ase..      #    
11dd0 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f     connection no
11de0 77 20 75 6e 6c 65 73 73 20 6f 75 72 20 63 61 6c  w unless our cal
11df0 6c 65 72 20 66 6f 72 62 69 64 73 20 69 74 2e 0d  ler forbids it..
11e00 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
11e10 69 66 20 7b 24 74 65 6d 70 6f 72 61 72 79 20 26  if {$temporary &
11e20 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
11e30 3a 3a 6e 6f 28 73 65 74 54 65 6d 70 6f 72 61 72  ::no(setTemporar
11e40 79 44 69 72 65 63 74 6f 72 79 29 5d 7d 20 74 68  yDirectory)]} th
11e50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 71  en {..        sq
11e60 6c 20 65 78 65 63 75 74 65 20 24 64 62 20 5b 61  l execute $db [a
11e70 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
11e80 20 20 20 20 20 20 20 20 20 22 50 52 41 47 4d 41           "PRAGMA
11e90 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
11ea0 63 74 6f 72 79 20 3d 20 5c 22 22 20 5b 67 65 74  ctory = \"" [get
11eb0 54 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f  TemporaryDirecto
11ec0 72 79 5d 20 5c 22 5c 3b 5d 0d 0a 20 20 20 20 20  ry] \"\;]..     
11ed0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
11ee0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 50 65 72       # NOTE: Per
11ef0 66 6f 72 6d 20 61 6e 79 20 65 78 74 72 61 20 70  form any extra p
11f00 65 72 2d 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 65  er-connection se
11f10 74 75 70 20 66 6f 72 20 74 68 65 20 6e 65 77 6c  tup for the newl
11f20 79 20 6f 70 65 6e 65 64 0d 0a 20 20 20 20 20 20  y opened..      
11f30 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  #       database
11f40 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75 72 20   now unless our 
11f50 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73 20 69  caller forbids i
11f60 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
11f70 20 20 20 73 65 74 20 65 78 65 63 75 74 65 4f 6e     set executeOn
11f80 53 65 74 75 70 20 5b 67 65 74 45 78 65 63 75 74  Setup [getExecut
11f90 65 4f 6e 53 65 74 75 70 5d 0d 0a 0d 0a 20 20 20  eOnSetup]....   
11fa0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
11fb0 65 6e 67 74 68 20 24 65 78 65 63 75 74 65 4f 6e  ength $executeOn
11fc0 53 65 74 75 70 5d 20 3e 20 30 20 26 26 20 5c 0d  Setup] > 0 && \.
11fd0 0a 20 20 20 20 20 20 20 20 20 20 21 5b 69 6e 66  .          ![inf
11fe0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78  o exists ::no(ex
11ff0 65 63 75 74 65 4f 6e 53 65 74 75 70 29 5d 7d 20  ecuteOnSetup)]} 
12000 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12010 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12020 45 3a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  E: This command 
12030 6d 61 79 20 72 61 69 73 65 20 61 6e 20 65 72 72  may raise an err
12040 6f 72 3b 20 69 66 20 73 6f 2c 20 74 68 61 74 20  or; if so, that 
12050 69 73 20 66 69 6e 65 2c 20 61 73 0d 0a 20 20 20  is fine, as..   
12060 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
12070 20 65 6e 63 6c 6f 73 69 6e 67 20 74 65 73 74 20   enclosing test 
12080 77 69 6c 6c 20 74 68 65 6e 20 66 61 69 6c 2e 20  will then fail. 
12090 20 54 68 65 20 5b 73 75 62 73 74 5d 20 63 6f 6d   The [subst] com
120a0 6d 61 6e 64 20 69 73 0d 0a 20 20 20 20 20 20 20  mand is..       
120b0 20 23 20 20 20 20 20 20 20 75 73 65 64 20 6f 6e   #       used on
120c0 20 74 68 65 20 53 51 4c 20 69 6e 20 63 61 73 65   the SQL in case
120d0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 72 65 66   it needs to ref
120e0 65 72 20 74 6f 20 73 74 61 74 65 20 69 6e 20 6f  er to state in o
120f0 75 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ur..        #   
12100 20 20 20 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20      context...  
12110 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12120 20 73 71 6c 20 65 78 65 63 75 74 65 20 24 64 62   sql execute $db
12130 20 5b 73 75 62 73 74 20 24 65 78 65 63 75 74 65   [subst $execute
12140 4f 6e 53 65 74 75 70 5d 0d 0a 20 20 20 20 20 20  OnSetup]..      
12150 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
12160 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 77 61      # NOTE: Alwa
12170 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
12180 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
12190 75 70 6f 6e 20 73 75 63 63 65 73 73 2e 0d 0a 20  upon success... 
121a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
121b0 74 75 72 6e 20 24 64 62 0d 0a 20 20 20 20 7d 0d  turn $db..    }.
121c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
121d0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b  DbConnection { {
121e0 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
121f0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
12200 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
12210 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
12220 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
12230 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
12240 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
12250 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
12260 20 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20    The handle to 
12270 74 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65  the database pre
12280 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76  viously opened v
12290 69 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  ia the..      # 
122a0 20 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20        [setupDb] 
122b0 70 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64  procedure should
122c0 20 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65   be stored there
122d0 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
122e0 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
122f0 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23  me db....      #
12300 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
12310 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
12320 20 41 44 4f 2e 4e 45 54 20 49 44 62 43 6f 6e 6e   ADO.NET IDbConn
12330 65 63 74 69 6f 6e 20 6f 62 6a 65 63 74 20 69 6e  ection object in
12340 73 74 61 6e 63 65 20 66 6f 72 20 74 68 65 0d 0a  stance for the..
12350 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 70        #       sp
12360 65 63 69 66 69 65 64 20 64 61 74 61 62 73 65 20  ecified databse 
12370 68 61 6e 64 6c 65 2e 20 20 53 69 6e 63 65 20 67  handle.  Since g
12380 65 74 74 69 6e 67 20 74 68 69 73 20 6f 62 6a 65  etting this obje
12390 63 74 20 72 65 6c 69 65 73 20 75 70 6f 6e 0d 0a  ct relies upon..
123a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61        #       Ea
123b0 67 6c 65 20 69 6e 74 65 72 6e 61 6c 73 2c 20 67  gle internals, g
123c0 72 65 61 74 20 63 61 72 65 20 73 68 6f 75 6c 64  reat care should
123d0 20 62 65 20 74 61 6b 65 6e 20 74 6f 20 61 76 6f   be taken to avo
123e0 69 64 20 64 69 73 70 6f 73 69 6e 67 20 6f 66 0d  id disposing of.
123f0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
12400 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 6f 74  his object or ot
12410 68 65 72 77 69 73 65 20 70 75 74 74 69 6e 67 20  herwise putting 
12420 69 74 20 69 6e 74 6f 20 61 6e 20 69 6e 76 61 6c  it into an inval
12430 69 64 20 73 74 61 74 65 2e 0d 0a 20 20 20 20 20  id state...     
12440 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
12450 6e 66 6f 20 65 78 69 73 74 73 20 64 62 5d 7d 20  nfo exists db]} 
12460 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12470 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
12480 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
12490 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
124a0 6e 50 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66  nPublic -objectf
124b0 6c 61 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20  lags +NoDispose 
124c0 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20  -alias \..      
124d0 20 20 20 20 20 20 20 20 49 6e 74 65 72 70 72 65          Interpre
124e0 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
124f0 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
12500 64 62 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65  db..        } re
12510 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sult] == 0} then
12520 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
12530 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
12540 45 3a 20 53 75 63 63 65 73 73 2c 20 72 65 74 75  E: Success, retu
12550 72 6e 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62  rn the opaque ob
12560 6a 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  ject handle...  
12570 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
12580 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
12590 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 7d 20 65  ult..        } e
125a0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
125b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
125c0 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c 20 72  NOTE: Failure, r
125d0 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20  eport why...    
125e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
125f0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
12600 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
12610 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
12620 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
12630 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67  ING: failed to g
12640 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  et connection ha
12650 6e 64 6c 65 20 66 6f 72 20 64 61 74 61 62 61 73  ndle for databas
12660 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
12670 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c 20         $db "\", 
12680 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72  error: " \n\t $r
12690 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
126a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
126b0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
126c0 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2c  # NOTE: Failure,
126d0 20 72 65 74 75 72 6e 20 61 6e 20 6f 62 76 69 6f   return an obvio
126e0 75 73 6c 79 20 69 6e 76 61 6c 69 64 20 6f 70 61  usly invalid opa
126f0 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
12700 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
12710 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20     return ""..  
12720 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
12730 20 66 72 65 65 44 62 43 6f 6e 6e 65 63 74 69 6f   freeDbConnectio
12740 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 63 6f 6e  n { {varName con
12750 6e 65 63 74 69 6f 6e 7d 20 7d 20 7b 0d 0a 20 20  nection} } {..  
12760 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12770 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
12780 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
12790 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
127a0 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
127b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
127c0 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61  ontext of our ca
127d0 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61 71 75  ller.  The opaqu
127e0 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20  e object handle 
127f0 66 6f 72 20 61 6e 20 41 44 4f 2e 4e 45 54 0d 0a  for an ADO.NET..
12800 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
12810 6e 6e 65 63 74 69 6f 6e 20 70 72 65 76 69 6f 75  nnection previou
12820 73 6c 79 20 72 65 74 75 72 6e 65 64 20 62 79 20  sly returned by 
12830 5b 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f 6e  [getDbConnection
12840 5d 20 73 68 6f 75 6c 64 20 62 65 0d 0a 20 20 20  ] should be..   
12850 20 20 20 23 20 20 20 20 20 20 20 73 74 6f 72 65     #       store
12860 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20  d there...      
12870 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  #..      upvar 1
12880 20 24 76 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63   $varName connec
12890 74 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  tion....      #.
128a0 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
128b0 74 74 65 6d 70 74 20 74 6f 20 72 65 6d 6f 76 65  ttempt to remove
128c0 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   the opaque obje
128d0 63 74 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  ct handle from t
128e0 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0d 0a  he interpreter..
128f0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f        #       no
12900 77 2e 20 20 54 68 69 73 20 5b 6f 62 6a 65 63 74  w.  This [object
12910 20 64 69 73 70 6f 73 65 5d 20 63 61 6c 6c 20 77   dispose] call w
12920 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
12930 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65 0d   dispose of the.
12940 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
12950 6e 64 65 72 6c 79 69 6e 67 20 6f 62 6a 65 63 74  nderlying object
12960 20 62 65 63 61 75 73 65 20 74 68 65 20 2b 4e 6f   because the +No
12970 44 69 73 70 6f 73 65 20 66 6c 61 67 20 77 61 73  Dispose flag was
12980 20 73 65 74 20 6f 6e 20 69 74 0d 0a 20 20 20 20   set on it..    
12990 20 20 23 20 20 20 20 20 20 20 64 75 72 69 6e 67    #       during
129a0 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
129b0 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68   opaque object h
129c0 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  andle...      #.
129d0 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
129e0 20 65 78 69 73 74 73 20 63 6f 6e 6e 65 63 74 69   exists connecti
129f0 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  on] && \..      
12a00 20 20 20 20 5b 63 61 74 63 68 20 7b 6f 62 6a 65      [catch {obje
12a10 63 74 20 64 69 73 70 6f 73 65 20 24 63 6f 6e 6e  ct dispose $conn
12a20 65 63 74 69 6f 6e 7d 20 65 72 72 6f 72 5d 7d 20  ection} error]} 
12a30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12a40 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
12a50 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20 66 61  E: We somehow fa
12a60 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  iled to remove t
12a70 68 65 20 68 61 6e 64 6c 65 2c 20 72 65 70 6f 72  he handle, repor
12a80 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
12a90 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
12aa0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
12ab0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
12ad0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
12ae0 64 20 74 6f 20 72 65 6d 6f 76 65 20 63 6f 6e 6e  d to remove conn
12af0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 5c 22  ection handle \"
12b00 22 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  " $connection \.
12b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
12b20 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
12b30 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
12b40 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
12b50 20 20 20 70 72 6f 63 20 61 64 64 44 62 43 6f 6e     proc addDbCon
12b60 6e 65 63 74 69 6f 6e 20 7b 20 63 6f 6e 6e 65 63  nection { connec
12b70 74 69 6f 6e 20 7b 76 61 72 4e 61 6d 65 20 64 62  tion {varName db
12b80 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
12b90 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
12ba0 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
12bb0 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
12bc0 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
12bd0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
12be0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
12bf0 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
12c00 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
12c10 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
12c20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
12c30 4f 54 45 3a 20 43 72 65 61 74 65 20 61 20 63 6f  OTE: Create a co
12c40 72 72 65 63 74 6c 79 20 66 6f 72 6d 61 74 74 65  rrectly formatte
12c50 64 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 64  d name for the d
12c60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12c70 6f 6e 20 74 6f 0d 0a 20 20 20 20 20 20 23 20 20  on to..      #  
12c80 20 20 20 20 20 62 65 20 61 64 64 65 64 20 74 6f       be added to
12c90 20 74 68 65 20 6c 69 73 74 20 6d 61 6e 61 67 65   the list manage
12ca0 64 20 62 79 20 74 68 65 20 45 61 67 6c 65 20 69  d by the Eagle i
12cb0 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20  nterpreter...   
12cc0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
12cd0 64 62 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  db [object invok
12ce0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
12cf0 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
12d00 20 45 61 67 6c 65 2e 5f 43 6f 6d 70 6f 6e 65 6e   Eagle._Componen
12d10 74 73 2e 50 72 69 76 61 74 65 2e 46 6f 72 6d 61  ts.Private.Forma
12d20 74 4f 70 73 20 44 61 74 61 62 61 73 65 4f 62 6a  tOps DatabaseObj
12d30 65 63 74 4e 61 6d 65 20 24 63 6f 6e 6e 65 63 74  ectName $connect
12d40 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
12d50 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f   SQLiteConnectio
12d60 6e 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65  n [object invoke
12d70 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
12d80 41 63 74 69 76 65 20 4e 65 78 74 49 64 5d 5d 0d  Active NextId]].
12d90 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
12da0 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68    # NOTE: Add th
12db0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12dc0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 62  ction provided b
12dd0 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 74 6f 20  y our caller to 
12de0 74 68 65 20 6c 69 73 74 0d 0a 20 20 20 20 20 20  the list..      
12df0 23 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  #       of those
12e00 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 20 45 61   known to the Ea
12e10 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
12e20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
12e30 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
12e40 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12e50 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
12e60 41 63 74 69 76 65 2e 63 6f 6e 6e 65 63 74 69 6f  Active.connectio
12e70 6e 73 20 41 64 64 20 5c 0d 0a 20 20 20 20 20 20  ns Add \..      
12e80 20 20 20 20 24 64 62 20 24 63 6f 6e 6e 65 63 74      $db $connect
12e90 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ion..    }..... 
12ea0 20 20 20 70 72 6f 63 20 67 65 74 52 6f 77 73 46     proc getRowsF
12eb0 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b 20 64  romDataTable { d
12ec0 61 74 61 54 61 62 6c 65 20 7d 20 7b 0d 0a 20 20  ataTable } {..  
12ed0 20 20 20 20 73 65 74 20 72 6f 77 73 20 5b 6c 69      set rows [li
12ee0 73 74 5d 0d 0a 20 20 20 20 20 20 73 65 74 20 63  st]..      set c
12ef0 6f 75 6e 74 20 5b 24 64 61 74 61 54 61 62 6c 65  ount [$dataTable
12f00 20 43 6f 6c 75 6d 6e 73 2e 43 6f 75 6e 74 5d 0d   Columns.Count].
12f10 0a 0d 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65  ...      for {se
12f20 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64  t index 0} {$ind
12f30 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e  ex < $count} {in
12f40 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
12f50 20 20 20 20 20 73 65 74 20 64 61 74 61 43 6f 6c       set dataCol
12f60 75 6d 6e 20 5b 24 64 61 74 61 54 61 62 6c 65 20  umn [$dataTable 
12f70 2d 61 6c 69 61 73 20 43 6f 6c 75 6d 6e 73 2e 67  -alias Columns.g
12f80 65 74 5f 49 74 65 6d 20 24 69 6e 64 65 78 5d 0d  et_Item $index].
12f90 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d  .        set nam
12fa0 65 73 28 24 69 6e 64 65 78 29 20 5b 24 64 61 74  es($index) [$dat
12fb0 61 43 6f 6c 75 6d 6e 20 43 6f 6c 75 6d 6e 4e 61  aColumn ColumnNa
12fc0 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  me]..      }....
12fd0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72        object for
12fe0 65 61 63 68 20 2d 61 6c 69 61 73 20 64 61 74 61  each -alias data
12ff0 52 6f 77 20 5b 73 65 74 20 64 61 74 61 52 6f 77  Row [set dataRow
13000 73 20 5b 24 64 61 74 61 54 61 62 6c 65 20 52 6f  s [$dataTable Ro
13010 77 73 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ws]] {..        
13020 73 65 74 20 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a  set row [list]..
13030 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73  ..        for {s
13040 65 74 20 69 6e 64 65 78 20 30 7d 20 7b 24 69 6e  et index 0} {$in
13050 64 65 78 20 3c 20 24 63 6f 75 6e 74 7d 20 7b 69  dex < $count} {i
13060 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20  ncr index} {..  
13070 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c 75          set valu
13080 65 20 5b 24 64 61 74 61 52 6f 77 20 2d 63 72 65  e [$dataRow -cre
13090 61 74 65 20 2d 61 6c 69 61 73 20 67 65 74 5f 49  ate -alias get_I
130a0 74 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20  tem $index].... 
130b0 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74           if {[st
130c0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c  ring length $val
130d0 75 65 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  ue] > 0 && \..  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 6f 62              ![ob
130f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 43 6f 6e 76  ject invoke Conv
13100 65 72 74 20 49 73 44 42 4e 75 6c 6c 20 24 76 61  ert IsDBNull $va
13110 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lue]} then {..  
13120 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
13130 64 20 72 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d  d row [list $nam
13140 65 73 28 24 69 6e 64 65 78 29 20 5b 24 76 61 6c  es($index) [$val
13150 75 65 20 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20  ue ToString]].. 
13160 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
13170 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  {..            l
13180 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73 74  append row [list
13190 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29 5d   $names($index)]
131a0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
131b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
131c0 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73      lappend rows
131d0 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a   $row..      }..
131e0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
131f0 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  rows..    }.....
13200 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77      proc dumpRow
13210 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
13220 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20   channel rows } 
13230 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71  {..      set seq
13240 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20  uence 1....     
13250 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f   foreach row $ro
13260 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  ws {..        tp
13270 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13280 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13290 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
132a0 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22  sequence > 1 ? "
132b0 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d  \n" : ""}] "----
132c0 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63   ROW #" $sequenc
132d0 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e :\n]....      
132e0 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24    foreach pair $
132f0 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  row {..         
13300 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
13310 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20  air] >= 2} then 
13320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
13330 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13340 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a  ppendArgs \t \..
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
13370 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69  air 0]] ": " [li
13380 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
13390 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20   1]] \n]..      
133a0 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
133b0 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d  length $pair] ==
133c0 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
133d0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
133e0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
133f0 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
13400 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
13410 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
13420 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a   ": <null>\n"]..
13430 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
13440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
13450 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
13460 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f  t<empty>\n; # NO
13470 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20  TE: No data?..  
13480 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13490 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
134a0 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20  incr sequence.. 
134b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
134c0 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
134d0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
134e0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
134f0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
13500 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
13530 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
13540 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
13550 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
13560 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
13570 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
13580 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
13590 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
135a0 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
135b0 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
135c0 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
135d0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
135e0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
135f0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
13600 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
13610 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
13620 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
13630 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
13640 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
13650 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
13660 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
13670 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
13680 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
13690 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
136a0 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
136b0 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
136c0 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
136d0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
136e0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
136f0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
13700 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
13710 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
13720 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
13730 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
13740 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
13750 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
13760 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
13770 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
13780 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
13790 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
137a0 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
137b0 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
137c0 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
137d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
137e0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
137f0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
13800 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
13810 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
13820 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
13830 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
13840 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
13850 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
13860 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13870 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
13880 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
13890 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
138a0 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
138b0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
138c0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
138d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
138e0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
138f0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
13900 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
13910 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
13920 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
13930 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
13940 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
13950 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13960 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
13970 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
13980 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
13990 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
139a0 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
139b0 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
139c0 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
139d0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
139e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
139f0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
13a00 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
13a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
13a20 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
13a30 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
13a40 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
13a50 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
13a60 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
13a70 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
13a80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13a90 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
13aa0 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
13ab0 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
13ac0 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
13ad0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
13ae0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
13af0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
13b00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13b10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
13b20 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
13b30 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
13b40 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
13b50 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72 79    if {!$isMemory
13b60 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20 5b   && $delete && [
13b70 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
13b80 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
13b90 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13ba0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
13bb0 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73  deleting databas
13bc0 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62  e files if someb
13bd0 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f  ody sets the glo
13be0 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20 20  bal..        #  
13bf0 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 6f       variable to
13c00 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20   prevent it...  
13c10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
13c30 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70 44  ts ::no(cleanupD
13c40 62 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d  bFile)]} then {.
13c50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
13c60 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
13c70 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
13c80 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
13c90 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
13ca0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13cb0 20 20 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63        if {[set c
13cc0 6f 64 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65  ode [catch {file
13cd0 20 64 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d   delete $fileNam
13ce0 65 7d 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e  e} error]]} then
13cf0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
13d00 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
13d10 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
13d20 77 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  w failed to dele
13d30 74 65 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70  te the file, rep
13d40 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20  ort why...      
13d50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13d60 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
13d70 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
13d80 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
13d90 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
13da0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
13db0 74 6f 20 64 65 6c 65 74 65 20 64 61 74 61 62 61  to delete databa
13dc0 73 65 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  se file \"" $fil
13dd0 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
13de0 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75 72           "\" dur
13df0 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65 72 72  ing cleanup, err
13e00 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
13e10 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
13e20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
13e30 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
13e40 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
13e50 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74 20 77  OTE: Show that w
13e60 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69  e skipped deleti
13e70 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a 20 20  ng the file...  
13e80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13e90 20 20 20 20 20 73 65 74 20 63 6f 64 65 20 30 0d       set code 0.
13ea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  ...          tpu
13eb0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
13ec0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
13ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13ee0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73  "==== WARNING: s
13ef0 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20  kipped deleting 
13f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22  database file \"
13f10 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  " $fileName \.. 
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
13f30 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c   during cleanup\
13f40 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
13f50 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13f60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13f70 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66     # NOTE: The f
13f80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
13f90 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20  st, success!..  
13fa0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13fb0 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20   set code 0..   
13fc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
13fd0 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20  turn $code..    
13fe0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
13ff0 65 74 75 70 44 62 49 6e 74 65 72 72 75 70 74 43  etupDbInterruptC
14000 61 6c 6c 62 61 63 6b 20 7b 20 63 68 61 6e 6e 65  allback { channe
14010 6c 20 6c 6f 67 20 7d 20 7b 0d 0a 20 20 20 20 20  l log } {..     
14020 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
14030 22 2d 2d 2d 2d 20 73 65 74 74 69 6e 67 20 75 70  "---- setting up
14040 20 64 65 62 75 67 67 65 72 20 69 6e 74 65 72 72   debugger interr
14050 75 70 74 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  upt callback... 
14060 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
14070 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
14080 20 73 65 74 20 3a 3a 65 6e 76 28 71 75 69 65 74   set ::env(quiet
14090 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72  SetupInterpreter
140a0 54 65 73 74 50 61 74 68 29 20 31 0d 0a 0d 0a 20  TestPath) 1.... 
140b0 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
140c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
140d0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
140e0 65 20 73 75 72 65 20 74 68 65 20 73 63 72 69 70  e sure the scrip
140f0 74 20 64 65 62 75 67 67 65 72 20 61 6e 64 20 74  t debugger and t
14100 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
14110 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20 20  rpreter..       
14120 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73     #       are s
14130 65 74 75 70 20 61 6e 64 20 72 65 61 64 79 20 66  etup and ready f
14140 6f 72 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 20  or use...       
14150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14160 64 65 62 75 67 20 73 65 74 75 70 20 74 72 75 65  debug setup true
14170 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
14180 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14190 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65  # NOTE: Load the
141a0 20 6e 65 63 65 73 73 61 72 79 20 70 61 63 6b 61   necessary packa
141b0 67 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73 6f  ges into the iso
141c0 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65  lated interprete
141d0 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
141e0 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
141f0 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20   eval {..       
14200 20 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71       package req
14210 75 69 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20  uire Eagle..    
14220 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 20          package 
14230 72 65 71 75 69 72 65 20 45 61 67 6c 65 2e 4c 69  require Eagle.Li
14240 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20  brary..         
14250 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
14260 72 65 20 45 61 67 6c 65 2e 54 65 73 74 0d 0a 20  re Eagle.Test.. 
14270 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14280 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14290 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 70       # NOTE: Cop
142a0 79 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  y the necessary 
142b0 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 74  variables into t
142c0 68 65 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65  he isolated inte
142d0 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20  rpreter...      
142e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
142f0 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
14300 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  set ::test_chann
14310 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e  el $channel; # N
14320 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d  OTE: For [tputs]
14330 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62  ...          deb
14340 75 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20  ug invoke 0 set 
14350 3a 3a 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b  ::test_log $log;
14360 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c   # NOTE: For [tl
14370 6f 67 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  og].....        
14380 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
14390 20 4e 4f 54 45 3a 20 49 6e 73 74 61 6c 6c 20 74   NOTE: Install t
143a0 68 65 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  he callback scri
143b0 70 74 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  pt to be evaluat
143c0 65 64 20 69 6e 20 74 68 65 20 69 73 6f 6c 61 74  ed in the isolat
143d0 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ed..          # 
143e0 20 20 20 20 20 20 69 6e 74 65 72 70 72 65 74 65        interprete
143f0 72 20 77 68 65 6e 20 74 68 69 73 20 69 6e 74 65  r when this inte
14400 72 70 72 65 74 65 72 20 69 73 20 69 6e 74 65 72  rpreter is inter
14410 72 75 70 74 65 64 20 62 79 20 73 63 72 69 70 74  rupted by script
14420 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
14430 20 20 20 20 63 61 6e 63 65 6c 6c 61 74 69 6f 6e      cancellation
14440 2c 20 65 74 63 2e 0d 0a 20 20 20 20 20 20 20 20  , etc...        
14450 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 64    #..          d
14460 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20 61 70  ebug callback ap
14470 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65 7d 20  ply {{sender e} 
14480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
14490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
144a0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
144b0 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  his callback is 
144c0 6f 6e 65 20 74 68 61 74 20 77 65 20 63 61 72 65  one that we care
144d0 20 61 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20   about...       
144e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
144f0 20 20 20 20 69 66 20 7b 22 43 61 6e 63 65 6c 65      if {"Cancele
14500 64 22 20 69 6e 20 5b 73 70 6c 69 74 20 5b 24 65  d" in [split [$e
14510 20 49 6e 74 65 72 72 75 70 74 54 79 70 65 5d 20   InterruptType] 
14520 22 2c 20 22 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ", "]} then {.. 
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
14550 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72 65 20  NOTE: Make sure 
14560 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63 6f 6d  the [object] com
14570 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61 62 6c  mand is availabl
14580 65 2e 20 20 53 69 6e 63 65 0d 0a 20 20 20 20 20  e.  Since..     
14590 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
145a0 20 74 68 69 73 20 69 73 20 61 6e 20 69 73 6f 6c   this is an isol
145b0 61 74 65 64 20 69 6e 74 65 72 70 72 65 74 65 72  ated interpreter
145c0 2c 20 63 68 65 63 6b 20 66 6f 72 20 69 74 20 74  , check for it t
145d0 68 65 20 68 61 72 64 0d 0a 20 20 20 20 20 20 20  he hard..       
145e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
145f0 61 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ay...           
14600 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
14610 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
14620 20 5b 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 73 20   [info commands 
14630 6f 62 6a 65 63 74 5d 5d 20 3e 20 30 7d 20 74 68  object]] > 0} th
14640 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
14650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14660 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
14670 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
14680 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
14690 6e 6e 65 63 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20  nnections known 
146a0 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  to the..        
146b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
146c0 70 61 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  parent interpret
146d0 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er...           
146e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
146f0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
14700 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
14710 69 72 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b  ir [object invok
14720 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
14730 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
14740 20 20 20 20 20 20 20 20 20 20 20 24 65 20 49 6e             $e In
14750 74 65 72 70 72 65 74 65 72 2e 63 6f 6e 6e 65 63  terpreter.connec
14760 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
14770 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
147a0 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e 79 20 53   to cancel any S
147b0 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
147c0 6f 67 72 65 73 73 20 6f 6e 0d 0a 20 20 20 20 20  ogress on..     
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
147e0 20 20 20 20 20 74 68 69 73 20 64 61 74 61 62 61       this databa
147f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a  se connection...
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
14820 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14830 68 20 7b 24 70 61 69 72 20 56 61 6c 75 65 2e 43  h {$pair Value.C
14840 61 6e 63 65 6c 7d 20 65 72 72 6f 72 5d 7d 20 74  ancel} error]} t
14850 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14860 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
14870 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
14880 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 6e 20   [appendArgs \n 
14890 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
148a0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
148b0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
148c0 20 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79   to cancel query
148d0 20 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20   for " \..      
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 22    "connection \"
14900 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22 5c  " [$pair Key] "\
14910 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  ", error: " \n\t
14920 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
14930 20 20 20 20 20 20 20 20 20 20 20 20 24 65 72 72              $err
14940 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
14950 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
14980 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
14990 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
149a0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
149b0 70 70 65 6e 64 41 72 67 73 20 5c 6e 20 5c 0d 0a  ppendArgs \n \..
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
149e0 47 3a 20 63 61 6e 6e 6f 74 20 63 61 6e 63 65 6c  G: cannot cancel
149f0 20 61 6e 79 20 71 75 65 72 69 65 73 3a 20 22 20   any queries: " 
14a00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14a10 20 20 20 20 20 20 20 22 74 68 65 20 5c 22 6f 62         "the \"ob
14a20 6a 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 69  ject\" command i
14a30 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 5c  s not available\
14a40 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
14a50 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14a60 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
14a70 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  }..        } fin
14a80 61 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  ally {..        
14a90 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20 3a    catch {unset :
14aa0 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49  :env(quietSetupI
14ab0 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
14ac0 74 68 29 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  th)}..        }.
14ad0 0a 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 20  .      } error] 
14ae0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14af0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
14b00 69 6e 74 20 69 6e 74 65 72 72 75 70 74 43 61 6c  int interruptCal
14b10 6c 62 61 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d  lback.sqlite3...
14b20 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
14b30 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20  channel yes\n.. 
14b40 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
14b50 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
14b60 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
14b70 73 20 22 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20  s "no, error: " 
14b80 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
14b90 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
14ba0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65  ....    proc cle
14bb0 61 6e 75 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e  anupFile { fileN
14bc0 61 6d 65 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  ame {collect tru
14bd0 65 7d 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d  e} {force false}
14be0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
14bf0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74       # NOTE: Att
14c00 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c  empt to force al
14c10 6c 20 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61  l pending "garba
14c20 67 65 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62  ge" objects to b
14c30 65 20 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20  e collected,..  
14c40 20 20 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c      #       incl
14c50 75 64 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61  uding SQLite sta
14c60 74 65 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b  tements and back
14c70 75 70 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73  up objects; this
14c80 20 73 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20   should allow.. 
14c90 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
14ca0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
14cb0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20  base file to be 
14cc0 64 65 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20  deleted...      
14cd0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f  #..      if {$co
14ce0 6c 6c 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  llect} then {.. 
14cf0 20 20 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61         collectGa
14d00 72 62 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68  rbage $::test_ch
14d10 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a  annel..      }..
14d20 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
14d30 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
14d40 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c  f the file still
14d50 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
14d60 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  #..      if {[fi
14d70 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
14d80 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
14d90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
14da0 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65   # NOTE: Skip de
14db0 6c 65 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65  leting test file
14dc0 73 20 69 66 20 73 6f 6d 65 62 6f 64 79 20 73 65  s if somebody se
14dd0 74 73 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61  ts the global va
14de0 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  riable..        
14df0 23 20 20 20 20 20 20 20 74 6f 20 70 72 65 76 65  #       to preve
14e00 6e 74 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  nt it...        
14e10 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
14e20 66 6f 72 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20  force || ![info 
14e30 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61  exists ::no(clea
14e40 6e 75 70 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20  nupFile)]} then 
14e50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
14e60 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14e70 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
14e80 65 74 65 20 74 68 65 20 74 65 73 74 20 66 69 6c  ete the test fil
14e90 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  e now...        
14ea0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
14eb0 66 20 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61  f {[set code [ca
14ec0 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65  tch {file delete
14ed0 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f   $fileName} erro
14ee0 72 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  r]]} then {..   
14ef0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14f00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
14f10 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
14f20 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
14f30 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
14f40 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
14f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
14f60 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
14f70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
14f80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14f90 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
14fa0 3a 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  : failed to dele
14fb0 74 65 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22  te test file \""
14fc0 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
14fe0 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
14ff0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
15000 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20  $error \n]..    
15010 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
15020 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
15030 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15040 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74    # NOTE: Show t
15050 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20 64  hat we skipped d
15060 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65  eleting the file
15070 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
15080 20 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f            set co
15090 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  de 0....        
150a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
150b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
150c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
150d0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
150e0 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65 6c 65  NG: skipped dele
150f0 74 69 6e 67 20 74 65 73 74 20 66 69 6c 65 20 5c  ting test file \
15100 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
15120 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
15130 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
15140 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
15150 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15160 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20      # NOTE: The 
15170 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
15180 69 73 74 2c 20 73 75 63 63 65 73 73 21 0d 0a 20  ist, success!.. 
15190 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
151a0 20 20 73 65 74 20 63 6f 64 65 20 30 0d 0a 20 20    set code 0..  
151b0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
151c0 65 74 75 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20  eturn $code..   
151d0 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
151e0 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 7b  collectGarbage {
151f0 20 63 68 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73   channel {millis
15200 65 63 6f 6e 64 73 20 31 30 30 30 7d 20 7b 71 75  econds 1000} {qu
15210 69 65 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20  iet true} } {.. 
15220 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
15230 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
15240 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
15250 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
15260 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
15270 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
15280 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
15290 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73  e..        } res
152a0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
152b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
152c0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
152d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
152e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
152f0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15300 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
15310 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  - memory in use 
15320 62 79 20 74 68 65 20 43 4c 52 20 62 65 66 6f 72  by the CLR befor
15330 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20  e collection... 
15340 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
15350 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62       $result " b
15360 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
15370 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
15380 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
15390 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
153a0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
153b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
153c0 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
153d0 69 6c 65 64 20 74 6f 20 67 65 74 20 43 4c 52 20  iled to get CLR 
153e0 6d 65 6d 6f 72 79 20 75 73 61 67 65 2c 20 65 72  memory usage, er
153f0 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ror: " \..      
15400 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
15410 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
15420 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
15430 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23 23        ##########
15440 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15460 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
15480 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
15490 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 65 61 74    # NOTE: Repeat
154a0 65 64 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  edly attempt to 
154b0 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65 20  collect garbage 
154c0 75 6e 74 69 6c 20 74 68 65 20 61 6c 6c 6f 74 74  until the allott
154d0 65 64 20 6e 75 6d 62 65 72 0d 0a 20 20 20 20 20  ed number..     
154e0 20 23 20 20 20 20 20 20 20 6f 66 20 6d 69 6c 6c   #       of mill
154f0 69 73 65 63 6f 6e 64 73 20 68 61 73 20 65 6c 61  iseconds has ela
15500 70 73 65 64 2e 20 20 41 6c 77 61 79 73 20 61 74  psed.  Always at
15510 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74  tempt to collect
15520 20 67 61 72 62 61 67 65 0d 0a 20 20 20 20 20 20   garbage..      
15530 23 20 20 20 20 20 20 20 61 74 20 6c 65 61 73 74  #       at least
15540 20 6f 6e 63 65 2e 0d 0a 20 20 20 20 20 20 23 0d   once...      #.
15550 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
15560 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
15570 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
15580 20 20 20 20 20 20 73 65 74 20 73 74 61 72 74 20        set start 
15590 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 0d  [clock seconds].
155a0 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 74 6f  .        set sto
155b0 70 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20  p [expr {$start 
155c0 2b 20 28 24 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  + ($milliseconds
155d0 20 2f 20 31 30 30 30 29 7d 5d 0d 0a 0d 0a 20 20   / 1000)}]....  
155e0 20 20 20 20 20 20 64 6f 20 7b 0d 0a 20 20 20 20        do {..    
155f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15600 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
15610 70 74 20 74 6f 20 66 6f 72 63 65 20 61 20 66 75  pt to force a fu
15620 6c 6c 20 67 61 72 62 61 67 65 20 63 6f 6c 6c 65  ll garbage colle
15630 63 74 69 6f 6e 20 6e 6f 77 2e 20 20 52 65 70 6f  ction now.  Repo
15640 72 74 20 61 6e 79 0d 0a 20 20 20 20 20 20 20 20  rt any..        
15650 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72 20    #       error 
15660 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  that is encounte
15670 72 65 64 20 69 66 20 77 65 20 66 61 69 6c 2e 0d  red if we fail..
15680 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
15690 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
156a0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
156b0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
156c0 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
156d0 79 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  y true..        
156e0 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
156f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15700 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
15710 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
15730 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
15740 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65  led full garbage
15750 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72   collection, err
15760 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
15770 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65           \n\t $e
15780 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
15790 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
157a0 20 20 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63     set now [cloc
157b0 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20  k seconds]..    
157c0 20 20 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74      } while {$st
157d0 61 72 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24  art <= $now && $
157e0 6e 6f 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20  now < $stop}..  
157f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
15800 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15810 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15830 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
15840 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
15850 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74    if {[haveSQLit
15860 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d  eObjectCommand]}
15870 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15880 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
15890 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
158a0 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74  invoke GC GetTot
158b0 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a  alMemory false..
158c0 20 20 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74          } result
158d0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
158e0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
158f0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
15900 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15910 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
15920 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
15930 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d           "---- m
15940 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
15950 74 68 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f  the CLR after co
15960 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d  llection... " \.
15970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15980 20 24 72 65 73 75 6c 74 20 22 20 62 79 74 65 73   $result " bytes
15990 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
159a0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
159b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  e {..          t
159c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
159d0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
159e0 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
159f0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
15a00 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f   to get CLR memo
15a10 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72 3a  ry usage, error:
15a20 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
15a30 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
15a40 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
15a50 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
15a60 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
15a70 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
15a80 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  ts { channel {qu
15a90 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
15aa0 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
15ab0 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
15ac0 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
15ad0 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
15ae0 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e  & [haveConstrain
15af0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
15b00 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e     defineConstan
15b10 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
15b20 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c  Lite.COUNT_HANDL
15b30 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  E]} then {..    
15b40 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15b50 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20   NOTE: Add each 
15b60 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
15b70 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73  count to the res
15b80 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20  ulting list...  
15b90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
15ba0 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c   foreach name [l
15bb0 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f  ist connectionCo
15bc0 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75  unt statementCou
15bd0 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20  nt backupCount] 
15be0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
15bf0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
15c00 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
15c10 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
15c20 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
15c30 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
15c40 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
15c50 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
15c60 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20   $name..        
15c70 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d 20 30 7d    } value] == 0}
15c80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
15c90 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
15ca0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15cb0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
15cc0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
15cd0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
15ce0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 72          "---- cr
15cf0 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f  itical handle co
15d00 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c  unt \"" $name "\
15d10 22 20 69 73 20 22 20 24 76 61 6c 75 65 20 5c 6e  " is " $value \n
15d20 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
15d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15d40 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 24  lappend result $
15d50 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 20  value..         
15d60 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
15d70 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
15d80 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15d90 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
15da0 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
15db0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
15dc0 74 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c  t critical handl
15dd0 65 20 63 6f 75 6e 74 20 5c 22 22 20 5c 0d 0a 20  e count \"" \.. 
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
15df0 6e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  name "\", error:
15e00 20 22 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c   " \n\t $value \
15e10 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  n]..          }.
15e20 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15e30 20 20 7d 20 65 6c 73 65 69 66 20 7b 21 24 71 75    } elseif {!$qu
15e40 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
15e50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15e60 23 20 4e 4f 54 45 3a 20 54 68 65 20 61 63 74 75  # NOTE: The actu
15e70 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73  al handle counts
15e80 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
15e90 6c 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6a  le; therefore, j
15ea0 75 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ust..        #  
15eb0 20 20 20 20 20 72 65 74 75 72 6e 20 61 6e 20 65       return an e
15ec0 6d 70 74 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20  mpty list...    
15ed0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
15ee0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
15ef0 2d 2d 2d 20 63 72 69 74 69 63 61 6c 20 68 61 6e  --- critical han
15f00 64 6c 65 20 63 6f 75 6e 74 73 20 75 6e 61 76 61  dle counts unava
15f10 69 6c 61 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20  ilable\n"..     
15f20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
15f30 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
15f40 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
15f50 68 75 74 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20  hutdownSQLite { 
15f60 63 68 61 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66  channel {force f
15f70 61 6c 73 65 7d 20 7b 71 75 69 65 74 20 66 61 6c  alse} {quiet fal
15f80 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
15f90 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
15fa0 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 53  Make sure that S
15fb0 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61  QLite core libra
15fc0 72 79 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ry is completely
15fd0 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73   shutdown.  This
15fe0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
15ff0 69 73 20 75 73 65 64 20 62 79 20 74 65 73 74 73  is used by tests
16000 20 74 68 61 74 20 63 68 61 6e 67 65 20 63 6f 6e   that change con
16010 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
16020 6e 73 20 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d  ns and/or those.
16030 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
16040 68 61 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  hat need to make
16050 20 73 75 72 65 20 6c 6f 67 67 69 6e 67 20 69 73   sure logging is
16060 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 28 69 2e   initialized (i.
16070 65 2e 20 6a 75 73 74 20 69 6e 20 63 61 73 65 0d  e. just in case.
16080 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
16090 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
160a0 69 62 72 61 72 79 20 77 61 73 20 69 6e 69 74 69  ibrary was initi
160b0 61 6c 69 7a 65 64 20 69 6e 20 74 68 65 20 70 72  alized in the pr
160c0 6f 63 65 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a  ocess prior to..
160d0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
160e0 65 20 53 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73  e SQLiteLog clas
160f0 73 20 62 65 69 6e 67 20 61 62 6c 65 20 74 6f 20  s being able to 
16100 73 65 74 75 70 20 69 74 73 20 6c 6f 67 67 69 6e  setup its loggin
16110 67 20 63 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20  g callback)...  
16120 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f 72 6d      #       Norm
16130 61 6c 6c 79 2c 20 74 68 69 73 20 73 68 6f 75 6c  ally, this shoul
16140 64 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  d only be perfor
16150 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69 73  med if SQLite is
16160 20 6c 6f 61 64 65 64 20 61 6e 64 0d 0a 20 20 20   loaded and..   
16170 20 20 20 23 20 20 20 20 20 20 20 72 65 61 64 79     #       ready
16180 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
16190 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20  test suite...   
161a0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
161b0 24 66 6f 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c  $force || [isSQL
161c0 69 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20  iteReady]} then 
161d0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
161e0 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20        # BUGFIX: 
161f0 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  Make sure that a
16200 6e 79 20 22 6c 65 61 6b 65 64 22 20 74 72 61 6e  ny "leaked" tran
16210 73 61 63 74 69 6f 6e 73 20 61 6e 64 2f 6f 72 20  sactions and/or 
16220 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
16230 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 61       #         a
16240 72 65 20 63 6c 65 61 6e 65 64 20 75 70 20 62 65  re cleaned up be
16250 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65  fore calling the
16260 20 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e   native shutdown
16270 20 66 75 6e 63 74 69 6f 6e 2e 0d 0a 20 20 20 20   function...    
16280 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66      #..        f
16290 6f 72 65 61 63 68 20 74 72 61 6e 73 61 63 74 69  oreach transacti
162a0 6f 6e 20 5b 69 6e 66 6f 20 74 72 61 6e 73 61 63  on [info transac
162b0 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20  tions] {..      
162c0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
162d0 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20 20  match \..       
162e0 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44 61         System#Da
162f0 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74 65  ta#SQLite#SQLite
16300 54 72 61 6e 73 61 63 74 69 6f 6e 23 2a 20 24 74  Transaction#* $t
16310 72 61 6e 73 61 63 74 69 6f 6e 5d 7d 20 74 68 65  ransaction]} the
16320 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
16330 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
16350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
16360 6c 62 61 63 6b 20 24 74 72 61 6e 73 61 63 74 69  lback $transacti
16370 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
16380 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74  } error] == 0} t
16390 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
163a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
163b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
163c0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
163d0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
163e0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
163f0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
16400 2d 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6c 65  - rolled back le
16410 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  aked transaction
16420 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
16430 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61              $tra
16440 6e 73 61 63 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  nsaction \"\n]..
16450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
16460 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
16470 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
16480 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
16490 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
164a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
164b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
164c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
164d0 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
164e0 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
164f0 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 65  d to rollback le
16500 61 6b 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  aked transaction
16510 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
16520 20 20 20 20 20 20 20 20 20 20 20 20 24 74 72 61              $tra
16530 6e 73 61 63 74 69 6f 6e 20 22 5c 22 2c 20 65 72  nsaction "\", er
16540 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
16550 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
16560 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16570 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
16580 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
16590 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
165a0 68 20 64 62 20 5b 69 6e 66 6f 20 63 6f 6e 6e 65  h db [info conne
165b0 63 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20 20 20  ctions] {..     
165c0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
165d0 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20 20 20 20   match \..      
165e0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 23 44          System#D
165f0 61 74 61 23 53 51 4c 69 74 65 23 53 51 4c 69 74  ata#SQLite#SQLit
16600 65 43 6f 6e 6e 65 63 74 69 6f 6e 23 2a 20 24 64  eConnection#* $d
16610 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  b]} then {..    
16620 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
16630 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20 24 64  ch {sql close $d
16640 62 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20  b} error] == 0} 
16650 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16660 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
16670 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
16680 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
16690 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
166a0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
166c0 2d 2d 20 63 6c 6f 73 65 64 20 6c 65 61 6b 65 64  -- closed leaked
166d0 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64   database \"" $d
166e0 62 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  b \"\n]..       
166f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
16700 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16720 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16730 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
16740 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
16750 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
16760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16770 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
16780 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 6c  NG: failed to cl
16790 6f 73 65 20 6c 65 61 6b 65 64 20 64 61 74 61 62  ose leaked datab
167a0 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ase \"" \..     
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
167c0 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22  db "\", error: "
167d0 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d   \n\t $error \n]
167e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
16800 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
16810 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16820 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16830 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65 20   BUGFIX: Before 
16840 63 61 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69  calling the nati
16850 76 65 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63  ve shutdown func
16860 74 69 6f 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  tion, make sure 
16870 62 6f 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20  both..        # 
16880 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 50          of the P
16890 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69  RAGMA related di
168a0 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72  rectory names ar
168b0 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20  e freed...      
168c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65    #..        che
168d0 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63  ckForSQLiteDirec
168e0 74 6f 72 69 65 73 20 24 63 68 61 6e 6e 65 6c 20  tories $channel 
168f0 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  true....        
16900 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
16910 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
16920 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
16930 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
16940 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
16950 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
16960 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
16970 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
16980 0d 0a 20 20 20 20 20 20 20 20 7d 20 72 65 73 75  ..        } resu
16990 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
169a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
169b0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
169c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
169d0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
169e0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
169f0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
16a00 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68   call sqlite3_sh
16a10 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f 6b 3a 20  utdown()... ok: 
16a20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20  " $result \n].. 
16a30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16a40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
16a50 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
16a60 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
16a70 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
16a80 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
16a90 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
16aa0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
16ab0 6c 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  l sqlite3_shutdo
16ac0 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22  wn()... error: "
16ad0 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
16ae0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
16af0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
16b00 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
16b10 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c    proc reportSQL
16b20 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a  iteResources {..
16b30 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
16b40 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
16b50 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b  } {reset true} {
16b60 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
16b70 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
16b80 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 61 76 61    # NOTE: If ava
16b90 69 6c 61 62 6c 65 2c 20 72 65 70 6f 72 74 20 6f  ilable, report o
16ba0 6e 20 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  n (and possibly 
16bb0 72 65 73 65 74 29 20 74 68 65 20 72 75 6e 74 69  reset) the runti
16bc0 6d 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  me..      #     
16bd0 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
16be0 73 74 61 74 69 73 74 69 63 73 2e 0d 0a 20 20 20  statistics...   
16bf0 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
16c00 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63  [haveSQLiteObjec
16c10 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20 5c 0d 0a  tCommand] && \..
16c20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65 43            [haveC
16c30 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
16c40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
16c50 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  ug] && [catch {.
16c60 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
16c70 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
16c80 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
16c90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
16ca0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
16cb0 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
16cc0 74 68 6f 64 73 20 73 65 74 74 69 6e 67 52 65 61  thods settingRea
16cd0 64 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 7d  dCounts..      }
16ce0 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e   settingReadCoun
16cf0 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ts] == 0} then {
16d00 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e 61  ..        set na
16d10 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69 6e  meCount [$settin
16d20 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75 6e  gReadCounts Coun
16d30 74 5d 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  t]..        set 
16d40 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a  valueCount 0....
16d50 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
16d60 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61  oreach -alias pa
16d70 69 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43  ir $settingReadC
16d80 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20  ounts {..       
16d90 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f 75     incr valueCou
16da0 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d  nt [$pair Value]
16db0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
16dc0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
16dd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
16de0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
16df0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
16e10 2d 2d 20 73 65 74 74 69 6e 67 20 5c 22 22 20 5b  -- setting \"" [
16e20 24 70 61 69 72 20 4b 65 79 5d 20 22 5c 22 20 77  $pair Key] "\" w
16e30 61 73 20 72 65 61 64 20 22 20 5c 0d 0a 20 20 20  as read " \..   
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70               [$p
16e50 61 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d  air Value] " tim
16e60 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
16e70 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
16e80 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 72  ..        if {$r
16e90 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  eset} then {..  
16ea0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
16eb0 63 68 20 7b 24 73 65 74 74 69 6e 67 52 65 61 64  ch {$settingRead
16ec0 43 6f 75 6e 74 73 20 43 6c 65 61 72 7d 20 65 72  Counts Clear} er
16ed0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
16ee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
16ef0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
16f00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16f10 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
16f20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 20 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65    "---- reset se
16f50 74 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73  tting statistics
16f60 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
16f70 73 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  s " \..         
16f80 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f           $nameCo
16f90 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
16fa0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20  " $valueCount " 
16fb0 76 61 6c 75 65 73 20 72 65 61 64 5c 6e 22 5d 0d  values read\n"].
16fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
16fd0 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
16fe0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
16ff0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
17000 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
17020 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
17030 6c 65 64 20 74 6f 20 72 65 73 65 74 20 73 65 74  led to reset set
17040 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20  ting statistics 
17050 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  for " \..       
17060 20 20 20 20 20 20 20 20 20 22 74 68 65 20 70 72           "the pr
17070 65 76 69 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f  evious " $nameCo
17080 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
17090 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d  " $valueCount \.
170a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
170b0 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c 20   " values read, 
170c0 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65  error: " \n\t $e
170d0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
170e0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
170f0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17100 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
17110 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
17120 20 26 26 20 5b 68 61 76 65 43 6f 6e 73 74 72 61   && [haveConstra
17130 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
17140 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
17150 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
17160 53 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 56  SQLite.INTEROP_V
17170 49 52 54 55 41 4c 5f 54 41 42 4c 45 5d 20 26 26  IRTUAL_TABLE] &&
17180 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 68   \..          [h
17190 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5c 0d  aveConstraint \.
171a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
171b0 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79  efineConstant.Sy
171c0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
171d0 2e 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59  .TRACK_MEMORY_BY
171e0 54 45 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  TES]} then {..  
171f0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
17200 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
17210 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
17220 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e  nel "---- curren
17230 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  t memory in use 
17240 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e  by SQLiteMemory.
17250 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d  .. "..        }.
17260 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
17270 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
17280 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
17290 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
172a0 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
172b0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
172c0 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d  SQLite.SQLiteMem
172d0 6f 72 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74  ory bytesAllocat
172e0 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65  ed..        } me
172f0 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
17300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
17310 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
17320 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
17330 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
17340 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
17350 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
17360 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17370 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
17380 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
17390 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
173a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
173b0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
173c0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
173d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
173e0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
173f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17400 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
17410 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
17420 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17430 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
17440 20 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d   "---- maximum m
17450 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
17460 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20  SQLiteMemory... 
17470 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  "..        }....
17480 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
17490 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
174a0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
174b0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
174c0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
174d0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
174e0 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79  ite.SQLiteMemory
174f0 20 6d 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c   maximumBytesAll
17500 6f 63 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20  ocated..        
17510 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20  } memory] == 0} 
17520 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
17530 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
17540 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
17550 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
17560 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
17570 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
17580 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
17590 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
175a0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
175b0 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a  memory unknown..
175c0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
175d0 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
175e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
175f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17600 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
17610 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
17620 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
17630 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
17640 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
17650 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
17660 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
17670 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
17680 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e  n use by SQLite.
17690 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  .. "..      }...
176a0 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65  .      if {[have
176b0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
176c0 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  and]} then {..  
176d0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
176e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
176f0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
17700 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
17710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
17720 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
17730 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65  e.UnsafeNativeMe
17740 74 68 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65  thods sqlite3_me
17750 6d 6f 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20  mory_used..     
17760 20 20 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20     } memory] == 
17770 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
17780 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17790 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
177a0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
177b0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
177c0 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73   $memory " bytes
177d0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
177e0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
177f0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  e {..          #
17800 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
17810 54 45 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51  TE: Maybe the SQ
17820 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72  Lite core librar
17830 79 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  y is unavailable
17840 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ?..          #..
17850 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
17860 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
17870 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
17880 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17890 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
178a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
178b0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
178c0 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
178d0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
178e0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
178f0 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
17900 61 76 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20  available....   
17910 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17920 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17930 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
17940 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
17950 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
17960 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
17970 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 75  ..      set resu
17980 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f  lt $memory; # NO
17990 54 45 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72  TE: Return memor
179a0 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20  y in-use to our 
179b0 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20  caller.....     
179c0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
179d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
179e0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d  uts $channel "--
179f0 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72  -- maximum memor
17a00 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69  y in use by SQLi
17a10 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d  te... "..      }
17a20 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68  ....      if {[h
17a30 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43  aveSQLiteObjectC
17a40 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d  ommand]} then {.
17a50 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
17a60 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
17a70 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
17a80 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
17a90 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17aa0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
17ab0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
17ac0 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20  eMethods \..    
17ad0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17ae0 33 5f 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74  3_memory_highwat
17af0 65 72 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20  er 0..        } 
17b00 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
17b10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
17b20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17b30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
17b40 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17b50 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
17b60 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
17b70 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
17b80 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17b90 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
17ba0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
17bb0 61 79 62 65 20 74 68 65 20 53 51 4c 69 74 65 20  aybe the SQLite 
17bc0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20  core library is 
17bd0 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20  unavailable?..  
17be0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17bf0 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
17c00 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
17c10 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
17c20 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17c30 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
17c40 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17c50 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20   $memory \n]..  
17c60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
17c70 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
17c80 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  se {..        se
17c90 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c  t memory unavail
17ca0 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  able....        
17cb0 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17cc0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
17cd0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
17ce0 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
17cf0 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  y \n]..        }
17d00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17d10 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d     if {$collect}
17d20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17d30 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20   collectGarbage 
17d40 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20  $channel..      
17d50 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21  }....      if {!
17d60 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17d70 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
17d80 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72  hannel "---- cur
17d90 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75  rent memory in u
17da0 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e  se by the CLR...
17db0 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
17dc0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
17dd0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
17de0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
17df0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
17e00 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
17e10 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74  ct invoke GC Get
17e20 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73  TotalMemory fals
17e30 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d  e..        } mem
17e40 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ory] == 0} then 
17e50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
17e60 7b 5b 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65  {[string is inte
17e70 67 65 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d  ger -strict $mem
17e80 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ory]} then {..  
17e90 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
17ea0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
17ec0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
17ed0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
17ee0 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
17ef0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17f00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
17f10 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
17f20 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a  memory invalid..
17f30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
17f40 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
17f50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17f60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
17f70 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
17f80 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
17f90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
17fa0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
17fb0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
17fc0 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e   set memory unkn
17fd0 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  own....         
17fe0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
17ff0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
18000 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
18010 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
18020 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
18030 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
18040 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
18050 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
18060 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65  mory unavailable
18070 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
18080 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
18090 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
180a0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
180b0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
180c0 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
180d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
180e0 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20  eturn $result.. 
180f0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
18100 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65  c checkForSQLite
18110 44 69 72 65 63 74 6f 72 69 65 73 20 7b 20 63 68  Directories { ch
18120 61 6e 6e 65 6c 20 7b 72 65 73 65 74 20 66 61 6c  annel {reset fal
18130 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
18140 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18150 43 68 65 63 6b 20 69 66 20 74 68 65 20 73 71 6c  Check if the sql
18160 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
18170 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f  irectory functio
18180 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  n is available..
18190 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
181a0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
181b0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
181c0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 66  - checking for f
181d0 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f  unction sqlite3_
181e0 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
181f0 6f 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ory... "....    
18200 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18210 45 3a 20 54 68 69 73 20 63 61 6c 6c 20 74 6f 20  E: This call to 
18220 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
18230 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
18240 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68  function uses th
18250 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
18260 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 30   invalid value 0
18270 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 61   for the first a
18280 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  rgument.  This c
18290 6f 64 65 20 69 73 20 64 65 73 69 67 6e 65 64 0d  ode is designed.
182a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
182b0 6f 20 63 68 65 63 6b 20 69 66 20 63 61 6c 6c 69  o check if calli
182c0 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ng the function 
182d0 77 69 6c 6c 20 72 61 69 73 65 20 61 6e 20 65 78  will raise an ex
182e0 63 65 70 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20  ception (i.e... 
182f0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
18300 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 20 6f   actual result o
18310 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
18320 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 61  oes not matter a
18330 73 20 6c 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20  s long as no..  
18340 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
18350 63 74 6f 72 79 20 69 73 20 63 68 61 6e 67 65 64  ctory is changed
18360 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
18370 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
18380 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
18390 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
183a0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
183b0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
183c0 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
183d0 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
183e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
183f0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
18400 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c 6c  directory 0 null
18410 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
18420 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18430 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
18440 54 45 3a 20 43 61 6c 6c 69 6e 67 20 74 68 65 20  TE: Calling the 
18450 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
18460 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
18470 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
18480 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
18490 61 75 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  ause an exceptio
184a0 6e 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 69 74  n; therefore, it
184b0 20 6d 75 73 74 20 62 65 20 61 76 61 69 6c 61 62   must be availab
184c0 6c 65 20 28 69 2e 65 2e 0d 0a 20 20 20 20 20 20  le (i.e...      
184d0 20 20 23 20 20 20 20 20 20 20 65 76 65 6e 20 74    #       even t
184e0 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
184f0 72 65 74 75 72 6e 20 61 20 66 61 69 6c 75 72 65  return a failure
18500 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 6e 20   return code in 
18510 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
18520 20 20 20 20 20 20 63 61 73 65 29 2e 0d 0a 20 20        case)...  
18530 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
18540 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 73   addConstraint s
18550 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
18560 5f 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20  _directory....  
18570 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
18580 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20  nnel yes\n....  
18590 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
185a0 20 23 20 4e 4f 54 45 3a 20 44 6f 65 73 20 6f 75   # NOTE: Does ou
185b0 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 20 74 6f  r caller want to
185c0 20 72 65 73 65 74 20 74 68 65 20 64 69 72 65 63   reset the direc
185d0 74 6f 72 69 65 73 3f 0d 0a 20 20 20 20 20 20 20  tories?..       
185e0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
185f0 24 72 65 73 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $reset} then {..
18600 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
18610 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e         # NOTE: N
18620 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  ow make sure the
18630 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65   database and te
18640 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
18650 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20  ies are..       
18660 20 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74     #       reset
18670 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76   their default v
18680 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f  alues, which sho
18690 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20  uld be null for 
186a0 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  both...         
186b0 20 23 20 20 20 20 20 20 20 53 69 6e 63 65 20 74   #       Since t
186c0 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  he sqlite3_win32
186d0 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66  _set_directory f
186e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
186f0 61 62 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  able,..         
18700 20 23 20 20 20 20 20 20 20 75 73 65 20 69 74 2e   #       use it.
18710 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18720 20 20 20 20 20 20 20 20 20 66 6f 72 20 7b 73 65           for {se
18730 74 20 69 6e 64 65 78 20 31 7d 20 7b 24 69 6e 64  t index 1} {$ind
18740 65 78 20 3c 20 33 7d 20 7b 69 6e 63 72 20 69 6e  ex < 3} {incr in
18750 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
18760 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
18770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18780 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
18790 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
187a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
187b0 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
187c0 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
187d0 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
18800 65 74 5f 64 69 72 65 63 74 6f 72 79 20 24 69 6e  et_directory $in
18810 64 65 78 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  dex null..      
18820 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
18830 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18840 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18850 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18860 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18870 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18880 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 77  - call sqlite3_w
18890 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
188a0 72 79 28 22 20 24 69 6e 64 65 78 20 5c 0d 0a 20  ry(" $index \.. 
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a   ", null)... ok:
188d0 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a   " $result \n]..
188e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
188f0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
18900 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
18910 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
18920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18930 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
18940 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
18950 5f 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e  _directory(" $in
18960 64 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  dex \..         
18970 20 20 20 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c           ", null
18980 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e  )... error: " \n
18990 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
189a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
189b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
189c0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
189d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
189e0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
189f0 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
18a00 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18a10 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
18a20 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
18a30 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20  he directories? 
18a40 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a   This can only..
18a50 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18a60 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
18a70 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
18a80 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
18a90 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  se by the test..
18aa0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18ab0 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
18ac0 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
18ad0 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69  reset && [isSQLi
18ae0 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
18af0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
18b00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
18b10 20 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74   Now make sure t
18b20 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
18b30 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74  temporary direct
18b40 6f 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20  ories are..     
18b50 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 73       #       res
18b60 65 74 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  et their default
18b70 20 76 61 6c 75 65 73 2c 20 77 68 69 63 68 20 73   values, which s
18b80 68 6f 75 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f  hould be null fo
18b90 72 20 62 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20  r both...       
18ba0 20 20 20 23 20 20 20 20 20 20 20 53 69 6e 63 65     #       Since
18bb0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e   the sqlite3_win
18bc0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
18bd0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
18be0 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  ot..          # 
18bf0 20 20 20 20 20 20 61 70 70 65 61 72 20 74 6f 20        appear to 
18c00 62 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 75 73  be available, us
18c10 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
18c20 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 73   PRAGMA commands
18c30 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
18c40 20 20 20 20 69 6e 73 74 65 61 64 2e 0d 0a 20 20      instead...  
18c50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
18c60 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69 72       foreach dir
18c70 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74  ectory [list dat
18c80 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  a_store_director
18c90 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  y temp_store_dir
18ca0 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20  ectory] {..     
18cb0 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20 5b         set sql [
18cc0 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41 47  appendArgs "PRAG
18cd0 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79 20  MA " $directory 
18ce0 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20  " = \"\";"].... 
18cf0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
18d00 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71  catch {executeSq
18d10 6c 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20  l $sql} result] 
18d20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
18d40 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
18d50 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
18d60 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18d70 2d 20 65 78 65 63 75 74 65 20 50 52 41 47 4d 41  - execute PRAGMA
18d80 20 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e   " $directory ".
18d90 2e 2e 20 6f 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20  .. ok: \"" \..  
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20  $result \"\n].. 
18dc0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
18dd0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
18de0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
18df0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
18e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18e10 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63 75 74 65     "---- execute
18e20 20 50 52 41 47 4d 41 20 22 20 24 64 69 72 65 63   PRAGMA " $direc
18e30 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72 6f 72 3a  tory "... error:
18e40 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
18e50 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65          \n\t $re
18e60 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  sult \n]..      
18e70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18e80 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
18e90 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18ea0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18eb0 45 3a 20 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77  E: Finally, show
18ec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
18ed0 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ue of the databa
18ee0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
18ef0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
18f00 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20 54 68  directories.  Th
18f10 69 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70  is can only be p
18f20 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
18f30 74 65 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20  te is loaded..  
18f40 20 20 20 20 23 20 20 20 20 20 20 20 61 6e 64 20      #       and 
18f50 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62 79  ready for use by
18f60 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e   the test suite.
18f70 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
18f80 20 69 66 20 7b 5b 69 73 53 51 4c 69 74 65 52 65   if {[isSQLiteRe
18f90 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
18fa0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 64 69        foreach di
18fb0 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20 64 61  rectory [list da
18fc0 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  ta_store_directo
18fd0 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  ry temp_store_di
18fe0 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20  rectory] {..    
18ff0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
19000 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
19010 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
19020 22 20 24 64 69 72 65 63 74 6f 72 79 20 22 2e 2e  " $directory "..
19030 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  . "]....        
19040 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65 6e    set sql [appen
19050 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22 20  dArgs "PRAGMA " 
19060 24 64 69 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a  $directory \;]..
19070 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
19080 5b 63 61 74 63 68 20 7b 65 78 65 63 75 74 65 53  [catch {executeS
19090 71 6c 20 24 73 71 6c 20 73 63 61 6c 61 72 7d 20  ql $sql scalar} 
190a0 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
190b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
190c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
190d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 6f 6b   [appendArgs "ok
190e0 3a 20 5c 22 22 20 24 72 65 73 75 6c 74 20 5c 22  : \"" $result \"
190f0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
19100 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
19110 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
19120 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
19130 22 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24  "error: " \n\t $
19140 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
19150 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
19160 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
19170 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
19180 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65  loadSQLiteTestSe
19190 74 74 69 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c  ttings { channel
191a0 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7b 71 75   {suffix ""} {qu
191b0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
191c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
191d0 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64   NOTE: Skip load
191e0 69 6e 67 20 74 68 65 20 73 65 74 74 69 6e 67 73  ing the settings
191f0 20 69 66 20 74 68 65 69 72 20 75 73 61 67 65 20   if their usage 
19200 68 61 73 20 62 65 65 6e 20 64 69 73 61 62 6c 65  has been disable
19210 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
19220 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
19230 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65  ists ::no(sqlite
19240 54 65 73 74 53 65 74 74 69 6e 67 73 29 5d 7d 20  TestSettings)]} 
19250 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
19260 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
19270 45 3a 20 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70  E: Load custom p
19280 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70  er-user and/or p
19290 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
192a0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
192b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
192c0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
192d0 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
192e0 73 65 72 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ser)]} then {.. 
192f0 20 20 20 20 20 20 20 20 20 73 65 74 20 75 73 65           set use
19300 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
19310 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
19320 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79  tCommonDirectory
19330 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] \..           
19340 20 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 73     [appendArgs s
19350 65 74 74 69 6e 67 73 20 24 73 75 66 66 69 78 20  ettings $suffix 
19360 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  . $::tcl_platfor
19370 6d 28 75 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d  m(user) .eagle]]
19380 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
19390 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
193a0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
193b0 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
193c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
193d0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
193f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
19400 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
19420 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d  --- loading per-
19430 75 73 65 72 20 74 65 73 74 20 73 65 74 74 69 6e  user test settin
19440 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20  gs file \"" \.. 
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
19470 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d  leName \"...\n].
19480 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
19490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
194a0 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
194b0 20 20 20 20 20 20 20 20 20 20 75 70 6c 65 76 65            upleve
194c0 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75 72 63 65  l 1 [list source
194d0 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
194e0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
194f0 20 20 20 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74       } error]} t
19500 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
19510 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
19520 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
19530 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19540 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19550 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19560 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
19570 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
19580 64 20 74 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73  d to load per-us
19590 65 72 20 73 65 74 74 69 6e 67 73 20 66 69 6c 65  er settings file
195a0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
195b0 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
195c0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
195d0 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  e "\", error: " 
195e0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
195f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
19600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19610 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
19620 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
19630 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
19640 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
19650 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
19660 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
19670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19680 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
19690 64 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73  d loading per-us
196a0 65 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73  er test settings
196b0 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
196d0 75 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65  userSettingsFile
196e0 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20 64 6f 65  Name "\", it doe
196f0 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
19700 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
19710 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
19720 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
19730 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23    ##############
19740 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19750 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19760 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
19770 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20  #########....   
19780 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
19790 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
197a0 66 6f 72 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65  form(host)]} the
197b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
197c0 65 74 20 68 6f 73 74 53 65 74 74 69 6e 67 73 46  et hostSettingsF
197d0 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ileName [file jo
197e0 69 6e 20 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72  in [getCommonDir
197f0 65 63 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20  ectory] \..     
19800 20 20 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64           [append
19810 41 72 67 73 20 73 65 74 74 69 6e 67 73 20 24 73  Args settings $s
19820 75 66 66 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70  uffix . $::tcl_p
19830 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65  latform(host) .e
19840 61 67 6c 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  agle]]....      
19850 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
19860 69 73 74 73 20 24 68 6f 73 74 53 65 74 74 69 6e  ists $hostSettin
19870 67 73 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65  gsFileName]} the
19880 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
19890 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
198a0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
198b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
198c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
198d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
198e0 20 20 20 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e      "---- loadin
198f0 67 20 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20  g per-host test 
19900 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
19910 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
19920 20 20 20 20 20 20 20 24 68 6f 73 74 53 65 74 74         $hostSett
19930 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e  ingsFileName \".
19940 2e 2e 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ..\n]..         
19950 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
19960 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
19970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19980 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
19990 73 6f 75 72 63 65 20 24 68 6f 73 74 53 65 74 74  source $hostSett
199a0 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20  ingsFileName].. 
199b0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72             } err
199c0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
199d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
199e0 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
19a10 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
19a40 20 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20   failed to load 
19a50 70 65 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67  per-host setting
19a60 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20  s file \"" \..  
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
19a90 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72  ileName "\", err
19aa0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f  or: " \n\t $erro
19ab0 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  r \n]..         
19ac0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19ad0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
19ae0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
19af0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
19b00 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
19b10 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19b20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19b30 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19b40 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
19b50 73 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20  skipped loading 
19b60 70 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65  per-host test se
19b70 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20  ttings file \"" 
19b80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19b90 20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e       $hostSettin
19ba0 67 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20  gsFileName "\", 
19bb0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
19bc0 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  t\n"]..         
19bd0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
19be0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
19bf0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
19c00 0a 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c  .    proc runSQL
19c10 69 74 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20  iteTestPrologue 
19c20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
19c30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
19c40 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75  p running our cu
19c50 73 74 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66  stom prologue if
19c60 20 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61   the main one ha
19c70 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20  s been..      # 
19c80 20 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a        skipped...
19c90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19ca0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
19cb0 20 3a 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65   ::no(prologue.e
19cc0 61 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  agle)]} then {..
19cd0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
19ce0 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20     # NOTE: Load 
19cf0 74 68 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73  the "before-cons
19d00 74 72 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20  traints" custom 
19d10 70 65 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20  per-user and/or 
19d20 70 65 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20  per-host..      
19d30 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
19d40 65 74 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20  ettings now...  
19d50 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
19d60 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74   uplevel 1 [list
19d70 20 6c 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53   loadSQLiteTestS
19d80 65 74 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f  ettings $::test_
19d90 63 68 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d  channel .before]
19da0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
19db0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
19dc0 68 65 63 6b 20 69 66 20 74 68 65 20 5b 6f 62 6a  heck if the [obj
19dd0 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 20  ect] command is 
19de0 61 76 61 69 6c 61 62 6c 65 3b 20 69 66 20 6e 6f  available; if no
19df0 74 2c 20 61 64 64 20 73 6f 6d 65 0d 0a 20 20 20  t, add some..   
19e00 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68 69       #       shi
19e10 6d 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ms to make the t
19e20 65 73 74 20 73 75 69 74 65 20 72 75 6e 20 73 6d  est suite run sm
19e30 6f 6f 74 68 65 72 2e 0d 0a 20 20 20 20 20 20 20  oother...       
19e40 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
19e50 6b 46 6f 72 53 51 4c 69 74 65 4f 62 6a 65 63 74  kForSQLiteObject
19e60 43 6f 6d 6d 61 6e 64 20 24 3a 3a 74 65 73 74 5f  Command $::test_
19e70 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
19e80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
19e90 4e 4f 54 45 3a 20 44 65 74 65 72 6d 69 6e 65 20  NOTE: Determine 
19ea0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
19eb0 20 6e 61 74 69 76 65 20 70 6c 61 74 66 6f 72 6d   native platform
19ec0 20 61 6e 64 20 61 72 63 68 69 74 65 63 74 75 72   and architectur
19ed0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
19ee0 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
19ef0 6f 72 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  orm [getBuildPla
19f00 74 66 6f 72 6d 20 74 72 75 65 5d 0d 0a 20 20 20  tform true]..   
19f10 20 20 20 20 20 73 65 74 20 61 72 63 68 69 74 65       set archite
19f20 63 74 75 72 65 20 5b 61 72 63 68 69 74 65 63 74  cture [architect
19f30 75 72 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 24  ureForPlatform $
19f40 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
19f50 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
19f60 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
19f70 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61 72   platform and ar
19f80 63 68 69 74 65 63 74 75 72 65 20 75 73 65 64 20  chitecture used 
19f90 74 6f 20 68 65 6c 70 20 6c 6f 63 61 74 65 20 74  to help locate t
19fa0 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
19fb0 20 20 20 20 6e 61 74 69 76 65 20 62 75 69 6c 64      native build
19fc0 20 66 69 6c 65 73 2e 0d 0a 20 20 20 20 20 20 20   files...       
19fd0 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
19fe0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
19ff0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1a000 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
1a010 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  -- platform for 
1a020 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
1a030 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
1a040 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
1a050 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e    $platform \"\n
1a060 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70 75  ]....        tpu
1a070 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1a080 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
1a090 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
1a0a0 2d 2d 2d 20 61 72 63 68 69 74 65 63 74 75 72 65  --- architecture
1a0b0 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 6e 61   for locating na
1a0c0 74 69 76 65 20 62 75 69 6c 64 20 66 69 6c 65 73  tive build files
1a0d0 20 69 73 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20   is \"" \..     
1a0e0 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63         $architec
1a0f0 74 75 72 65 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  ture \"\n]....  
1a100 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a110 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61   # NOTE: Build a
1a120 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
1a130 72 61 74 69 6f 6e 20 66 69 6c 65 73 20 74 68 61  ration files tha
1a140 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20  t we handle...  
1a150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1a160 20 73 65 74 20 63 6f 6e 66 69 67 46 69 6c 65 4e   set configFileN
1a170 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20  ames [list \..  
1a180 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1a190 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1a1a0 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
1a1b0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1a1c0 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 61 20 6c   NOTE: Build a l
1a1d0 69 73 74 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ist of auxiliary
1a1e0 20 4d 61 6e 61 67 65 64 20 44 65 62 75 67 67 69   Managed Debuggi
1a1f0 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 28 4d  ng Assistants (M
1a200 44 41 29 0d 0a 20 20 20 20 20 20 20 20 23 20 20  DA)..        #  
1a210 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
1a220 6f 6e 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  on files that we
1a230 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20   handle...      
1a240 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
1a250 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61   mdaConfigFileNa
1a260 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
1a270 20 20 20 20 20 20 20 20 20 45 61 67 6c 65 53 68           EagleSh
1a280 65 6c 6c 33 32 2e 65 78 65 2e 6d 64 61 2e 63 6f  ell32.exe.mda.co
1a290 6e 66 69 67 20 49 6e 73 74 61 6c 6c 65 72 2e 65  nfig Installer.e
1a2a0 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 5c 0d  xe.mda.config \.
1a2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
1a2c0 74 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  t.exe.mda.config
1a2d0 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64   testlinq.exe.md
1a2e0 61 2e 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20  a.config \..    
1a2f0 20 20 20 20 20 20 20 20 74 65 73 74 65 66 36 2e          testef6.
1a300 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 0d  exe.mda.config].
1a310 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a320 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
1a330 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ild the list of 
1a340 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20 74  external files t
1a350 68 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 20 20  hat we handle.  
1a360 53 6f 6d 65 20 6f 66 0d 0a 20 20 20 20 20 20 20  Some of..       
1a370 20 23 20 20 20 20 20 20 20 74 68 65 73 65 20 66   #       these f
1a380 69 6c 65 73 20 6d 61 79 20 62 65 20 6e 61 74 69  iles may be nati
1a390 76 65 20 61 6e 64 2f 6f 72 20 6d 61 6e 61 67 65  ve and/or manage
1a3a0 64 20 61 73 73 65 6d 62 6c 69 65 73 20 74 68 61  d assemblies tha
1a3b0 74 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23  t are..        #
1a3c0 20 20 20 20 20 20 20 72 65 71 75 69 72 65 64 20         required 
1a3d0 74 6f 20 70 65 72 66 6f 72 6d 20 76 61 72 69 6f  to perform vario
1a3e0 75 73 20 74 65 73 74 73 2e 0d 0a 20 20 20 20 20  us tests...     
1a3f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
1a400 74 20 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61  t externalFileNa
1a410 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20  mes [list \..   
1a420 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a           [file j
1a430 6f 69 6e 20 45 6e 74 69 74 79 46 72 61 6d 65 77  oin EntityFramew
1a440 6f 72 6b 20 6c 69 62 20 5b 73 74 72 69 6e 67 20  ork lib [string 
1a450 6d 61 70 20 5b 6c 69 73 74 20 46 78 20 22 22 5d  map [list Fx ""]
1a460 20 5b 73 74 72 69 6e 67 20 5c 0d 0a 20 20 20 20   [string \..    
1a470 20 20 20 20 20 20 20 20 6d 61 70 20 5b 6c 69 73          map [lis
1a480 74 20 6e 65 74 46 78 34 35 31 20 6e 65 74 46 78  t netFx451 netFx
1a490 34 35 5d 20 5b 67 65 74 42 75 69 6c 64 4e 65 74  45] [getBuildNet
1a4a0 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61 6d  Fx]]] EntityFram
1a4b0 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20  ework.dll]].... 
1a4c0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a4d0 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
1a4e0 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74 69  the list of nati
1a4f0 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65  ve assembly file
1a500 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
1a510 2e 20 20 54 68 65 0d 0a 20 20 20 20 20 20 20 20  .  The..        
1a520 23 20 20 20 20 20 20 20 72 65 61 73 6f 6e 20 74  #       reason t
1a530 68 65 20 22 53 79 73 74 65 6d 2e 44 61 74 61 2e  he "System.Data.
1a540 53 51 4c 69 74 65 2e 64 6c 6c 22 20 66 69 6c 65  SQLite.dll" file
1a550 20 69 73 20 69 6e 63 6c 75 64 65 64 20 68 65 72   is included her
1a560 65 20 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  e is..        # 
1a570 20 20 20 20 20 20 62 65 63 61 75 73 65 20 69 74        because it
1a580 20 63 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 69   could be the mi
1a590 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
1a5a0 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
1a5b0 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
1a5c0 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
1a5d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1a5e0 73 71 6c 69 74 65 33 2e 64 6c 6c 20 53 51 4c 69  sqlite3.dll SQLi
1a5f0 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 53  te.Interop.dll S
1a600 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
1a610 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20 20  e.dll]....      
1a620 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1a630 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 6c  OTE: Build the l
1a640 69 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61  ist of managed a
1a650 73 73 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68  ssembly files th
1a660 61 74 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20  at we handle... 
1a670 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a680 20 20 73 65 74 20 6d 61 6e 61 67 65 64 46 69 6c    set managedFil
1a690 65 4e 61 6d 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  eNames [list \..
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
1a6b0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1a6c0 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ll System.Data.S
1a6d0 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20 5c  QLite.Linq.dll \
1a6e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
1a6f0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
1a700 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20  .EF6.dll]....   
1a710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a720 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61  # NOTE: Remove a
1a730 6e 79 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  ny test constrai
1a740 6e 74 73 20 74 68 61 74 20 72 65 66 65 72 20 74  nts that refer t
1a750 6f 20 74 68 65 20 6e 61 74 69 76 65 20 61 6e 64  o the native and
1a760 2f 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  /or..        #  
1a770 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61 73 73       managed ass
1a780 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
1a790 20 77 65 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73   we handle unles
1a7a0 73 20 66 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d  s forbidden from
1a7b0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a7c0 20 20 64 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20    doing so...   
1a7d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a7e0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1a7f0 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d  s ::no(sqliteRem
1a800 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  oveConstraints)]
1a810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a820 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
1a830 4e 61 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65  Name $configFile
1a840 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
1a850 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
1a860 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
1a870 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d  s file_ $fileNam
1a880 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  e]..          }.
1a890 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
1a8a0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1a8b0 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1a8c0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1a8d0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1a8e0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1a8f0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
1a900 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1a910 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1a920 20 66 69 6c 65 4e 61 6d 65 20 24 65 78 74 65 72   fileName $exter
1a930 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  nalFileNames {..
1a940 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f              remo
1a950 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
1a960 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5b  pendArgs file_ [
1a970 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
1a980 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20  ame]]..         
1a990 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a9a0 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1a9b0 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65   $nativeFileName
1a9c0 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1a9d0 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e   removeConstrain
1a9e0 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69  t [appendArgs fi
1a9f0 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a  le_ $fileName]..
1aa00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1aa10 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
1aa20 20 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67   fileName $manag
1aa30 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
1aa40 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
1aa50 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
1aa60 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 24 66  endArgs file_ $f
1aa70 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
1aa80 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
1aa90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
1aaa0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1aab0 6b 69 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44  kip all System.D
1aac0 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
1aad0 65 64 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67  ed file handling
1aae0 20 28 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20   (deleting,..   
1aaf0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
1ab00 79 69 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e  ying, and loadin
1ab10 67 29 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  g) if instructed
1ab20 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1ab30 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1ab40 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c   exists ::no(sql
1ab50 69 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  iteFiles)]} then
1ab60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1ab70 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1ab80 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74  E: Skip trying t
1ab90 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 66 69 6c  o delete any fil
1aba0 65 73 20 69 66 20 69 6e 73 74 72 75 63 74 65 64  es if instructed
1abb0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1abc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1abd0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1abe0 28 64 65 6c 65 74 65 53 71 6c 69 74 65 46 69 6c  (deleteSqliteFil
1abf0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1ac00 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
1ac10 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1ac20 28 64 65 6c 65 74 65 53 71 6c 69 74 65 43 6f 6e  (deleteSqliteCon
1ac30 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
1ac40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ac50 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1ac60 6d 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61  me $configFileNa
1ac70 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1ac80 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
1ac90 42 69 6e 61 72 79 46 69 6c 65 20 24 66 69 6c 65  BinaryFile $file
1aca0 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1acb0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1acc0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1acd0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1ace0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1acf0 65 53 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46  eSqliteExternalF
1ad00 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1ad20 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
1ad30 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  mdaConfigFileNam
1ad40 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1ad50 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
1ad60 75 69 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61  uildFile $fileNa
1ad70 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
1ad80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1ad90 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1ada0 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46  eName $externalF
1adb0 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20  ileNames {..    
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44              tryD
1add0 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
1ade0 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  $fileName..     
1adf0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1ae00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1ae10 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1ae20 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1ae30 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69  deleteSqliteNati
1ae40 76 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  veFiles)]} then 
1ae50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ae60 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1ae70 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71  ts ::no(deleteSq
1ae80 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c 65  liteImplicitFile
1ae90 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1aeb0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
1aec0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
1aed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1aee0 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
1aef0 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 0d  embly $fileName.
1af00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af10 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1af20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1af30 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
1af40 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
1af50 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70 6c 69  teSqliteNonImpli
1af60 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  citFiles)]} then
1af70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1af80 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1af90 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1afa0 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  eSqlitePlatformF
1afb0 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1afc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afd0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
1afe0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
1aff0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1b000 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
1b010 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69  h fileName $nati
1b020 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  veFileNames {.. 
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65     tryDeleteAsse
1b050 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24  mbly $fileName $
1b060 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
1b070 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1b090 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b0a0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1b0b0 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74  xists ::no(delet
1b0c0 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63 74  eSqliteArchitect
1b0d0 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ureFiles)] && \.
1b0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b0f0 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
1b100 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75 72  gth $architectur
1b110 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1b140 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61  me $nativeFileNa
1b150 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1b160 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1b170 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
1b180 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
1b190 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
1b1a0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1b1b0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1b1d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
1b1f0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1b200 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
1b210 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
1b220 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b230 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
1b240 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
1b250 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
1b260 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
1b270 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
1b280 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
1b290 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1b2a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1b2b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1b2c0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
1b2d0 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
1b2e0 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22  the "autoSelect"
1b2f0 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e   runtime option.
1b300 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20    If present,.. 
1b310 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1b320 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   attempt to auto
1b330 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
1b340 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c   the first avail
1b350 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  able..          
1b360 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f  #       build (o
1b370 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20  r "release") of 
1b380 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65  SQLite and Syste
1b390 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20  m.Data.SQLite.. 
1b3a0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1b3b0 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
1b3c0 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
1b3d0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1b3e0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
1b3f0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f  ntimeOption auto
1b400 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d  Select]} then {.
1b410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1b420 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  {![checkForSQLit
1b430 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f  eBuilds $::test_
1b440 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74  channel true]} t
1b450 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b460 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1b470 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
1b480 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
1b490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1b4a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
1b4b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b4c0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1b4d0 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65  kip trying to ve
1b4e0 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64  rify the build d
1b4f0 69 72 65 63 74 6f 72 79 20 69 66 20 69 6e 73 74  irectory if inst
1b500 72 75 63 74 65 64 3b 0d 0a 20 20 20 20 20 20 20  ructed;..       
1b510 20 20 20 23 20 20 20 20 20 20 20 6f 74 68 65 72     #       other
1b520 77 69 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  wise, make sure 
1b530 69 74 20 61 63 74 75 61 6c 6c 79 20 65 78 69 73  it actually exis
1b540 74 73 20 6f 72 20 68 61 6c 74 20 74 68 65 20 65  ts or halt the e
1b550 6e 74 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20  ntire..         
1b560 20 23 20 20 20 20 20 20 20 74 65 73 74 69 6e 67   #       testing
1b570 20 70 72 6f 63 65 73 73 20 69 66 20 69 74 20 64   process if it d
1b580 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0d 0a  oes not exist...
1b590 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b5a0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1b5b0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 76 65  o exists ::no(ve
1b5c0 72 69 66 79 42 75 69 6c 64 44 69 72 65 63 74 6f  rifyBuildDirecto
1b5d0 72 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ry)]} then {..  
1b5e0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1b5f0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1b600 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
1b610 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
1b620 6f 72 79 20 4d 55 53 54 20 65 78 69 73 74 20 61  ory MUST exist a
1b630 73 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s a..           
1b640 20 23 20 20 20 20 20 20 20 76 61 6c 69 64 20 64   #       valid d
1b650 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
1b660 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
1b670 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d 0a 20   to continue... 
1b680 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1b690 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64 69            set di
1b6a0 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75 69 6c  rectory [getBuil
1b6b0 64 44 69 72 65 63 74 6f 72 79 5d 0d 0a 0d 0a 20  dDirectory].... 
1b6c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1b6d0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 64 69  [file exists $di
1b6e0 72 65 63 74 6f 72 79 5d 20 7c 7c 20 5c 0d 0a 20  rectory] || \.. 
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
1b700 5b 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72  [file isdirector
1b710 79 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74  y $directory]} t
1b720 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1b730 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b740 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4a 75        # NOTE: Ju
1b750 73 74 20 70 72 69 6f 72 20 74 6f 20 61 63 74 75  st prior to actu
1b760 61 6c 6c 79 20 68 61 6c 74 69 6e 67 20 74 68 65  ally halting the
1b770 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
1b780 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1b790 20 23 20 20 20 20 20 20 20 61 64 64 20 61 6e 20   #       add an 
1b7a0 65 72 72 6f 72 20 74 6f 20 74 68 65 20 74 65 73  error to the tes
1b7b0 74 20 6c 6f 67 20 66 69 6c 65 2e 0d 0a 20 20 20  t log file...   
1b7c0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1b7e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1b7f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1b800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b810 20 20 20 22 2d 2d 2d 2d 20 63 6f 75 6c 64 20 6e     "---- could n
1b820 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c 64 20  ot verify build 
1b830 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 24 64  directory \"" $d
1b840 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
1b860 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68  ", all testing h
1b870 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  alted\n"]....   
1b880 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1b890 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1b8a0 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63  TE: Raising a sc
1b8b0 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20  ript error from 
1b8c0 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c  this point shoul
1b8d0 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20  d halt..        
1b8e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1b8f0 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73  e testing proces
1b900 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
1b910 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1b920 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64     error [append
1b930 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1b940 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
1b950 20 6e 6f 74 20 76 65 72 69 66 79 20 62 75 69 6c   not verify buil
1b960 64 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20  d directory \"" 
1b970 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 22 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67  "\", all testing
1b9a0 20 68 61 6c 74 65 64 22 5d 0d 0a 20 20 20 20 20   halted"]..     
1b9b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1b9c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1b9d0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1b9e0 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79  # NOTE: Skip try
1b9f0 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79 20  ing to copy any 
1ba00 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75 63  files if instruc
1ba10 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
1ba20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
1ba30 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
1ba40 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 69  :no(copySqliteFi
1ba50 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
1ba60 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1ba70 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1ba80 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e 66  o(copySqliteConf
1ba90 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  igFiles)]} then 
1baa0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1bab0 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
1bac0 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
1bad0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
1bae0 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
1baf0 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
1bb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bb10 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1bb20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1bb30 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
1bb40 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
1bb50 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d  eExternalFiles)]
1bb60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1bb70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1bb80 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1bb90 20 43 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65   Copy the Manage
1bba0 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
1bbb0 73 74 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e  stants (MDA) con
1bbc0 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20  figuration..    
1bbd0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
1bbe0 20 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45    file for the E
1bbf0 61 67 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68  agle shell to th
1bc00 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
1bc10 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
1bc20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1bc30 20 77 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63   while using eac
1bc40 68 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f  h of the names o
1bc50 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65  f the various le
1bc60 67 61 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20  gacy test..     
1bc70 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1bc80 20 65 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54   executables.  T
1bc90 68 69 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f  his will help to
1bca0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1bcb0 61 6c 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20  all the..       
1bcc0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c         #       l
1bcd0 65 67 61 63 79 20 74 65 73 74 73 20 72 75 6e 20  egacy tests run 
1bce0 77 69 74 68 20 65 78 61 63 74 6c 79 20 74 68 65  with exactly the
1bcf0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e   same set of Man
1bd00 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  aged..          
1bd10 20 20 20 20 23 20 20 20 20 20 20 20 44 65 62 75      #       Debu
1bd20 67 67 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73  gging Assistants
1bd30 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20   configured...  
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
1bd60 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d  each fileName $m
1bd70 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65  daConfigFileName
1bd80 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
1bd90 20 20 20 20 20 74 72 79 43 6f 70 79 42 69 6e 61       tryCopyBina
1bda0 72 79 46 69 6c 65 20 45 61 67 6c 65 53 68 65 6c  ryFile EagleShel
1bdb0 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67  l.exe.mda.config
1bdc0 20 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20   "" $fileName.. 
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1bde0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bdf0 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
1be00 20 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68   # NOTE: Copy th
1be10 65 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72  e external binar
1be20 69 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20  ies, if any, to 
1be30 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1be40 61 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  at..            
1be50 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
1be60 6e 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65  ns the Eagle she
1be70 6c 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70  ll.  This is typ
1be80 69 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d  ically used to m
1be90 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ake..           
1bea0 20 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20     #       sure 
1beb0 61 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72  assemblies refer
1bec0 65 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65  enced by the one
1bed0 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61  s being tested a
1bee0 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  re..            
1bef0 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61    #       availa
1bf00 62 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74  ble during the t
1bf10 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d  esting process..
1bf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bf30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bf40 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
1bf50 20 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61   $externalFileNa
1bf60 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
1bf70 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 45 78         tryCopyEx
1bf80 74 65 72 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65  ternalFile $file
1bf90 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
1bfa0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1bfb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1bfc0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1bfd0 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53  xists ::no(copyS
1bfe0 71 6c 69 74 65 4e 61 74 69 76 65 46 69 6c 65 73  qliteNativeFiles
1bff0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
1c000 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1c010 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1c020 45 3a 20 49 66 20 74 68 65 20 74 65 73 74 20 70  E: If the test p
1c030 6c 61 74 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c  latform is likel
1c040 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f  y the default fo
1c050 72 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  r this..        
1c060 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61        #       ma
1c070 63 68 69 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20  chine, also try 
1c080 74 6f 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69  to copy the nati
1c090 76 65 20 66 69 6c 65 73 20 74 6f 20 74 68 65 0d  ve files to the.
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1c0b0 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 6c 6f         binary lo
1c0c0 63 61 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  cation...       
1c0d0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1c0e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
1c0f0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
1c100 6f 70 79 53 71 6c 69 74 65 49 6d 70 6c 69 63 69  opySqliteImplici
1c110 74 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  tFiles)] && \.. 
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 5b 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64   [isDefaultBuild
1c140 50 6c 61 74 66 6f 72 6d 20 74 72 75 65 5d 7d 20  Platform true]} 
1c150 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c160 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1c170 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
1c180 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c1a0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24  ryCopyAssembly $
1c1b0 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  fileName..      
1c1c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c1d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1c1f0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
1c200 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 4e  ::no(copySqliteN
1c210 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29  onImplicitFiles)
1c220 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1c230 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1c240 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1c250 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c 61 74  o(copySqlitePlat
1c260 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c  formFiles)] && \
1c270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c280 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1c290 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
1c2a0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1c2c0 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20  oreach fileName 
1c2d0 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73  $nativeFileNames
1c2e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c2f0 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
1c300 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1c310 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20  e $platform..   
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1c330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c340 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1c350 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
1c360 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f  o exists ::no(co
1c370 70 79 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  pySqliteArchitec
1c380 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
1c390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c3a0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1c3b0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
1c3c0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
1c3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c3e0 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
1c3f0 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  ame $nativeFileN
1c400 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1c410 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43              tryC
1c420 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c  opyAssembly $fil
1c430 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63 74  eName $architect
1c440 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ure..           
1c450 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1c460 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1c470 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1c480 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c490 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1c4a0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1c4b0 6f 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61  o(copySqliteMana
1c4c0 67 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  gedFiles)]} then
1c4d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c4e0 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
1c4f0 6d 65 20 24 6d 61 6e 61 67 65 64 46 69 6c 65 4e  me $managedFileN
1c500 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
1c510 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 41          tryCopyA
1c520 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
1c530 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
1c540 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1c550 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1c560 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
1c570 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1c580 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20   Skip trying to 
1c590 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20 69  load any files i
1c5a0 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20  f instructed... 
1c5b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1c5c0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1c5d0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1c5e0 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20  dSqliteFiles)]} 
1c5f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c600 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1c610 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53  xists ::no(loadS
1c620 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69 6c  qliteImplicitFil
1c630 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c              tryL
1c650 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74  oadAssembly Syst
1c660 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64  em.Data.SQLite.d
1c670 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ll..            
1c680 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c690 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
1c6a0 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69  ts ::no(loadSqli
1c6b0 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20 74  teLinqFiles)]} t
1c6c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1c6d0 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65       tryLoadAsse
1c6e0 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  mbly System.Data
1c6f0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
1c700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c710 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1c720 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
1c730 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65   ::no(loadSqlite
1c740 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  Ef6Files)]} then
1c750 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c760 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
1c770 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
1c780 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20 20  Lite.EF6.dll..  
1c790 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1c7a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
1c7b0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
1c7c0 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e 49  o(loadSqliteNonI
1c7d0 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
1c7e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1c7f0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
1c800 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61   exists ::no(loa
1c810 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  dSqlitePlatformF
1c820 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
1c840 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
1c850 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68  latform] > 0} th
1c860 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1c870 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
1c880 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
1c890 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c  a.SQLite.dll $pl
1c8a0 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
1c8b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c8c0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
1c8d0 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
1c8e0 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69 74  loadSqliteArchit
1c8f0 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26  ectureFiles)] &&
1c900 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1c910 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1c920 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
1c930 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
1c940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c950 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79   tryLoadAssembly
1c960 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1c970 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74 65  ite.dll $archite
1c980 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20  cture..         
1c990 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1c9a0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c9b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1c9c0 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1c9d0 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1c9e0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1c9f0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ca00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ca10 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1ca20 6e 20 6f 66 20 5c 22 73 71 6c 69 74 65 33 2e 64  n of \"sqlite3.d
1ca30 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20  ll\"... " \..   
1ca40 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65             [file
1ca50 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
1ca60 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69  aryFileName sqli
1ca70 74 65 33 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  te3.dll]] \n].. 
1ca80 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ca90 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
1caa0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1cab0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1cac0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1cad0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1cae0 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
1caf0 5c 22 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  \"SQLite.Interop
1cb00 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20  .dll\"... " \.. 
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
1cb20 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42  le version [getB
1cb30 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 53 51  inaryFileName SQ
1cb40 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c  Lite.Interop.dll
1cb50 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ]] \n]..        
1cb60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1cb70 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1cb80 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1cb90 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1cba0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1cbb0 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65     "---- file ve
1cbc0 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
1cbd0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1cbe0 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
1cbf0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1cc00 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
1cc10 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
1cc20 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1cc30 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  l]] \n]..       
1cc40 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61   }....        ca
1cc50 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
1cc60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1cc70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1cc80 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1cc90 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76      "---- file v
1cca0 65 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74  ersion of \"Syst
1ccb0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
1ccc0 69 6e 71 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  inq.dll\"... " \
1ccd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cce0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
1ccf0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1cd00 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
1cd10 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d 5d 20 5c  ite.Linq.dll]] \
1cd20 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  n]..        }...
1cd30 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1cd40 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1cd50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1cd60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1cd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1cd80 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1cd90 6e 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61  n of \"System.Da
1cda0 74 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c  ta.SQLite.EF6.dl
1cdb0 6c 5c 22 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20  l\"... " \..    
1cdc0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
1cdd0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
1cde0 72 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65  ryFileName Syste
1cdf0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45 46  m.Data.SQLite.EF
1ce00 36 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20  6.dll]] \n]..   
1ce10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ce20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1ce30 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
1ce40 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
1ce50 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1ce70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1ce80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1ce90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cea0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
1ceb0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
1cec0 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
1ced0 20 20 20 20 20 20 20 20 22 2f 73 71 6c 69 74 65          "/sqlite
1cee0 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69  3.dll\"... " [fi
1cef0 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20  le version \..  
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
1cf10 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
1cf20 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c   sqlite3.dll $pl
1cf30 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20  atform]] \n]..  
1cf40 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1cf50 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1cf70 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1cf80 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1cf90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cfa0 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73   "---- file vers
1cfb0 69 6f 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74  ion of \"" $plat
1cfc0 66 6f 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20  form \..        
1cfd0 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69 74 65          "/SQLite
1cfe0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e  .Interop.dll\"..
1cff0 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f  . " [file versio
1d000 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
1d010 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46       [getBinaryF
1d020 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49  ileName SQLite.I
1d030 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74  nterop.dll $plat
1d040 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  form]] \n]..    
1d050 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d060 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1d070 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d080 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1d090 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d0b0 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1d0c0 6e 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f  n of \"" $platfo
1d0d0 72 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  rm \..          
1d0e0 20 20 20 20 20 20 22 2f 53 79 73 74 65 6d 2e 44        "/System.D
1d0f0 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
1d100 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1d110 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1d120 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1d130 79 46 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d  yFileName System
1d140 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
1d150 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d   $platform]] \n]
1d160 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1d170 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1d180 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
1d190 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63  length $architec
1d1a0 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ture] > 0} then 
1d1b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
1d1c0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1d1d0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d1e0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
1d1f0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
1d200 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
1d210 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
1d220 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20 5c   $architecture \
1d230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d240 20 20 22 2f 73 71 6c 69 74 65 33 2e 64 6c 6c 5c    "/sqlite3.dll\
1d250 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72  "... " [file ver
1d260 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  sion \..        
1d270 20 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61          [getBina
1d280 72 79 46 69 6c 65 4e 61 6d 65 20 73 71 6c 69 74  ryFileName sqlit
1d290 65 33 2e 64 6c 6c 20 24 61 72 63 68 69 74 65 63  e3.dll $architec
1d2a0 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20  ture]] \n]..    
1d2b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d2c0 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
1d2d0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d2e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1d2f0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d310 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f  ---- file versio
1d320 6e 20 6f 66 20 5c 22 22 20 24 61 72 63 68 69 74  n of \"" $archit
1d330 65 63 74 75 72 65 20 5c 0d 0a 20 20 20 20 20 20  ecture \..      
1d340 20 20 20 20 20 20 20 20 20 20 22 2f 53 51 4c 69            "/SQLi
1d350 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22  te.Interop.dll\"
1d360 2e 2e 2e 20 22 20 5b 66 69 6c 65 20 76 65 72 73  ... " [file vers
1d370 69 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ion \..         
1d380 20 20 20 20 20 20 20 5b 67 65 74 42 69 6e 61 72         [getBinar
1d390 79 46 69 6c 65 4e 61 6d 65 20 53 51 4c 69 74 65  yFileName SQLite
1d3a0 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 61 72  .Interop.dll $ar
1d3b0 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d  chitecture]] \n]
1d3c0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d3d0 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68  .          catch
1d3e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d3f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1d400 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1d410 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1d420 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
1d430 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 24  version of \"" $
1d440 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 0d 0a  architecture \..
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 22 2f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  "/System.Data.SQ
1d470 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  Lite.dll\"... " 
1d480 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c 0d  [file version \.
1d490 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d4a0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
1d4b0 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
1d4c0 53 51 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68  SQLite.dll $arch
1d4d0 69 74 65 63 74 75 72 65 5d 5d 20 5c 6e 5d 0d 0a  itecture]] \n]..
1d4e0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d4f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d500 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1d510 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69  OTE: Grab the li
1d520 73 74 20 6f 66 20 6d 61 6e 61 67 65 64 20 61 73  st of managed as
1d530 73 65 6d 62 6c 69 65 73 20 66 6f 72 20 74 68 65  semblies for the
1d540 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
1d550 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1d560 20 20 61 6e 64 20 72 65 70 6f 72 74 20 6f 6e 20    and report on 
1d570 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
1d580 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f  SQLite related o
1d590 6e 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  nes...        #.
1d5a0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
1d5b0 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f  veSQLiteObjectCo
1d5c0 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a  mmand]} then {..
1d5d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 61 73            set as
1d5e0 73 65 6d 62 6c 69 65 73 20 5b 6f 62 6a 65 63 74  semblies [object
1d5f0 20 69 6e 76 6f 6b 65 20 41 70 70 44 6f 6d 61 69   invoke AppDomai
1d600 6e 2e 43 75 72 72 65 6e 74 44 6f 6d 61 69 6e 20  n.CurrentDomain 
1d610 47 65 74 41 73 73 65 6d 62 6c 69 65 73 5d 0d 0a  GetAssemblies]..
1d620 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
1d630 63 74 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d  ct foreach assem
1d640 62 6c 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20  bly $assemblies 
1d650 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1d660 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
1d670 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
1d680 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
1d690 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1d6a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1d6b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1d6c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64  "---- found load
1d6f0 65 64 20 61 73 73 65 6d 62 6c 79 3a 20 22 20 24  ed assembly: " $
1d700 61 73 73 65 6d 62 6c 79 20 5c 6e 5d 0d 0a 20 20  assembly \n]..  
1d710 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d720 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d730 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
1d740 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1d750 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1d760 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
1d770 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
1d780 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20  efine constants 
1d790 66 6f 72 20 5c 22 53 79 73 74 65 6d 2e 44 61 74  for \"System.Dat
1d7a0 61 2e 53 51 4c 69 74 65 5c 22 2e 2e 2e 20 22 0d  a.SQLite\"... ".
1d7b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
1d7c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
1d7d0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
1d7e0 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
1d7f0 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
1d800 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
1d810 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
1d820 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e 73 74  ite3 DefineConst
1d830 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ants..          
1d840 7d 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  } defineConstant
1d850 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
1d860 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1d870 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1d880 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b  el [appendArgs [
1d890 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73 6f 72  formatList [lsor
1d8a0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
1d8b0 20 20 20 20 20 24 64 65 66 69 6e 65 43 6f 6e 73       $defineCons
1d8c0 74 61 6e 74 73 5d 20 3c 6e 6f 6e 65 3e 5d 20 5c  tants] <none>] \
1d8d0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  n]..          } 
1d8e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d8f0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1d900 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77  t_channel unknow
1d910 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  n\n..          }
1d920 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
1d930 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
1d940 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d950 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1d960 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d970 20 22 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 76 65   "---- source ve
1d980 72 73 69 6f 6e 20 6f 66 20 5c 22 53 79 73 74 65  rsion of \"Syste
1d990 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
1d9a0 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  l\"... "....    
1d9b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d9c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1d9d0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
1d9e0 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
1d9f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1da00 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
1da10 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
1da20 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 56  ection ProviderV
1da30 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
1da40 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20    } version] == 
1da50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
1da60 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
1da70 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
1da80 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
1da90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1daa0 73 65 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c  set version null
1dab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1dac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1dad0 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1dae0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
1daf0 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a 20 20 20  version \n]..   
1db00 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1db10 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
1db20 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
1db30 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20  el unknown\n..  
1db40 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1db50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1db60 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
1db70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1db80 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  _channel \..    
1db90 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
1dba0 73 6f 75 72 63 65 20 63 68 65 63 6b 6f 75 74 20  source checkout 
1dbb0 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61  of \"System.Data
1dbc0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
1dbd0 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   "....          
1dbe0 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
1dbf0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
1dc00 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
1dc10 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
1dc30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1dc40 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
1dc50 20 50 72 6f 76 69 64 65 72 53 6f 75 72 63 65 49   ProviderSourceI
1dc60 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 73  d..          } s
1dc70 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
1dc80 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1dc90 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
1dca0 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
1dcb0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1dcd0 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1dcf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1dd00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1dd10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
1dd20 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
1dd30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1dd50 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1dd60 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
1dd70 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1dd80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
1dd90 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1dda0 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
1ddb0 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
1ddc0 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
1ddd0 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
1dde0 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
1ddf0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1de00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1de10 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
1de20 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
1de30 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
1de40 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
1de50 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
1de60 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
1de70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1de80 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
1de90 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
1dea0 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
1deb0 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
1dec0 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
1ded0 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
1dee0 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
1def0 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
1df00 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
1df10 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
1df20 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
1df30 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
1df40 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
1df50 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
1df60 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
1df70 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
1df80 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
1df90 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
1dfa0 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
1dfb0 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
1dfc0 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
1dfd0 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
1dfe0 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
1dff0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1e000 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
1e010 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
1e020 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
1e030 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e040 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
1e050 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
1e060 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
1e070 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
1e080 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1e090 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
1e0a0 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
1e0b0 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
1e0c0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1e0d0 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
1e0e0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
1e0f0 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
1e100 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
1e110 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
1e120 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
1e130 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
1e140 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
1e150 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1e160 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
1e170 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
1e180 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
1e190 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
1e1a0 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
1e1b0 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
1e1c0 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
1e1d0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
1e1e0 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
1e1f0 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
1e200 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
1e210 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1e220 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
1e230 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
1e240 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
1e250 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
1e260 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
1e270 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
1e280 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
1e290 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
1e2a0 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
1e2b0 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
1e2c0 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
1e2d0 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
1e2e0 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
1e2f0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
1e300 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
1e310 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
1e320 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
1e330 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e340 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
1e350 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
1e360 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
1e370 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
1e380 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
1e390 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
1e3a0 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
1e3b0 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
1e3c0 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
1e3d0 53 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44  S INTEROP_INCLUD
1e3e0 45 5f 43 45 52 4f 44 20 5c 0d 0a 20 20 20 20 20  E_CEROD \..     
1e3f0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 49         INTEROP_I
1e400 4e 43 4c 55 44 45 5f 45 58 54 52 41 20 49 4e 54  NCLUDE_EXTRA INT
1e410 45 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45  EROP_INCLUDE_SEE
1e420 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
1e430 5f 5a 49 50 56 46 53 20 5c 0d 0a 20 20 20 20 20  _ZIPVFS \..     
1e440 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 4c         INTEROP_L
1e450 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54 45  EGACY_CLOSE INTE
1e460 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50 5f  ROP_LOG INTEROP_
1e470 54 45 53 54 5f 45 58 54 45 4e 53 49 4f 4e 20 5c  TEST_EXTENSION \
1e480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 4e  ..            IN
1e490 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
1e4a0 42 4c 45 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33  BLE NET_20 NET_3
1e4b0 35 20 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20  5 NET_40 NET_45 
1e4c0 4e 45 54 5f 34 35 31 20 5c 0d 0a 20 20 20 20 20  NET_451 \..     
1e4d0 20 20 20 20 20 20 20 4e 45 54 5f 43 4f 4d 50 41         NET_COMPA
1e4e0 43 54 5f 32 30 20 50 4c 41 54 46 4f 52 4d 5f 43  CT_20 PLATFORM_C
1e4f0 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f 52 4b 20  OMPACTFRAMEWORK 
1e500 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56 45 5f 4c  PRELOAD_NATIVE_L
1e510 49 42 52 41 52 59 20 5c 0d 0a 20 20 20 20 20 20  IBRARY \..      
1e520 20 20 20 20 20 20 52 45 54 41 52 47 45 54 41 42        RETARGETAB
1e530 4c 45 20 53 51 4c 49 54 45 5f 53 54 41 4e 44 41  LE SQLITE_STANDA
1e540 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44 49 53 50  RD THROW_ON_DISP
1e550 4f 53 45 44 20 54 52 41 43 45 20 5c 0d 0a 20 20  OSED TRACE \..  
1e560 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 5f            TRACE_
1e570 43 4f 4e 4e 45 43 54 49 4f 4e 20 54 52 41 43 45  CONNECTION TRACE
1e580 5f 44 45 54 45 43 54 49 4f 4e 20 54 52 41 43 45  _DETECTION TRACE
1e590 5f 48 41 4e 44 4c 45 20 54 52 41 43 45 5f 50 52  _HANDLE TRACE_PR
1e5a0 45 4c 4f 41 44 20 5c 0d 0a 20 20 20 20 20 20 20  ELOAD \..       
1e5b0 20 20 20 20 20 54 52 41 43 45 5f 53 48 41 52 45       TRACE_SHARE
1e5c0 44 20 54 52 41 43 45 5f 53 54 41 54 45 4d 45 4e  D TRACE_STATEMEN
1e5d0 54 20 54 52 41 43 45 5f 57 41 52 4e 49 4e 47 20  T TRACE_WARNING 
1e5e0 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54  TRACK_MEMORY_BYT
1e5f0 45 53 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ES \..          
1e600 20 20 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41    USE_ENTITY_FRA
1e610 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f 49 4e 54  MEWORK_6 USE_INT
1e620 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f 50 52 45  EROP_DLL USE_PRE
1e630 50 41 52 45 5f 56 32 20 57 49 4e 44 4f 57 53 5d  PARE_V2 WINDOWS]
1e640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
1e650 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1e660 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
1e670 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1e680 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 20 69 6e  ion is listed in
1e690 20 74 68 65 20 6c 69 73 74 20 6f 66 0d 0a 20 20   the list of..  
1e6a0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1e6b0 22 64 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74  "define constant
1e6c0 73 22 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66  s" kept track of
1e6d0 20 62 79 20 74 68 65 20 6d 61 6e 61 67 65 64 20   by the managed 
1e6e0 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20  assembly...     
1e6f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e700 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65    checkForSQLite
1e710 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 24  DefineConstant $
1e720 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
1e730 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 0d 0a  defineConstant..
1e740 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1e750 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1e760 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
1e770 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
1e780 2e 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72  .SQLite provider
1e790 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69   was compiled wi
1e7a0 74 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  th..        #   
1e7b0 20 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20      support for 
1e7c0 61 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64 61  any encrypted da
1e7d0 74 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  tabases...      
1e7e0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
1e7f0 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
1e800 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1e810 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61      defineConsta
1e820 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt.System.Data.S
1e830 51 4c 69 74 65 2e 49 4e 54 45 52 4f 50 5f 43 4f  QLite.INTEROP_CO
1e840 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20  DEC] || \..     
1e850 20 20 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73         [haveCons
1e860 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20  traint \..      
1e870 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65            define
1e880 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d 2e  Constant.System.
1e890 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54 45  Data.SQLite.INTE
1e8a0 52 4f 50 5f 49 4e 43 4c 55 44 45 5f 53 45 45 5d  ROP_INCLUDE_SEE]
1e8b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e8c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1e8d0 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64   # NOTE: Yes, ad
1e8e0 64 20 67 65 6e 65 72 69 63 20 63 6f 6e 73 74 72  d generic constr
1e8f0 61 69 6e 74 20 66 6f 72 20 75 73 65 20 62 79 20  aint for use by 
1e900 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
1e910 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1e920 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
1e930 72 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74  raint System.Dat
1e940 61 2e 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74  a.SQLite.Encrypt
1e950 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ion..        }..
1e960 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1e970 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
1e980 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62  ck the current b
1e990 75 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69  uild year.  Basi
1e9a0 63 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69  cally, this indi
1e9b0 63 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23  cates..        #
1e9c0 20 20 20 20 20 20 20 77 68 69 63 68 20 76 65 72         which ver
1e9d0 73 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20  sion of MSBuild 
1e9e0 61 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74  and/or Visual St
1e9f0 75 64 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f  udio was used to
1ea00 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1ea10 20 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73    compile the as
1ea20 73 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20  sembly binaries 
1ea30 75 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20  under test...   
1ea40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1ea50 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1ea60 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1ea70 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
1ea80 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
1ea90 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
1eaa0 20 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20   year... "....  
1eab0 20 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b        set year [
1eac0 67 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20  getBuildYear].. 
1ead0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
1eae0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
1eaf0 20 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61   buildYear. $yea
1eb00 72 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  r]..        tput
1eb10 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1eb20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
1eb30 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a   $year \"\n]....
1eb40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1eb50 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
1eb60 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69   the current bui
1eb70 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  ld .NET Framewor
1eb80 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74  k.  Basically, t
1eb90 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
1eba0 20 20 20 20 20 69 6e 64 69 63 61 74 65 73 20 77       indicates w
1ebb0 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20  hich version of 
1ebc0 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  the .NET Framewo
1ebd0 72 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20  rk is being..   
1ebe0 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1ebf0 64 20 62 79 20 74 68 65 20 61 73 73 65 6d 62 6c  d by the assembl
1ec00 79 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  y binaries under
1ec10 20 74 65 73 74 2e 0d 0a 20 20 20 20 20 20 20 20   test...        
1ec20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1ec30 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ec40 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1ec50 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1ec60 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
1ec70 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54  QLite build .NET
1ec80 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d   Framework... ".
1ec90 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  ...        set n
1eca0 65 74 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65  etFx [getBuildNe
1ecb0 74 46 78 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  tFx]..        ad
1ecc0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
1ecd0 65 6e 64 41 72 67 73 20 62 75 69 6c 64 46 72 61  endArgs buildFra
1ece0 6d 65 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d  mework. $netFx].
1ecf0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1ed00 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ed10 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 6e  appendArgs \" $n
1ed20 65 74 46 78 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20 20  etFx \"\n]....  
1ed30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ed40 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
1ed50 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
1ed60 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1ed70 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
1ed80 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 23  mally..        #
1ed90 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65 72         be either
1eda0 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c   "Debug" or "Rel
1edb0 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20 20  ease"...        
1edc0 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  #..        tputs
1edd0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1ede0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1edf0 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
1ee00 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
1ee10 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e 66  QLite build conf
1ee20 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d 0a  iguration... "..
1ee30 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
1ee40 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74  nfiguration [get
1ee50 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
1ee60 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64 64  on]..        add
1ee70 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
1ee80 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66  ndArgs buildConf
1ee90 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66  iguration. $conf
1eea0 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20  iguration]..    
1eeb0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1eec0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1eed0 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69 67  dArgs \" $config
1eee0 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a 0d  uration \"\n]...
1eef0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1ef00 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79 20      # NOTE: Try 
1ef10 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74 65  to setup an inte
1ef20 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20 75  rrupt callback u
1ef30 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74 20  sing the script 
1ef40 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20 20  debugger..      
1ef50 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20 77    #       that w
1ef60 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20 53  ill cancel all S
1ef70 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70 72  QL queries in pr
1ef80 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20 64  ogress for all d
1ef90 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20 20  atabase..       
1efa0 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
1efb0 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  ions known to th
1efc0 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d  is interpreter..
1efd0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1efe0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
1eff0 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74  xists ::no(sqlit
1f000 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61  eInterruptCallba
1f010 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ck)]} then {..  
1f020 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62 49          setupDbI
1f030 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b  nterruptCallback
1f040 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1f050 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20 20   $::test_log..  
1f060 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1f070 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
1f080 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
1f090 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74 69  the native runti
1f0a0 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63 68  me option, which
1f0b0 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20 61   would mean we a
1f0c0 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
1f0d0 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d 69      using the mi
1f0e0 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
1f0f0 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  y...        #.. 
1f100 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52         checkForR
1f110 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a  untimeOption $::
1f120 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61 74  test_channel nat
1f130 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ive....        #
1f140 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1f150 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 74  : Check if the t
1f160 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64  est suite should
1f170 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   count the numbe
1f180 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  r of connections
1f190 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f1a0 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20 22    "opened" and "
1f1b0 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68 65  closed" from the
1f1c0 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65 72   pool when deter
1f1d0 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73 74  mining if a test
1f1e0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1f1f0 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61 62    passed.  Disab
1f200 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76 69  ling this behavi
1f210 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  or is sometimes 
1f220 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e 0d  necessary (e.g..
1f230 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1f240 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c 65   during the rele
1f250 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63  ase testing proc
1f260 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68 65  ess) because the
1f270 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d 0a  re are several..
1f280 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1f290 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79 20  tests that rely 
1f2a0 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20 66  on the "opened f
1f2b0 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74 20  rom pool" count 
1f2c0 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a 20  being greater.. 
1f2d0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
1f2e0 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73 65  han zero.  These
1f2f0 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c 20   tests may fail 
1f300 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d 64  due to the non-d
1f310 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20 20  eterministic..  
1f320 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
1f330 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43 4c  havior of the CL
1f340 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e 20  R GC, even when 
1f350 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67 20  there is no bug 
1f360 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20 20  in the code..   
1f370 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 69       #       bei
1f380 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20 20  ng tested...    
1f390 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63      #..        c
1f3a0 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f 70  heckForRuntimeOp
1f3b0 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68 61  tion $::test_cha
1f3c0 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e 74  nnel noPoolCount
1f3d0 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  s....        #..
1f3e0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1f3f0 43 68 65 63 6b 20 69 66 20 74 68 65 20 74 65 73  Check if the tes
1f400 74 20 73 75 69 74 65 20 73 68 6f 75 6c 64 20 75  t suite should u
1f410 73 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  se shared-cache 
1f420 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  mode...        #
1f430 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
1f440 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
1f450 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1f460 73 68 61 72 65 64 43 61 63 68 65 0d 0a 0d 0a 20  sharedCache.... 
1f470 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f480 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74    # NOTE: Report
1f490 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73   the resource us
1f4a0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 72 75 6e  age prior to run
1f4b0 6e 69 6e 67 20 61 6e 79 20 74 65 73 74 73 2e 0d  ning any tests..
1f4c0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1f4d0 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74 65      reportSQLite
1f4e0 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65 73  Resources $::tes
1f4f0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
1f500 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f510 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65  # NOTE: Grab the
1f520 20 6c 69 73 74 20 6f 66 20 6e 61 74 69 76 65 20   list of native 
1f530 6d 6f 64 75 6c 65 73 20 66 6f 72 20 74 68 65 20  modules for the 
1f540 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
1f550 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20  and..        #  
1f560 20 20 20 20 20 72 65 70 6f 72 74 20 6f 6e 20 74       report on t
1f570 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  he System.Data.S
1f580 51 4c 69 74 65 20 72 65 6c 61 74 65 64 20 6f 6e  QLite related on
1f590 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es...        #..
1f5a0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
1f5b0 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
1f5c0 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
1f5d0 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 6f 64           set mod
1f5e0 75 6c 65 73 20 5b 6f 62 6a 65 63 74 20 69 6e 76  ules [object inv
1f5f0 6f 6b 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oke \..         
1f600 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67       System.Diag
1f610 6e 6f 73 74 69 63 73 2e 50 72 6f 63 65 73 73 2e  nostics.Process.
1f620 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1f630 73 20 4d 6f 64 75 6c 65 73 5d 0d 0a 0d 0a 20 20  s Modules]....  
1f640 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66          object f
1f650 6f 72 65 61 63 68 20 2d 61 6c 69 61 73 20 6d 6f  oreach -alias mo
1f660 64 75 6c 65 20 24 6d 6f 64 75 6c 65 73 20 7b 0d  dule $modules {.
1f670 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
1f680 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
1f690 54 45 3a 20 54 68 65 20 6d 6f 64 75 6c 65 20 66  TE: The module f
1f6a0 69 6c 65 20 6e 61 6d 65 20 68 65 72 65 20 6d 75  ile name here mu
1f6b0 73 74 20 62 65 20 6e 6f 72 6d 61 6c 69 7a 65 64  st be normalized
1f6c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
1f6d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
1f6e0 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65  t fileName [file
1f6f0 20 6e 6f 72 6d 61 6c 69 7a 65 20 5b 24 6d 6f 64   normalize [$mod
1f700 75 6c 65 20 46 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  ule FileName]]..
1f710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1f720 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
1f730 2d 6e 6f 63 61 73 65 20 2a 2f 73 71 6c 69 74 65  -nocase */sqlite
1f740 33 2e 64 6c 6c 20 24 66 69 6c 65 4e 61 6d 65 5d  3.dll $fileName]
1f750 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1f760 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1f770 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1f780 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f7a0 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f 61 64 65  ---- found loade
1f7b0 64 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65 20  d SQLite native 
1f7c0 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c 65 3a 20  library module: 
1f7d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
1f7e0 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d 65         $fileName
1f7f0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1f800 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 73 74 72    } elseif {[str
1f810 69 6e 67 20 6d 61 74 63 68 20 5c 0d 0a 20 20 20  ing match \..   
1f820 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 6e 6f               -no
1f830 63 61 73 65 20 2a 2f 53 51 4c 69 74 65 2e 49 6e  case */SQLite.In
1f840 74 65 72 6f 70 2e 64 6c 6c 20 24 66 69 6c 65 4e  terop.dll $fileN
1f850 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
1f860 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
1f870 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1f880 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
1f890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f8a0 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c     "---- found l
1f8b0 6f 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74  oaded SQLite int
1f8c0 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f  erop assembly mo
1f8d0 64 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20  dule: " \..     
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69               $fi
1f8f0 6c 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20  leName \n]..    
1f900 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1f910 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1f920 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
1f930 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1f940 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1f950 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
1f960 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d         "---- com
1f970 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
1f980 73 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72  s for SQLite cor
1f990 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a  e library... "..
1f9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1f9b0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1f9c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1f9d0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1f9e0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1f9f0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1fa00 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1fa10 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c  te3 SQLiteCompil
1fa20 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
1fa30 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
1fa40 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
1fa50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1fa60 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1fa70 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1fa80 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
1fa90 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
1faa0 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
1fab0 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
1fac0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1fad0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1fae0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
1faf0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
1fb00 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
1fb10 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1fb20 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b  .        catch {
1fb30 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
1fb40 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
1fb50 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
1fb60 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65     "---- compile
1fb70 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f  -time options fo
1fb80 72 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  r SQLite interop
1fb90 20 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a   assembly... "..
1fba0 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
1fbb0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
1fbc0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1fbd0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1fbe0 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
1fbf0 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
1fc00 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69  Data.SQLite.SQLi
1fc10 74 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69  te3 InteropCompi
1fc20 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20  leOptions..     
1fc30 20 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70       } compileOp
1fc40 74 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65  tions] == 0} the
1fc50 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fc60 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1fc70 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fc80 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b  gs [formatList [
1fc90 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20  lsort \..       
1fca0 20 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c           $compil
1fcb0 65 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e  eOptions] <none>
1fcc0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
1fcd0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
1fce0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1fcf0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b  test_channel unk
1fd00 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20  nown\n..        
1fd10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1fd20 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1fd30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f       # NOTE: Sho
1fd40 77 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73  w the active tes
1fd50 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a  t constraints...
1fd60 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fd70 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1fd80 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1fd90 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74  Args "---- const
1fda0 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20  raints: " \..   
1fdb0 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74           [format
1fdc0 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74  List [lsort [get
1fdd0 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e  Constraints]] <n
1fde0 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  one>] \n]....   
1fdf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fe00 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65  # NOTE: Save the
1fe10 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
1fe20 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72  s for use by thr
1fe30 65 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20  eads created in 
1fe40 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20  this..        # 
1fe50 20 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f        applicatio
1fe60 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20  n domain.  This 
1fe70 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
1fe80 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67  ause all the Eag
1fe90 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
1fea0 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78      "test contex
1feb0 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  t" information i
1fec0 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20  s per-thread... 
1fed0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1fee0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1fef0 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74  sts ::test_const
1ff00 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d  raints]} then {.
1ff10 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1ff20 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74  :test_constraint
1ff30 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73  s $::eagle_tests
1ff40 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20  (constraints).. 
1ff50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ff60 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ff70 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20   NOTE: Load the 
1ff80 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e  "after-constrain
1ff90 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  ts" custom per-u
1ffa0 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
1ffb0 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ost..        #  
1ffc0 20 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e       test settin
1ffd0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
1ffe0 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65   #..        uple
1fff0 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64  vel 1 [list load
20000 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
20010 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  gs $::test_chann
20020 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20  el .after]....  
20030 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
20040 20 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65   # NOTE: If nece
20050 73 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68  ssary, enable sh
20060 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
20070 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  now...        #.
20080 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61  .        if {[ha
20090 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73  sRuntimeOption s
200a0 68 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65  haredCache]} the
200b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65  n {..          e
200c0 6e 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65  nableSharedCache
200d0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
200e0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
200f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
20100 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
20110 68 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73  how when our tes
20120 74 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61  ts actually bega
20130 6e 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20  n (now)...      
20140 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75    #..        tpu
20150 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
20160 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
20170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
20180 2d 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  --- System.Data.
20190 53 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67  SQLite tests beg
201a0 61 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20  an at " \..     
201b0 20 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f         [clock fo
201c0 72 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f  rmat [clock seco
201d0 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  nds]] \n]..     
201e0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
201f0 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65    proc runSQLite
20200 54 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75  TestFilesPrologu
20210 65 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70  e {} {..      up
20220 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20  level 1 {..     
20230 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20240 4e 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20  NOTE: Setup the 
20250 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72  variables that r
20260 65 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69  efer to the vari
20270 6f 75 73 20 6e 6f 6e 2d 64 61 74 61 20 66 69 6c  ous non-data fil
20280 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  es..        #   
20290 20 20 20 20 72 65 71 75 69 72 65 64 20 62 79 20      required by 
202a0 74 68 65 20 74 65 73 74 73 20 69 6e 20 74 68 69  the tests in thi
202b0 73 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20  s file...       
202c0 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
202d0 65 6e 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44  entityFrameworkD
202e0 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  llFile \..      
202f0 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
20300 69 6c 65 4e 61 6d 65 20 45 6e 74 69 74 79 46 72  ileName EntityFr
20310 61 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 0d 0a 0d 0a  amework.dll]....
20320 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 73 74          set inst
20330 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5b 67 65  allerExeFile [ge
20340 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 49  tBuildFileName I
20350 6e 73 74 61 6c 6c 65 72 2e 65 78 65 5d 0d 0a 20  nstaller.exe].. 
20360 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 69 74         set sqlit
20370 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65  eDesignerDllFile
20380 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
20390 6d 65 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e  me SQLite.Design
203a0 65 72 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  er.dll]....     
203b0 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
203c0 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 20 5c  aSQLiteDllFile \
203d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
203e0 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
203f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
20400 74 65 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  te.dll]....     
20410 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74     set systemDat
20420 61 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69  aSQLiteLinqDllFi
20430 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
20440 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
20450 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ame System.Data.
20460 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5d  SQLite.Linq.dll]
20470 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
20480 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
20490 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20  Ef6DllFile \..  
204a0 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42 75            [getBu
204b0 69 6c 64 46 69 6c 65 4e 61 6d 65 20 53 79 73 74  ildFileName Syst
204c0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 45  em.Data.SQLite.E
204d0 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20 20  F6.dll]....     
204e0 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46 69     set testExeFi
204f0 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65  le [getBuildFile
20500 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 5d 0d 0a  Name test.exe]..
20510 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
20520 4c 69 6e 71 45 78 65 46 69 6c 65 20 5b 67 65 74  LinqExeFile [get
20530 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 74 65  BuildFileName te
20540 73 74 6c 69 6e 71 2e 65 78 65 5d 0d 0a 20 20 20  stlinq.exe]..   
20550 20 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36       set testEf6
20560 45 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c  ExeFile [getBuil
20570 64 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66  dFileName testef
20580 36 2e 65 78 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  6.exe]....      
20590 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
205a0 4f 54 45 3a 20 53 65 74 75 70 20 74 68 65 20 76  OTE: Setup the v
205b0 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 72 65  ariables that re
205c0 66 65 72 20 74 6f 20 74 68 65 20 76 61 72 69 6f  fer to the vario
205d0 75 73 20 64 61 74 61 20 66 69 6c 65 73 0d 0a 20  us data files.. 
205e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72         #       r
205f0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 74  equired by the t
20600 65 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ests in this fil
20610 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
20620 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 4c         set testL
20630 69 6e 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65  inqOutFile [file
20640 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
20650 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
20660 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
20670 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65  TestDataPath] te
20680 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a  stlinq.out]]....
20690 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f 72 74          set nort
206a0 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5b 66  hwindEfDbFile [f
206b0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
206c0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
206d0 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 64           [file d
206e0 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64 69 72  irname [file dir
206f0 6e 61 6d 65 20 5b 67 65 74 53 51 4c 69 74 65 54  name [getSQLiteT
20700 65 73 74 44 61 74 61 50 61 74 68 5d 5d 5d 20 5c  estDataPath]]] \
20710 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
20720 73 74 6c 69 6e 71 20 6e 6f 72 74 68 77 69 6e 64  stlinq northwind
20730 45 46 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  EF.db]]....     
20740 20 20 20 73 65 74 20 6e 6f 6e 57 61 6c 44 62 46     set nonWalDbF
20750 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
20760 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
20770 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
20780 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
20790 61 50 61 74 68 5d 20 6e 6f 6e 57 61 6c 2e 64 62  aPath] nonWal.db
207a0 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
207b0 74 20 77 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  t walDbFile [fil
207c0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
207d0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
207e0 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
207f0 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 77  eTestDataPath] w
20800 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20  al.db]]....     
20810 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
20820 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69 6f 75  NOTE: The variou
20830 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e 73 74  s install/uninst
20840 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20 75 73  all log files us
20850 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 0d 0a  ed to test the..
20860 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
20870 64 65 73 69 67 6e 2d 74 69 6d 65 20 63 6f 6d 70  design-time comp
20880 6f 6e 65 6e 74 20 69 6e 73 74 61 6c 6c 65 72 2e  onent installer.
20890 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
208a0 20 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73       set testIns
208b0 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
208c0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
208d0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
208e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
208f0 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
20900 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
20910 65 73 74 5f 56 73 32 30 30 35 2e 6c 6f 67 5d 5d  est_Vs2005.log]]
20920 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
20930 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30  testInstallVs200
20940 38 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  8LogFile [file n
20950 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
20960 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
20970 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
20980 73 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74  stDataPath] Inst
20990 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
209a0 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  8.log]]....     
209b0 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
209c0 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
209d0 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
209e0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
209f0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 53             [getS
20a00 51 4c 69 74 65 54 65 73 74 44 61 74 61 50 61 74  QLiteTestDataPat
20a10 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73  h] Installer_Tes
20a20 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a  t_Vs2010.log]]..
20a30 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65  ..        set te
20a40 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
20a50 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
20a60 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
20a70 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
20a80 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
20a90 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
20aa0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 32 2e  ler_Test_Vs2012.
20ab0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
20ac0 20 73 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c   set testInstall
20ad0 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5b 66  Vs2013LogFile [f
20ae0 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
20af0 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20  file join \..   
20b00 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
20b10 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
20b20 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
20b30 56 73 32 30 31 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2013.log]]....
20b40 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
20b50 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c  UninstallVs2005L
20b60 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
20b70 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
20b80 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
20b90 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
20ba0 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
20bb0 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30  aller_Test_Vs200
20bc0 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  5.log]]....     
20bd0 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e 73     set testUnins
20be0 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
20bf0 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
20c00 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
20c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
20c20 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
20c30 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65 72  ath] Uninstaller
20c40 5f 54 65 73 74 5f 56 73 32 30 30 38 2e 6c 6f 67  _Test_Vs2008.log
20c50 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65  ]]....        se
20c60 74 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  t testUninstallV
20c70 73 32 30 31 30 4c 6f 67 46 69 6c 65 20 5b 66 69  s2010LogFile [fi
20c80 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
20c90 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20  ile join \..    
20ca0 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
20cb0 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
20cc0 55 6e 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74  Uninstaller_Test
20cd0 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d  _Vs2010.log]]...
20ce0 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73  .        set tes
20cf0 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32  tUninstallVs2012
20d00 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
20d10 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
20d20 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
20d30 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
20d40 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
20d50 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
20d60 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  12.log]]....    
20d70 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
20d80 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69  stallVs2013LogFi
20d90 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
20da0 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
20db0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67  ..            [g
20dc0 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
20dd0 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c 6c 65  Path] Uninstalle
20de0 72 5f 54 65 73 74 5f 56 73 32 30 31 33 2e 6c 6f  r_Test_Vs2013.lo
20df0 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  g]]....        #
20e00 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e40 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
20e50 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
20e60 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
20e70 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
20e80 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
20e90 69 6c 20 24 65 6e 74 69 74 79 46 72 61 6d 65 77  il $entityFramew
20ea0 6f 72 6b 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20 74  orkDllFile]]]} t
20eb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20ec0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
20ed0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74  est_channel $ent
20ee0 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46  ityFrameworkDllF
20ef0 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
20f00 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
20f10 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
20f20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
20f30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20f40 5b 66 69 6c 65 20 74 61 69 6c 20 24 69 6e 73 74  [file tail $inst
20f50 61 6c 6c 65 72 45 78 65 46 69 6c 65 5d 5d 5d 7d  allerExeFile]]]}
20f60 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20f70 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
20f80 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69  $test_channel $i
20f90 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20  nstallerExeFile 
20fa0 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20  Installer.exe.. 
20fb0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20fc0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
20fd0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
20fe0 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
20ff0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21000 74 61 69 6c 20 24 73 71 6c 69 74 65 44 65 73 69  tail $sqliteDesi
21010 67 6e 65 72 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  gnerDllFile]]]} 
21020 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
21030 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
21040 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71  test_channel $sq
21050 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46  liteDesignerDllF
21060 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
21070 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
21080 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
21090 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
210a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
210b0 5b 66 69 6c 65 20 74 61 69 6c 20 24 73 79 73 74  [file tail $syst
210c0 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c 46  emDataSQLiteDllF
210d0 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
210e0 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
210f0 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
21100 6e 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61  nnel $systemData
21110 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20  SQLiteDllFile.. 
21120 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21130 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21140 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21150 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21160 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21170 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
21180 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
21190 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e]]]} then {..  
211a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
211b0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
211c0 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
211d0 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d  LiteLinqDllFile.
211e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
211f0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21200 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21210 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21220 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
21230 65 20 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61  e tail $systemDa
21240 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
21250 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21260 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21270 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
21280 6e 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53  nel $systemDataS
21290 51 4c 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d  QLiteEf6DllFile.
212a0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
212b0 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
212c0 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
212d0 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
212e0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
212f0 65 20 74 61 69 6c 20 24 74 65 73 74 45 78 65 46  e tail $testExeF
21300 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
21310 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
21320 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
21330 6e 6e 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c  nnel $testExeFil
21340 65 20 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20  e test.exe..    
21350 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21360 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74   if {![haveConst
21370 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
21380 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20  s file_ \..     
21390 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69         [file tai
213a0 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
213b0 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
213c0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
213d0 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
213e0 6e 65 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65  nel $testLinqExe
213f0 46 69 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78  File testlinq.ex
21400 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
21410 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
21420 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
21430 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
21440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
21450 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 45 66  ile tail $testEf
21460 36 45 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  6ExeFile]]]} the
21470 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21480 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21490 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45  t_channel $testE
214a0 66 36 45 78 65 46 69 6c 65 20 74 65 73 74 65 66  f6ExeFile testef
214b0 36 2e 65 78 65 0d 0a 20 20 20 20 20 20 20 20 7d  6.exe..        }
214c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
214d0 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
214e0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
214f0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
21500 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
21510 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 5d 5d 5d  stLinqOutFile]]]
21520 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
21530 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65      checkForFile
21540 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24   $test_channel $
21550 74 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d  testLinqOutFile.
21560 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21570 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21580 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21590 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
215a0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
215b0 65 20 74 61 69 6c 20 24 6e 6f 72 74 68 77 69 6e  e tail $northwin
215c0 64 45 66 44 62 46 69 6c 65 5d 5d 5d 7d 20 74 68  dEfDbFile]]]} th
215d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
215e0 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
215f0 73 74 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74  st_channel $nort
21600 68 77 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20  hwindEfDbFile.. 
21610 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
21620 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
21630 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
21640 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
21650 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
21660 74 61 69 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69  tail $nonWalDbFi
21670 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
21680 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
21690 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
216a0 6e 65 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c  nel $nonWalDbFil
216b0 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  e..        }....
216c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
216d0 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
216e0 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
216f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
21700 69 6c 65 20 74 61 69 6c 20 24 77 61 6c 44 62 46  ile tail $walDbF
21710 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
21720 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46            checkF
21730 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61  orFile $test_cha
21740 6e 6e 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d  nnel $walDbFile.
21750 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21760 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21770 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21780 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21790 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
217a0 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
217b0 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
217c0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
217d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
217e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
217f0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
21800 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
21810 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21820 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21830 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21840 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21850 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21860 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56  il $testInstallV
21870 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d 5d 7d  s2008LogFile]]]}
21880 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
21890 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20     checkForFile 
218a0 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74  $test_channel $t
218b0 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
218c0 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20  LogFile..       
218d0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66   }....        if
218e0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
218f0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
21900 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
21910 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
21920 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31  testInstallVs201
21930 30 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65  0LogFile]]]} the
21940 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  n {..          c
21950 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
21960 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49  t_channel $testI
21970 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46  nstallVs2010LogF
21980 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ile..        }..
21990 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
219a0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
219b0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
219c0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
219d0 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74  [file tail $test
219e0 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67  InstallVs2012Log
219f0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
21a00 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b  .          check
21a10 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
21a20 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61  annel $testInsta
21a30 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d  llVs2012LogFile.
21a40 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21a50 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65        if {![have
21a60 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65  Constraint [appe
21a70 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a  ndArgs file_ \..
21a80 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
21a90 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74  e tail $testInst
21aa0 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
21ab0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
21ac0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
21ad0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
21ae0 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  l $testInstallVs
21af0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
21b00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21b10 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21b20 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21b30 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21b40 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21b50 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
21b60 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65 5d 5d  lVs2005LogFile]]
21b70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21b80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21b90 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21ba0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
21bb0 32 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2005LogFile..   
21bc0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21bd0 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21be0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21bf0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21c00 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21c10 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
21c20 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65 5d 5d  lVs2008LogFile]]
21c30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21c40 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21c50 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21c60 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
21c70 32 30 30 38 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2008LogFile..   
21c80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21c90 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21ca0 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21cb0 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21cc0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21cd0 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
21ce0 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 5d 5d  lVs2010LogFile]]
21cf0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21d00 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21d10 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21d20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
21d30 32 30 31 30 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2010LogFile..   
21d40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21d50 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21d60 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21d70 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21d80 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21d90 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
21da0 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
21db0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21dc0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21dd0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21de0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
21df0 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2012LogFile..   
21e00 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
21e10 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
21e20 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
21e30 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
21e40 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
21e50 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74 61 6c  il $testUninstal
21e60 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 5d 5d  lVs2013LogFile]]
21e70 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
21e80 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
21e90 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
21ea0 24 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73  $testUninstallVs
21eb0 32 30 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20  2013LogFile..   
21ec0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
21ed0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
21ee0 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73  roc runSQLiteTes
21ef0 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65 20 7b  tFilesEpilogue {
21f00 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
21f10 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
21f20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
21f30 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
21f40 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
21f50 32 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74  2013LogFile test
21f60 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  UninstallVs2012L
21f70 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20  ogFile \..      
21f80 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73 74        testUninst
21f90 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
21fa0 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73   testUninstallVs
21fb0 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20  2008LogFile \.. 
21fc0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 55             testU
21fd0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 35 4c 6f  ninstallVs2005Lo
21fe0 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61 6c  gFile testInstal
21ff0 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65 20 5c  lVs2013LogFile \
22000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ..            te
22010 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c  stInstallVs2012L
22020 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74 61  ogFile testInsta
22030 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
22040 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
22050 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38  estInstallVs2008
22060 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73 74  LogFile testInst
22070 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
22080 0d 0a 0d 0a 20 20 20 20 20 20 20 20 75 6e 73 65  ....        unse
22090 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d  t -nocomplain \.
220a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72  .            nor
220b0 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74  thwindEfDbFile t
220c0 65 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c  estLinqOutFile \
220d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 61  ..            wa
220e0 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
220f0 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
22100 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
22110 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
22120 20 74 65 73 74 45 66 36 45 78 65 46 69 6c 65 20   testEf6ExeFile 
22130 74 65 73 74 4c 69 6e 71 45 78 65 46 69 6c 65 20  testLinqExeFile 
22140 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  \..            t
22150 65 73 74 45 78 65 46 69 6c 65 20 73 79 73 74 65  estExeFile syste
22160 6d 44 61 74 61 53 51 4c 69 74 65 45 66 36 44 6c  mDataSQLiteEf6Dl
22170 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  lFile \..       
22180 20 20 20 20 20 73 79 73 74 65 6d 44 61 74 61 53       systemDataS
22190 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65  QLiteLinqDllFile
221a0 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
221b0 65 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20 20 20 20  eDllFile \..    
221c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 44 65          sqliteDe
221d0 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 69 6e  signerDllFile in
221e0 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 5c  stallerExeFile \
221f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ..            en
22200 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
22210 46 69 6c 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  File..      }.. 
22220 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
22230 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74 45  c runSQLiteTestE
22240 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20  pilogue {} {..  
22250 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
22260 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e  OTE: Skip runnin
22270 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70 69  g our custom epi
22280 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69  logue if the mai
22290 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a  n one has been..
222a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b        #       sk
222b0 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  ipped...      #.
222c0 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66  .      if {![inf
222d0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70  o exists ::no(ep
222e0 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20  ilogue.eagle)]} 
222f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
22300 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
22310 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75 72  E: Show when our
22320 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79 20   tests actually 
22330 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20 20  ended (now)...  
22340 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
22350 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22360 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22370 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22380 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e 44    "---- System.D
22390 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74 73  ata.SQLite tests
223a0 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a 20   ended at " \.. 
223b0 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f 63             [cloc
223c0 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b 20  k format [clock 
223d0 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a 0d  seconds]] \n]...
223e0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
223f0 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
22400 20 74 68 65 20 22 65 70 69 6c 6f 67 75 65 22 20   the "epilogue" 
22410 63 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20  custom per-user 
22420 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 20  and/or per-host 
22430 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  test..        # 
22440 20 20 20 20 20 20 73 65 74 74 69 6e 67 73 20 6e        settings n
22450 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
22460 20 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20          uplevel 
22470 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69  1 [list loadSQLi
22480 74 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24  teTestSettings $
22490 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e  ::test_channel .
224a0 65 70 69 6c 6f 67 75 65 5d 0d 0a 0d 0a 20 20 20  epilogue]....   
224b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
224c0 23 20 42 55 47 46 49 58 3a 20 42 65 66 6f 72 65  # BUGFIX: Before
224d0 20 63 68 65 63 6b 69 6e 67 20 74 68 65 20 66 69   checking the fi
224e0 6e 61 6c 20 72 65 73 6f 75 72 63 65 73 20 69 6e  nal resources in
224f0 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 2c 20   use by SQLite, 
22500 6d 61 6b 65 0d 0a 20 20 20 20 20 20 20 20 23 20  make..        # 
22510 20 20 20 20 20 20 20 20 73 75 72 65 20 62 6f 74          sure bot
22520 68 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20  h of the PRAGMA 
22530 72 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72  related director
22540 79 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65  y names are free
22550 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  d...        #.. 
22560 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53         checkForS
22570 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73  QLiteDirectories
22580 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
22590 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20 20   true....       
225a0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
225b0 54 45 3a 20 41 6c 73 6f 20 72 65 70 6f 72 74 20  TE: Also report 
225c0 74 68 65 20 72 65 73 6f 75 72 63 65 20 75 73 61  the resource usa
225d0 67 65 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  ge after running
225e0 20 74 68 65 20 74 65 73 74 73 2e 0d 0a 20 20 20   the tests...   
225f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
22600 72 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f  reportSQLiteReso
22610 75 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  urces $::test_ch
22620 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  annel....       
22630 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
22640 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20 63  TE: Report the c
22650 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63  ritical handle c
22660 6f 75 6e 74 73 20 61 66 74 65 72 20 72 75 6e 6e  ounts after runn
22670 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0d 0a  ing the tests...
22680 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
22690 20 20 20 67 65 74 53 51 4c 69 74 65 48 61 6e 64     getSQLiteHand
226a0 6c 65 43 6f 75 6e 74 73 20 24 3a 3a 74 65 73 74  leCounts $::test
226b0 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20  _channel....    
226c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
226d0 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73 73   NOTE: If necess
226e0 61 72 79 2c 20 64 69 73 61 62 6c 65 20 73 68 61  ary, disable sha
226f0 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
22700 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
22710 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
22720 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
22730 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
22740 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
22750 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
22760 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
22770 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d  false..        }
22780 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
22790 0d 0a 0c 0d 0a 20 20 20 20 23 23 23 23 23 23 23  .....    #######
227a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
227b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
227c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
227d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
227e0 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23  ####..    ######
227f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22800 23 23 23 23 23 23 23 20 45 4e 44 20 45 61 67 6c  ####### END Eagl
22810 65 20 4f 4e 4c 59 20 23 23 23 23 23 23 23 23 23  e ONLY #########
22820 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22830 23 23 23 23 23 0d 0a 20 20 20 20 23 23 23 23 23  #####..    #####
22840 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22850 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22860 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22870 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
22880 23 23 23 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20  ######..  }.... 
22890 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61   #..  # NOTE: Sa
228a0 76 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ve the name of t
228b0 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
228c0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
228d0 65 2e 0d 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21  e...  #..  if {!
228e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6d  [info exists com
228f0 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20  mon_directory]} 
22900 74 68 65 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20  then {..    set 
22910 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79  common_directory
22920 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b   [file dirname [
22930 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20  info script]].. 
22940 20 7d 0d 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e   }....  #..  # N
22950 4f 54 45 3a 20 50 72 6f 76 69 64 65 20 74 68 65  OTE: Provide the
22960 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
22970 69 74 65 20 74 65 73 74 20 70 61 63 6b 61 67 65  ite test package
22980 20 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65   to the interpre
22990 74 65 72 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63  ter...  #..  pac
229a0 6b 61 67 65 20 70 72 6f 76 69 64 65 20 53 79 73  kage provide Sys
229b0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
229c0 54 65 73 74 20 31 2e 30 0d 0a 7d 0d 0a           Test 1.0..}..