System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 26674e2a325dc8ffdaa03182a3d2f71ec71f4b2b:


0000: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0020: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0030: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0040: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d  ###############.
0050: 0a 23 0d 0a 23 20 63 6f 6d 6d 6f 6e 2e 65 61 67  .#..# common.eag
0060: 6c 65 20 2d 2d 0d 0a 23 0d 0a 23 20 57 72 69 74  le --..#..# Writ
0070: 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69 73 74 61  ten by Joe Mista
0080: 63 68 6b 69 6e 2e 0d 0a 23 20 52 65 6c 65 61 73  chkin...# Releas
0090: 65 64 20 74 6f 20 74 68 65 20 70 75 62 6c 69 63  ed to the public
00a0: 20 64 6f 6d 61 69 6e 2c 20 75 73 65 20 61 74 20   domain, use at 
00b0: 79 6f 75 72 20 6f 77 6e 20 72 69 73 6b 21 0d 0a  your own risk!..
00c0: 23 0d 0a 23 23 23 23 23 23 23 23 23 23 23 23 23  #..#############
00d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0110: 23 23 0d 0a 0d 0a 23 0d 0a 23 20 4e 4f 54 45 3a  ##....#..# NOTE:
0120: 20 55 73 65 20 6f 75 72 20 6f 77 6e 20 6e 61 6d   Use our own nam
0130: 65 73 70 61 63 65 20 68 65 72 65 20 62 65 63 61  espace here beca
0140: 75 73 65 20 65 76 65 6e 20 74 68 6f 75 67 68 20  use even though 
0150: 77 65 20 64 6f 20 6e 6f 74 20 64 69 72 65 63 74  we do not direct
0160: 6c 79 0d 0a 23 20 20 20 20 20 20 20 73 75 70 70  ly..#       supp
0170: 6f 72 74 20 6e 61 6d 65 73 70 61 63 65 73 20 6f  ort namespaces o
0180: 75 72 73 65 6c 76 65 73 2c 20 77 65 20 64 6f 20  urselves, we do 
0190: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 70 6f 6c 6c  not want to poll
01a0: 75 74 65 20 74 68 65 20 67 6c 6f 62 61 6c 0d 0a  ute the global..
01b0: 23 20 20 20 20 20 20 20 6e 61 6d 65 73 70 61 63  #       namespac
01c0: 65 20 69 66 20 74 68 69 73 20 73 63 72 69 70 74  e if this script
01d0: 20 61 63 74 75 61 6c 6c 79 20 65 6e 64 73 20 75   actually ends u
01e0: 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65  p being evaluate
01f0: 64 20 69 6e 20 54 63 6c 2e 0d 0a 23 0d 0a 6e 61  d in Tcl...#..na
0200: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 45  mespace eval ::E
0210: 61 67 6c 65 20 7b 0d 0a 20 20 69 66 20 7b 5b 69  agle {..  if {[i
0220: 73 45 61 67 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d  sEagle]} then {.
0230: 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
0240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0280: 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
0290: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02a0: 23 23 20 42 45 47 49 4e 20 45 61 67 6c 65 20 4f  ## BEGIN Eagle O
02b0: 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
02c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02d0: 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0300: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0310: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0320: 23 23 0d 0a 0d 0a 20 20 20 20 70 72 6f 63 20 67  ##....    proc g
0330: 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d 20 7b  etBuildYear {} {
0340: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0350: 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20   # NOTE: See if 
0360: 74 68 65 20 22 79 65 61 72 22 20 73 65 74 74 69  the "year" setti
0370: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
0380: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 75 73  ridden by the us
0390: 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20 20 20  er (e.g...      
03a0: 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65 20 63  #       on the c
03b0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
03c0: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
03d0: 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63 68 20  l exactly which 
03e0: 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20 23 20  set of..      # 
03f0: 20 20 20 20 20 20 62 69 6e 61 72 69 65 73 20 77        binaries w
0400: 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c 20 74  e are testing, t
0410: 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20 75 73  hose produced us
0420: 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c 20 53  ing the Visual S
0430: 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23 20 20  tudio..      #  
0440: 20 20 20 20 20 32 30 30 35 2c 20 32 30 30 38 2c       2005, 2008,
0450: 20 32 30 31 30 2c 20 32 30 31 32 2c 20 6f 72 20   2010, 2012, or 
0460: 32 30 31 33 20 62 75 69 6c 64 20 73 79 73 74 65  2013 build syste
0470: 6d 73 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65  ms.  To override
0480: 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20   this..      #  
0490: 20 20 20 20 20 76 61 6c 75 65 20 76 69 61 20 74       value via t
04a0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c  he command line,
04b0: 20 65 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64   enter a command
04c0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
04d0: 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  of..      #     
04e0: 20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    the following 
04f0: 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65  (all on one line
0500: 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ):..      #..   
0510: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0520: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0530: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0540: 73 74 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20  st_year 2005".. 
0550: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
0560: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
0570: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
0580: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
0590: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
05a0: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
05b0: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
05c0: 30 38 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  08"..      #    
05d0: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
05e0: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
05f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
0600: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
0610: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
0620: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
0630: 65 61 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20  ear 2010"..     
0640: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
0650: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
0660: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
0670: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
0680: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
0690: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
06a0: 74 65 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d  test_year 2012".
06b0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
06c0: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
06d0: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
06e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
06f0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
0700: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
0710: 20 22 73 65 74 20 74 65 73 74 5f 79 65 61 72 20   "set test_year 
0720: 32 30 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20  2013"..      #  
0730: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
0740: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
0750: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0760: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0770: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0780: 69 61 6c 69 7a 65 20 22 75 6e 73 65 74 20 2d 6e  ialize "unset -n
0790: 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f 79  ocomplain test_y
07a0: 65 61 72 22 0d 0a 20 20 20 20 20 20 23 20 20 20  ear"..      #   
07b0: 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61        -file .\pa
07c0: 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d  th\to\all.eagle.
07d0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
07e0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
07f0: 20 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 26 26   ::test_year] &&
0800: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0810: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5d 20 3e 20  $::test_year] > 
0820: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
0830: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
0840: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70  NOTE: Use the sp
0850: 65 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61  ecified test yea
0860: 72 2e 20 20 49 66 20 74 68 69 73 20 76 61 72 69  r.  If this vari
0870: 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 2c  able is not set,
0880: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
0890: 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 76 61        default va
08a0: 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61 73 65  lue will be base
08b0: 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  d on whether or 
08c0: 6e 6f 74 20 45 61 67 6c 65 20 68 61 73 20 62 65  not Eagle has be
08d0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  en..        #   
08e0: 20 20 20 20 63 6f 6d 70 69 6c 65 64 20 61 67 61      compiled aga
08f0: 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 32 2e  inst the CLR v2.
0900: 30 20 6f 72 20 43 4c 52 20 76 34 2e 30 2e 0d 0a  0 or CLR v4.0...
0910: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0920: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
0930: 74 5f 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20  t_year..      } 
0940: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0950: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
0960: 45 3a 20 49 66 20 45 61 67 6c 65 20 68 61 73 20  E: If Eagle has 
0970: 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 61 67  been compiled ag
0980: 61 69 6e 73 74 20 74 68 65 20 43 4c 52 20 76 34  ainst the CLR v4
0990: 2e 30 2c 20 75 73 65 20 22 32 30 31 30 22 20 62  .0, use "2010" b
09a0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
09b0: 20 20 20 64 65 66 61 75 6c 74 20 28 77 65 20 63     default (we c
09c0: 6f 75 6c 64 20 75 73 65 20 22 32 30 31 32 22 20  ould use "2012" 
09d0: 6f 72 20 22 32 30 31 33 22 20 69 6e 20 74 68 61  or "2013" in tha
09e0: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 20  t case as well) 
09f0: 61 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  as..        #   
0a00: 20 20 20 20 74 68 65 20 74 65 73 74 20 79 65 61      the test yea
0a10: 72 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73  r; otherwise, us
0a20: 65 20 22 32 30 30 38 22 20 62 79 20 64 65 66 61  e "2008" by defa
0a30: 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75 73  ult (we could us
0a40: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
0a50: 20 20 20 22 32 30 30 35 22 20 69 6e 20 74 68 61     "2005" in tha
0a60: 74 20 63 61 73 65 20 61 73 20 77 65 6c 6c 29 2e  t case as well).
0a70: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
0a80: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
0a90: 5d 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ]..        #    
0aa0: 20 20 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68     version of th
0ab0: 65 20 43 4c 52 20 69 73 20 72 65 6c 65 61 73 65  e CLR is release
0ac0: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
0ad0: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 0d 0a 20  ll have to be.. 
0ae0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
0af0: 68 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66  hanged.  The def
0b00: 61 75 6c 74 20 74 65 73 74 20 79 65 61 72 20 74  ault test year t
0b10: 6f 20 75 73 65 20 66 6f 72 20 61 20 70 61 72 74  o use for a part
0b20: 69 63 75 6c 61 72 20 43 4c 52 0d 0a 20 20 20 20  icular CLR..    
0b30: 20 20 20 20 23 20 20 20 20 20 20 20 76 65 72 73      #       vers
0b40: 69 6f 6e 20 6d 61 79 20 62 65 20 6f 76 65 72 72  ion may be overr
0b50: 69 64 64 65 6e 20 62 79 20 73 65 74 74 69 6e 67  idden by setting
0b60: 20 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   the global vari
0b70: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
0b80: 20 20 20 20 20 20 22 74 65 73 74 5f 79 65 61 72        "test_year
0b90: 5f 63 6c 72 5f 76 24 58 22 2c 20 77 68 65 72 65  _clr_v$X", where
0ba0: 20 22 24 58 22 20 6d 61 79 20 5b 63 75 72 72 65   "$X" may [curre
0bb0: 6e 74 6c 79 5d 20 62 65 20 65 69 74 68 65 72 20  ntly] be either 
0bc0: 22 32 22 0d 0a 20 20 20 20 20 20 20 20 23 20 20  "2"..        #  
0bd0: 20 20 20 20 20 6f 72 20 22 34 22 2e 0d 0a 20 20       or "4"...  
0be0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0bf0: 20 69 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72   if {[haveConstr
0c00: 61 69 6e 74 20 69 6d 61 67 65 52 75 6e 74 69 6d  aint imageRuntim
0c10: 65 34 30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  e40]} then {..  
0c20: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
0c30: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
0c40: 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20 26 26 20  year_clr_v4] && 
0c50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
0c60: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
0c70: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0c80: 5f 76 34 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  _v4] > 0} then {
0c90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
0cb0: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
0cc0: 63 69 66 69 65 64 20 74 65 73 74 20 79 65 61 72  cified test year
0cd0: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
0ce0: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
0cf0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
0d00: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
0d10: 61 72 5f 63 6c 72 5f 76 34 0d 0a 20 20 20 20 20  ar_clr_v4..     
0d20: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d40: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
0d50: 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c  : Use the defaul
0d60: 74 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  t test year for 
0d70: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
0d80: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
0d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0da0: 20 32 30 31 30 3b 20 23 20 54 4f 44 4f 3a 20 47   2010; # TODO: G
0db0: 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b 22 20 64  ood "fallback" d
0dc0: 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20 20 20 20  efault?..       
0dd0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
0de0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
0df0: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0e00: 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63  ts ::test_year_c
0e10: 6c 72 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20  lr_v2] && \..   
0e20: 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69             [stri
0e30: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
0e40: 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 5d 20 3e  t_year_clr_v2] >
0e50: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
0e60: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
0e70: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
0e80: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
0e90: 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20 74   test year for t
0ea0: 68 65 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20  he CLR v2.0...  
0eb0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
0ec0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
0ed0: 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c 72  $::test_year_clr
0ee0: 5f 76 32 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  _v2..          }
0ef0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
0f00: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f10: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
0f20: 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73 74  the default test
0f30: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
0f40: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
0f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0f60: 20 20 20 20 72 65 74 75 72 6e 20 32 30 30 38 3b      return 2008;
0f70: 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66   # TODO: Good "f
0f80: 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74  allback" default
0f90: 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ?..          }..
0fa0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
0fb0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
0fc0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 59    proc getBuildY
0fd0: 65 61 72 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  ears {} {..     
0fe0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
0ff0: 3a 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73  : See if the lis
1000: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1010: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64  has been overrid
1020: 64 65 6e 20 62 79 20 74 68 65 20 75 73 65 72 0d  den by the user.
1030: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 28  .      #       (
1040: 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  e.g. on the comm
1050: 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20  and line)...    
1060: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
1070: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65  info exists ::te
1080: 73 74 5f 79 65 61 72 73 5d 20 26 26 20 5b 6c 6c  st_years] && [ll
1090: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65  ength $::test_ye
10a0: 61 72 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ars] > 0} then {
10b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
10c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
10d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10e0: 69 73 74 20 6f 66 20 74 65 73 74 20 79 65 61 72  ist of test year
10f0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
1100: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
1110: 3a 74 65 73 74 5f 79 65 61 72 73 0d 0a 20 20 20  :test_years..   
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1130: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1140: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
1150: 64 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20  default list of 
1160: 74 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20  test years...   
1170: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1180: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1190: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
11a0: 20 32 30 31 33 5d 0d 0a 20 20 20 20 20 20 7d 0d   2013]..      }.
11b0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11c0: 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61 74  roc getBuildPlat
11d0: 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d 20  form { native } 
11e0: 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  {..      if {[in
11f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1200: 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c 0d  _platform] && \.
1210: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
1220: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1230: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d  t_platform] > 0}
1240: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1250: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1260: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
1270: 69 66 69 65 64 20 74 65 73 74 20 70 6c 61 74 66  ified test platf
1280: 6f 72 6d 2e 20 20 49 66 20 74 68 69 73 20 76 61  orm.  If this va
1290: 72 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65  riable is not se
12a0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
12b0: 20 20 20 20 74 68 65 20 64 65 66 61 75 6c 74 20      the default 
12c0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 62 61  value will be ba
12d0: 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 63 68 69  sed on the machi
12e0: 6e 65 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  ne architecture.
12f0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1300: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70       return [exp
1310: 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 24 3a 3a  r {$native ? $::
1320: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 3a 20  test_platform : 
1330: 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ""}]..      } el
1340: 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
1350: 74 73 20 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  ts ::test_machin
1360: 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  e] && \..       
1370: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
1380: 68 20 24 3a 3a 74 65 73 74 5f 6d 61 63 68 69 6e  h $::test_machin
1390: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
13a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13b0: 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e     # NOTE: For n
13c0: 61 74 69 76 65 20 62 75 69 6c 64 73 2c 20 72 65  ative builds, re
13d0: 74 75 72 6e 20 74 68 65 20 70 6c 61 74 66 6f 72  turn the platfor
13e0: 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  m name correspon
13f0: 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20 20 20 20  ding to..       
1400: 20 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73   #       the tes
1410: 74 20 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74  t machine archit
1420: 65 63 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73  ecture; otherwis
1430: 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70  e, return an emp
1440: 74 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  ty..        #   
1450: 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20      string...   
1460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1470: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e  return [expr {$n
1480: 61 74 69 76 65 20 3f 20 5b 6d 61 63 68 69 6e 65  ative ? [machine
1490: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 65  ToPlatform $::te
14a0: 73 74 5f 6d 61 63 68 69 6e 65 5d 20 3a 20 22 22  st_machine] : ""
14b0: 7d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  }]..      } else
14c0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
14d0: 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28   ::tcl_platform(
14e0: 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20  machine)]} then 
14f0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1500: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1510: 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64 73 2c  r native builds,
1520: 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c 61 74   return the plat
1530: 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72 65 73  form name corres
1540: 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20 20 20  ponding to..    
1550: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
1560: 6d 61 63 68 69 6e 65 20 61 72 63 68 69 74 65 63  machine architec
1570: 74 75 72 65 3b 20 6f 74 68 65 72 77 69 73 65 2c  ture; otherwise,
1580: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
1590: 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20   string...      
15a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
15b0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 6e 61 74 69  urn [expr {$nati
15c0: 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ve ? \..        
15d0: 20 20 20 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c      [machineToPl
15e0: 61 74 66 6f 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c  atform $::tcl_pl
15f0: 61 74 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d  atform(machine)]
1600: 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20 20 7d   : ""}]..      }
1610: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
1620: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
1630: 54 45 3a 20 4e 6f 20 6d 61 63 68 69 6e 65 20 61  TE: No machine a
1640: 72 63 68 69 74 65 63 74 75 72 65 20 69 73 20 61  rchitecture is a
1650: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
1660: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
1670: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
1690: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
16a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
16b0: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
16c0: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
16d0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
16e0: 53 65 65 20 69 66 20 74 68 65 20 22 63 6f 6e 66  See if the "conf
16f0: 69 67 75 72 61 74 69 6f 6e 22 20 73 65 74 74 69  iguration" setti
1700: 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  ng has been over
1710: 72 69 64 64 65 6e 20 62 79 20 74 68 65 0d 0a 20  ridden by the.. 
1720: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
1730: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
1740: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20 20 54  ommand line).  T
1750: 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74 72 6f  his helps contro
1760: 6c 20 65 78 61 63 74 6c 79 0d 0a 20 20 20 20 20  l exactly..     
1770: 20 23 20 20 20 20 20 20 20 77 68 69 63 68 20 73   #       which s
1780: 65 74 20 6f 66 20 62 69 6e 61 72 69 65 73 20 77  et of binaries w
1790: 65 20 61 72 65 20 74 65 73 74 69 6e 67 20 28 69  e are testing (i
17a0: 2e 65 2e 20 74 68 6f 73 65 20 62 75 69 6c 74 20  .e. those built 
17b0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
17c0: 20 20 20 20 20 20 22 44 65 62 75 67 22 20 6f 72        "Debug" or
17d0: 20 22 52 65 6c 65 61 73 65 22 20 62 75 69 6c 64   "Release" build
17e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 29   configurations)
17f0: 2e 20 20 54 6f 20 6f 76 65 72 72 69 64 65 20 74  .  To override t
1800: 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  his..      #    
1810: 20 20 20 76 61 6c 75 65 20 76 69 61 20 74 68 65     value via the
1820: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
1830: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
1840: 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20 6f 66  imilar to one of
1850: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1860: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
1870: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
1880: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1890: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
18a0: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
18b0: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
18c0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 44  _configuration D
18d0: 65 62 75 67 22 0d 0a 20 20 20 20 20 20 23 20 20  ebug"..      #  
18e0: 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70         -file .\p
18f0: 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65  ath\to\all.eagle
1900: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1910: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
1920: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
1930: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
1940: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 52  _configuration R
1950: 65 6c 65 61 73 65 22 0d 0a 20 20 20 20 20 20 23  elease"..      #
1960: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
1970: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
1980: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
1990: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
19a0: 53 68 65 6c 6c 2e 65 78 65 20 2d 66 69 6c 65 20  Shell.exe -file 
19b0: 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61  .\path\to\all.ea
19c0: 67 6c 65 20 2d 70 72 65 54 65 73 74 0d 0a 20 20  gle -preTest..  
19d0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 75      #         "u
19e0: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
19f0: 20 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74   test_configurat
1a00: 69 6f 6e 22 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ion"..      #.. 
1a10: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1a20: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
1a30: 66 69 67 75 72 61 74 69 6f 6e 5d 20 26 26 20 5c  figuration] && \
1a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
1a50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
1a60: 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st_configuration
1a70: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a80: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1a90: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1aa0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
1ab0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
1ac0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
1ad0: 75 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ue used..       
1ae0: 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68 69   #       for thi
1af0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 79  s variable is ty
1b00: 70 69 63 61 6c 6c 79 20 22 52 65 6c 65 61 73 65  pically "Release
1b10: 22 2c 20 61 73 20 73 65 74 20 62 79 20 74 68 65  ", as set by the
1b20: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
1b30: 20 20 20 20 20 20 20 73 75 69 74 65 20 69 74 73         suite its
1b40: 65 6c 66 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  elf...        #.
1b50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b60: 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72  $::test_configur
1b70: 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 7d 20 65  ation..      } e
1b80: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
1b90: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ba0: 3a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 77 65 20 77  : Normally, we w
1bb0: 69 6c 6c 20 6e 65 76 65 72 20 68 69 74 20 74 68  ill never hit th
1bc0: 69 73 20 63 61 73 65 20 62 65 63 61 75 73 65 20  is case because 
1bd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1be0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1bf0: 20 20 74 65 73 74 20 63 6f 6e 66 69 67 75 72 61    test configura
1c00: 74 69 6f 6e 20 76 61 72 69 61 62 6c 65 20 69 73  tion variable is
1c10: 20 61 6c 77 61 79 73 20 73 65 74 20 62 79 20 74   always set by t
1c20: 68 65 20 74 65 73 74 20 73 75 69 74 65 0d 0a 20  he test suite.. 
1c30: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
1c40: 74 73 65 6c 66 3b 20 68 6f 77 65 76 65 72 2c 20  tself; however, 
1c50: 69 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  it can be overri
1c60: 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 75  dden using the u
1c70: 6e 73 65 74 20 63 6f 6d 6d 61 6e 64 0d 0a 20 20  nset command..  
1c80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 72        #       fr
1c90: 6f 6d 20 74 68 65 20 2d 70 72 65 54 65 73 74 20  om the -preTest 
1ca0: 6f 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 65  option to the te
1cb0: 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20  st suite...     
1cc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
1cd0: 74 75 72 6e 20 24 3a 3a 65 61 67 6c 65 5f 70 6c  turn $::eagle_pl
1ce0: 61 74 66 6f 72 6d 28 63 6f 6e 66 69 67 75 72 61  atform(configura
1cf0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7d 0d 0a  tion)..      }..
1d00: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1d10: 6f 63 20 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  oc getBuildConfi
1d20: 67 75 72 61 74 69 6f 6e 73 20 7b 7d 20 7b 0d 0a  gurations {} {..
1d30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1d40: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
1d50: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  e list of test c
1d60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 68 61  onfigurations ha
1d70: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
1d80: 6e 20 62 79 0d 0a 20 20 20 20 20 20 23 20 20 20  n by..      #   
1d90: 20 20 20 20 74 68 65 20 75 73 65 72 20 28 65 2e      the user (e.
1da0: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
1db0: 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20  d line)...      
1dc0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
1dd0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
1de0: 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 5d  _configurations]
1df0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1e00: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
1e10: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  t_configurations
1e20: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1e30: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1e40: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
1e50: 65 20 73 70 65 63 69 66 69 65 64 20 6c 69 73 74  e specified list
1e60: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
1e70: 72 61 74 69 6f 6e 73 2e 0d 0a 20 20 20 20 20 20  rations...      
1e80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1e90: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  urn $::test_conf
1ea0: 69 67 75 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20  igurations..    
1eb0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ec0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
1ed0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1ee0: 65 66 61 75 6c 74 20 6c 69 73 74 20 6f 66 20 74  efault list of t
1ef0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
1f00: 6e 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ns...        #..
1f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
1f20: 6c 69 73 74 20 44 65 62 75 67 20 52 65 6c 65 61  list Debug Relea
1f30: 73 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  se]..      }..  
1f40: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1f50: 20 67 65 74 42 75 69 6c 64 42 61 73 65 44 69 72   getBuildBaseDir
1f60: 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20  ectory {} {..   
1f70: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1f80: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
1f90: 68 65 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  he base director
1fa0: 79 20 77 68 65 72 65 20 61 6c 6c 20 74 68 65 20  y where all the 
1fb0: 62 75 69 6c 64 73 20 73 68 6f 75 6c 64 20 62 65  builds should be
1fc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1fd0: 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20 77  located.  This w
1fe0: 69 6c 6c 20 62 65 20 74 68 65 20 64 69 72 65 63  ill be the direc
1ff0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2000: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 0d 0a 20  ns the actual.. 
2010: 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75 69       #       bui
2020: 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
2030: 6f 72 79 20 28 65 2e 67 2e 20 70 61 72 65 6e 74  ory (e.g. parent
2040: 20 6f 66 20 22 62 69 6e 22 29 2e 0d 0a 20 20 20   of "bin")...   
2050: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
2060: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 62  [info exists ::b
2070: 75 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74  uild_base_direct
2080: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
2090: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
20a0: 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 62 61 73  gth $::build_bas
20b0: 65 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  e_directory] > 0
20c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
20d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
20e0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
20f0: 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20 62  n of the build b
2100: 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 68 61  ase directory ha
2110: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
2120: 6e 3b 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  n;..        #   
2130: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 75      therefore, u
2140: 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0d  se it verbatim..
2150: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2160: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 62 75      return $::bu
2170: 69 6c 64 5f 62 61 73 65 5f 64 69 72 65 63 74 6f  ild_base_directo
2180: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
2190: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
21a0: 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74   ::common_direct
21b0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
21c0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
21d0: 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  gth $::common_di
21e0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
21f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
2200: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
2210: 20 4e 65 78 74 2c 20 66 61 6c 6c 62 61 63 6b 20   Next, fallback 
2220: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  to the parent di
2230: 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6f  rectory of the o
2240: 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0d 0a 20  ne containing.. 
2250: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2260: 68 69 73 20 66 69 6c 65 20 28 69 2e 65 2e 20 22  his file (i.e. "
2270: 63 6f 6d 6d 6f 6e 2e 65 61 67 6c 65 22 29 2c 20  common.eagle"), 
2280: 69 66 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20  if available... 
2290: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
22a0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64    return [file d
22b0: 69 72 6e 61 6d 65 20 24 3a 3a 63 6f 6d 6d 6f 6e  irname $::common
22c0: 5f 64 69 72 65 63 74 6f 72 79 5d 0d 0a 20 20 20  _directory]..   
22d0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e     } elseif {[in
22e0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 70 61 74 68  fo exists ::path
22f0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2300: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
2310: 20 24 3a 3a 70 61 74 68 5d 20 3e 20 30 7d 20 74   $::path] > 0} t
2320: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
2330: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
2340: 3a 20 46 69 6e 61 6c 6c 79 2c 20 66 61 6c 6c 62  : Finally, fallb
2350: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ack to the paren
2360: 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  t directory of t
2370: 68 65 20 45 61 67 6c 65 54 65 73 74 0d 0a 20 20  he EagleTest..  
2380: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61        #       pa
2390: 74 68 2e 20 20 54 68 65 20 45 61 67 6c 65 54 65  th.  The EagleTe
23a0: 73 74 20 70 61 63 6b 61 67 65 20 67 75 61 72 61  st package guara
23b0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 69 73 20  ntees that this 
23c0: 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20 20  variable..      
23d0: 20 20 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62    #       will b
23e0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 64 69 72  e set to the dir
23f0: 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
2400: 67 20 74 68 65 20 66 69 72 73 74 20 66 69 6c 65  g the first file
2410: 20 74 6f 0d 0a 20 20 20 20 20 20 20 20 23 20 20   to..        #  
2420: 20 20 20 20 20 65 78 65 63 75 74 65 20 74 68 65       execute the
2430: 20 5b 72 75 6e 54 65 73 74 50 72 6f 6c 6f 67 75   [runTestPrologu
2440: 65 5d 20 73 63 72 69 70 74 20 6c 69 62 72 61 72  e] script librar
2450: 79 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20  y procedure...  
2460: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2470: 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 64 69   return [file di
2480: 72 6e 61 6d 65 20 24 3a 3a 70 61 74 68 5d 0d 0a  rname $::path]..
2490: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
24a0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24b0: 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 70 61     # NOTE: No pa
24c0: 74 68 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  th is available,
24d0: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
24e0: 20 73 74 72 69 6e 67 2e 20 20 54 68 69 73 20 70   string.  This p
24f0: 6f 69 6e 74 0d 0a 20 20 20 20 20 20 20 20 23 20  oint..        # 
2500: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 6e 6f 74        should not
2510: 20 62 65 20 72 65 61 63 68 65 64 2e 0d 0a 20 20   be reached...  
2520: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2530: 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20   return ""..    
2540: 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
2550: 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64 4d     proc isMixedM
2560: 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  odeAssembly { fi
2570: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
2580: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  ""} } {..      #
2590: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25a0: 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72 65  First, make sure
25b0: 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
25c0: 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 69  infrastructure i
25d0: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20 20  s allowed to..  
25e0: 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65 20      #       use 
25f0: 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d 61  the [exec] comma
2600: 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  nd...      #..  
2610: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
2620: 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63 29  xists ::no(exec)
2630: 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73  ] && ![info exis
2640: 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67 73  ts ::no(corFlags
2650: 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
2660: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2670: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c 6f   NOTE: If the lo
2680: 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cation of CorFla
2690: 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  gs is present in
26a0: 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74   the environment
26b0: 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ,..        #    
26c0: 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65 72     use it; other
26d0: 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20 69  wise assume it i
26e0: 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d 0a  s in the PATH...
26f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2700: 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73 20     set corFlags 
2710: 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20 20  [expr {..       
2720: 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20     [info exists 
2730: 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29 5d  ::env(CorFlags)]
2740: 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c 61   ? $::env(CorFla
2750: 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73 22  gs) : "CorFlags"
2760: 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a  ..        }]....
2770: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2780: 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2790: 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43 6f  pt to execute Co
27a0: 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73 70  rFlags on the sp
27b0: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a 20  ecified file... 
27c0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
27d0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
27e0: 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20 2d            exec -
27f0: 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69 6c  - $corFlags [fil
2800: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66 69  e nativename $fi
2810: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
2820: 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20 74   } exec] == 0} t
2830: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2840: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2850: 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74  NOTE: If request
2860: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
2870: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 74  , attempt to det
2880: 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20 20  ermine the..    
2890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6c        #       pl
28a0: 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20 73  atform for the s
28b0: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61 73  pecified file as
28c0: 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   well...        
28d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69    #..          i
28e0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
28f0: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
2900: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2910: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2920: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f 72      # NOTE: Stor
2930: 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 69  e the platform i
2940: 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72 69  n the named vari
2950: 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20  able in the..   
2960: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2970: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
2980: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
2990: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29a0: 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
29b0: 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 0d  Name platform...
29c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
29e0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
29f0: 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c 69  xtract the PE li
2a00: 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70 74  ne from the capt
2a10: 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ured..          
2a20: 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75 74    #       output
2a30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
2a40: 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22 50   is "PE32" or "P
2a50: 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20 20  E32+", the..    
2a60: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2a70: 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69 73  assembly file is
2a80: 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62 69   32-bit or 64-bi
2a90: 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 3b  t, respectively;
2aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2ab0: 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c        otherwise,
2ac0: 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e 6b   its type is unk
2ad0: 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20  nown...         
2ae0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2af0: 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b 5e    set pattern {^
2b00: 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45 33  PE        : (PE3
2b10: 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d 0a  2|PE32\+)\s+$}..
2b20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2b30: 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65 20   {[regexp -line 
2b40: 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78 65  -- $pattern $exe
2b50: 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20 74  c dummy pe32]} t
2b60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2b70: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2b80: 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54 68        # HACK: Th
2b90: 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73 75  is [switch] assu
2ba0: 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74 20  mes that 32-bit 
2bb0: 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65 0d  executables are.
2bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2bd0: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78 38         always x8
2be0: 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62 69  6 and that 64-bi
2bf0: 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72  t executables ar
2c00: 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20  e always..      
2c10: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2c20: 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  x64...          
2c30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c40: 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61       switch -exa
2c50: 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a 20  ct -- $pe32 {.. 
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2c70: 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  E32 {..         
2c80: 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c 61           set pla
2c90: 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20 20  tform Win32..   
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20 20  PE32+ {..       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
2ce0: 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20 20  latform x64..   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20 20  default {..     
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2d30: 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20 20   platform ""..  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
2d70: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
2d80: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
2d90: 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20 20  rm ""..         
2da0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2db0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
2dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2dd0: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 65  TE: Attempt to e
2de0: 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e 4c  xtract the ILONL
2df0: 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65 20  Y line from the 
2e00: 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20 20  captured..      
2e10: 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70      #       outp
2e20: 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  ut.  If this val
2e30: 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 20  ue is zero, the 
2e40: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6d  specified file m
2e50: 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ust..          #
2e60: 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78 65         be a mixe
2e70: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 3b  d-mode assembly;
2e80: 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20 63   otherwise, it c
2e90: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20 20  ontains only..  
2ea0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2eb0: 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65 6e  managed componen
2ec0: 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ts...          #
2ed0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
2ee0: 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c 59  pattern {^ILONLY
2ef0: 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24 7d      : (0|1)\s+$}
2f00: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
2f10: 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65   {![regexp -line
2f20: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
2f30: 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79 5d  ec dummy ilOnly]
2f40: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2f50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2f60: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  se..          }.
2f70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
2f80: 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e 20  {!$ilOnly} then 
2f90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
2fa0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
2fb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2fc0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
2fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
2fe0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65 73  NOTE: If the tes
2ff0: 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20 75  t suite cannot u
3000: 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78 65  se [exec] or exe
3010: 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c 61  cution of CorFla
3020: 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  gs..      #     
3030: 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e    failed, return
3040: 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20 23   false...      #
3050: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
3060: 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
3070: 20 20 20 20 70 72 6f 63 20 69 73 42 75 69 6c 64      proc isBuild
3080: 41 76 61 69 6c 61 62 6c 65 20 7b 20 6e 61 74 69  Available { nati
3090: 76 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61  ve directory {va
30a0: 72 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20  rName ""} } {.. 
30b0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
30c0: 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
30d0: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
30e0: 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  file name for th
30f0: 65 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62  e primary assemb
3100: 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ly..      #     
3110: 20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65    containing the
3120: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
3130: 69 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70  ite managed comp
3140: 6f 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20  onents.  It..   
3150: 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c     #       shoul
3160: 64 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20  d be noted that 
3170: 74 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69  this assembly fi
3180: 6c 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  le may also cont
3190: 61 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  ain the..      #
31a0: 20 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f         native co
31b0: 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e  mponents, if a n
31c0: 61 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69  ative build is i
31d0: 6e 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d  n use...      #.
31e0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
31f0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
3200: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
3210: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
3220: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
3230: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d  ata.SQLite.dll]]
3240: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
3250: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
3260: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
3270: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
3280: 61 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  alse..      }...
3290: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
32a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
32b0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
32c0: 20 64 65 74 65 63 74 20 69 66 20 74 68 65 20 70   detect if the p
32d0: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d  rimary assembly.
32e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
32f0: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69  ontains any nati
3300: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69  ve components, i
3310: 66 20 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20  f necessary...  
3320: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
3330: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
3340: 24 6e 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74  $native] == 0} t
3350: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
3360: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
3370: 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d  h $varName] > 0}
3380: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3390: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
33a0: 61 6d 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20  ame $varName..  
33b0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
33c0: 20 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69     set native [i
33d0: 73 4d 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62  sMixedModeAssemb
33e0: 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61  ly $fileName $va
33f0: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d  rName]..      }.
3400: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3410: 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65    # NOTE: If the
3420: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
3430: 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  y also contains 
3440: 74 68 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f  the native compo
3450: 6e 65 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20  nents,..      # 
3460: 20 20 20 20 20 20 77 65 20 68 61 76 65 20 65 76        we have ev
3470: 65 72 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64  erything we need
3480: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
3490: 20 20 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74    if {$native} t
34a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
34b0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
34c0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
34d0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
34e0: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
34f0: 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  alified file nam
3500: 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 6f  e for the intero
3510: 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20  p assembly..    
3520: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69    #       contai
3530: 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d 2e  ning the System.
3540: 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74 69  Data.SQLite nati
3550: 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20 20  ve components.  
3560: 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20 23  If this..      #
3570: 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69 73         file exis
3580: 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68 61  ts, we should ha
3590: 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77 65  ve everything we
35a0: 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d   need...      #.
35b0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
35c0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
35d0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
35e0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
35f0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 2e 49          SQLite.I
3600: 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  nterop.dll]]....
3610: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
3620: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
3630: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
3640: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
3650: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3660: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
3670: 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75 6c 6c  : Build the full
3680: 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
3690: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 53 51   name for the SQ
36a0: 4c 69 74 65 20 63 6f 72 65 0d 0a 20 20 20 20 20  Lite core..     
36b0: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
36c0: 2e 20 20 49 66 20 74 68 69 73 20 66 69 6c 65 20  .  If this file 
36d0: 65 78 69 73 74 73 2c 20 77 65 20 73 68 6f 75 6c  exists, we shoul
36e0: 64 20 68 61 76 65 20 65 76 65 72 79 74 68 69 6e  d have everythin
36f0: 67 20 77 65 0d 0a 20 20 20 20 20 20 23 20 20 20  g we..      #   
3700: 20 20 20 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20      need...     
3710: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69   #..      set fi
3720: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
3730: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
3740: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
3750: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
3760: 65 33 2e 64 6c 6c 5d 5d 0d 0a 0d 0a 20 20 20 20  e3.dll]]....    
3770: 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73    if {[file exis
3780: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
3790: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
37a0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
37b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
37c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e        # NOTE: On
37d0: 65 20 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65  e or more native
37e0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64   components need
37f0: 65 64 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74  ed by System.Dat
3800: 61 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20  a.SQLite..      
3810: 23 20 20 20 20 20 20 20 61 72 65 20 6d 69 73 73  #       are miss
3820: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ing...      #.. 
3830: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
3840: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
3850: 20 70 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41   proc isReleaseA
3860: 76 61 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63  vailable { direc
3870: 74 6f 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22  tory {varName ""
3880: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  } } {..      if 
3890: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
38a0: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
38b0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
38c0: 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
38d0: 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20  $varName..      
38e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
38f0: 6e 20 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61  n [isBuildAvaila
3900: 62 6c 65 20 22 22 20 24 64 69 72 65 63 74 6f 72  ble "" $director
3910: 79 20 24 76 61 72 4e 61 6d 65 5d 0d 0a 20 20 20  y $varName]..   
3920: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
3930: 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f  joinBuildDirecto
3940: 72 79 20 7b 20 6e 61 74 69 76 65 20 70 61 74 68  ry { native path
3950: 20 79 65 61 72 20 70 6c 61 74 66 6f 72 6d 20 63   year platform c
3960: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7d 20 7b  onfiguration } {
3970: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
3980: 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20   # NOTE: Figure 
3990: 6f 75 74 20 61 6e 64 20 74 68 65 6e 20 72 65 74  out and then ret
39a0: 75 72 6e 20 74 68 65 20 66 75 6c 6c 79 20 71 75  urn the fully qu
39b0: 61 6c 69 66 69 65 64 20 70 61 74 68 20 74 6f 20  alified path to 
39c0: 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  the build..     
39d0: 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
39e0: 72 79 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ry based on all 
39f0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 72  the arguments pr
3a00: 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63 61  ovided by our ca
3a10: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ller...      #..
3a20: 20 20 20 20 20 20 69 66 20 7b 24 6e 61 74 69 76        if {$nativ
3a30: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
3a40: 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20     return [file 
3a50: 6a 6f 69 6e 20 24 70 61 74 68 20 62 69 6e 20 24  join $path bin $
3a60: 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20 24  year $platform $
3a70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a  configuration]..
3a80: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
3a90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3aa0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
3ab0: 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66 69  bin $year $confi
3ac0: 67 75 72 61 74 69 6f 6e 20 62 69 6e 5d 0d 0a 20  guration bin].. 
3ad0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
3ae0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
3af0: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 7b 7d 20  ildDirectory {} 
3b00: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3b10: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
3b20: 20 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75   the "native" ru
3b30: 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 68 61 73  ntime option has
3b40: 20 62 65 65 6e 20 73 65 74 2e 20 20 49 66 20 73   been set.  If s
3b50: 6f 2c 20 75 73 65 20 74 68 65 0d 0a 20 20 20 20  o, use the..    
3b60: 20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74    #       direct
3b70: 6f 72 79 20 66 6f 72 20 74 68 65 20 6d 69 78 65  ory for the mixe
3b80: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20  d-mode assembly 
3b90: 28 61 2e 6b 2e 61 2e 20 74 68 65 20 6e 61 74 69  (a.k.a. the nati
3ba0: 76 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20  ve interop..    
3bb0: 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
3bc0: 6c 79 29 2e 20 20 54 6f 20 65 6e 61 62 6c 65 20  ly).  To enable 
3bd0: 74 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20  this option via 
3be0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
3bf0: 2c 20 65 6e 74 65 72 20 61 0d 0a 20 20 20 20 20  , enter a..     
3c00: 20 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64   #       command
3c10: 20 73 69 6d 69 6c 61 72 20 74 6f 20 6f 6e 65 20   similar to one 
3c20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3c30: 20 28 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e   (all on one lin
3c40: 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e):..      #..  
3c50: 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c      #       Eagl
3c60: 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69 74  eShell.exe -init
3c70: 69 61 6c 69 7a 65 20 2d 72 75 6e 74 69 6d 65 4f  ialize -runtimeO
3c80: 70 74 69 6f 6e 20 6e 61 74 69 76 65 0d 0a 20 20  ption native..  
3c90: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66      #         -f
3ca0: 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c  ile .\path\to\al
3cb0: 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23  l.eagle..      #
3cc0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
3cd0: 54 6f 20 65 6e 61 62 6c 65 20 74 68 69 73 20 6f  To enable this o
3ce0: 70 74 69 6f 6e 20 76 69 61 20 74 68 65 20 63 6f  ption via the co
3cf0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 70 72 69 6f 72  mmand line prior
3d00: 20 74 6f 20 74 68 65 20 22 62 65 74 61 20 31 36   to the "beta 16
3d10: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
3d20: 20 72 65 6c 65 61 73 65 20 6f 66 20 45 61 67 6c   release of Eagl
3d30: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
3d40: 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 62 65   command must be
3d50: 20 75 73 65 64 20 69 6e 73 74 65 61 64 0d 0a 20   used instead.. 
3d60: 20 20 20 20 20 23 20 20 20 20 20 20 20 28 61 6c       #       (al
3d70: 73 6f 20 61 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69  so all on one li
3d80: 6e 65 29 3a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ne):..      #.. 
3d90: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
3da0: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 69 6e 69  leShell.exe -ini
3db0: 74 69 61 6c 69 7a 65 20 2d 70 6f 73 74 49 6e 69  tialize -postIni
3dc0: 74 69 61 6c 69 7a 65 0d 0a 20 20 20 20 20 20 23  tialize..      #
3dd0: 20 20 20 20 20 20 20 20 20 22 6f 62 6a 65 63 74           "object
3de0: 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65   invoke Interpre
3df0: 74 65 72 2e 47 65 74 41 63 74 69 76 65 20 41 64  ter.GetActive Ad
3e00: 64 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e  dRuntimeOption n
3e10: 61 74 69 76 65 22 0d 0a 20 20 20 20 20 20 23 20  ative"..      # 
3e20: 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c          -file .\
3e30: 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c  path\to\all.eagl
3e40: 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  e..      #..    
3e50: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
3e60: 74 73 20 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  ts ::build_direc
3e70: 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tory] && \..    
3e80: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3e90: 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64 5f 64 69  ngth $::build_di
3ea0: 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68  rectory] > 0} th
3eb0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
3ec0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3ed0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   The location of
3ee0: 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
3ef0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
3f00: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
3f10: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
3f20: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
3f30: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
3f40: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
3f50: 6e 20 24 3a 3a 62 75 69 6c 64 5f 64 69 72 65 63  n $::build_direc
3f60: 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c  tory..      } el
3f70: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
3f80: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
3f90: 20 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22   If the "native"
3fa0: 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20   runtime option 
3fb0: 69 73 20 73 65 74 2c 20 74 68 65 20 6d 69 78 65  is set, the mixe
3fc0: 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 0d  d-mode assembly.
3fd0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3fe0: 20 69 73 20 62 65 69 6e 67 20 74 65 73 74 65 64   is being tested
3ff0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
4000: 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
4010: 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
4020: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4030: 20 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74    will contain t
4040: 68 65 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65  he platform name
4050: 20 61 6e 64 20 61 6c 6c 20 74 68 65 20 62 69 6e   and all the bin
4060: 61 72 69 65 73 20 75 6e 64 65 72 20 74 65 73 74  aries under test
4070: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4080: 20 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 73    should be pres
4090: 65 6e 74 20 69 6e 20 74 68 61 74 20 64 69 72 65  ent in that dire
40a0: 63 74 6f 72 79 2e 20 20 49 66 20 74 68 65 20 22  ctory.  If the "
40b0: 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65 0d  native" runtime.
40c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
40d0: 20 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 73   option is not s
40e0: 65 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64 69  et, the build di
40f0: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
4100: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
4110: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4120: 20 20 22 70 6c 61 74 66 6f 72 6d 2d 6e 65 75 74    "platform-neut
4130: 72 61 6c 22 2c 20 77 69 74 68 20 74 68 65 20 6e  ral", with the n
4140: 6f 74 61 62 6c 65 20 65 78 63 65 70 74 69 6f 6e  otable exception
4150: 20 6f 66 20 61 6e 79 20 6e 61 74 69 76 65 0d 0a   of any native..
4160: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4170: 61 73 73 65 6d 62 6c 79 20 28 65 2e 67 2e 20 22  assembly (e.g. "
4180: 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64  SQLite.Interop.d
4190: 6c 6c 22 29 20 63 6f 70 69 65 64 20 74 68 65 72  ll") copied ther
41a0: 65 20 64 75 72 69 6e 67 20 74 68 65 0d 0a 20 20  e during the..  
41b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
41c0: 69 6c 64 20 70 72 6f 63 65 73 73 20 69 74 73 65  ild process itse
41d0: 6c 66 2e 20 20 49 66 20 74 68 65 20 62 75 69 6c  lf.  If the buil
41e0: 64 20 70 72 6f 63 65 73 73 20 73 6f 6d 65 68 6f  d process someho
41f0: 77 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20  w does not..    
4200: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79      #       copy
4210: 20 74 68 65 20 6e 61 74 69 76 65 20 61 73 73 65   the native asse
4220: 6d 62 6c 79 20 66 6f 72 20 74 68 69 73 20 70 6c  mbly for this pl
4230: 61 74 66 6f 72 6d 2c 20 6d 6f 73 74 20 6f 66 20  atform, most of 
4240: 74 68 65 20 74 65 73 74 73 0d 0a 20 20 20 20 20  the tests..     
4250: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
4260: 65 20 73 75 69 74 65 20 77 69 6c 6c 20 73 69 6d  e suite will sim
4270: 70 6c 79 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ply be skipped. 
4280: 20 47 65 6e 65 72 61 6c 6c 79 20 73 70 65 61 6b   Generally speak
4290: 69 6e 67 2c 20 74 68 65 72 65 0d 0a 20 20 20 20  ing, there..    
42a0: 20 20 20 20 23 20 20 20 20 20 20 20 61 72 65 20      #       are 
42b0: 74 77 6f 20 77 61 79 73 20 74 6f 20 62 75 69 6c  two ways to buil
42c0: 64 20 74 68 65 20 62 69 6e 61 72 69 65 73 20 77  d the binaries w
42d0: 68 65 6e 20 70 72 65 70 61 72 69 6e 67 20 74 6f  hen preparing to
42e0: 20 72 75 6e 20 74 68 65 0d 0a 20 20 20 20 20 20   run the..      
42f0: 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 73    #       test s
4300: 75 69 74 65 3a 0d 0a 20 20 20 20 20 20 20 20 23  uite:..        #
4310: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4320: 20 20 31 2e 20 42 75 69 6c 64 20 74 68 65 20 73    1. Build the s
4330: 65 70 61 72 61 74 65 20 6d 61 6e 61 67 65 64 20  eparate managed 
4340: 61 6e 64 20 6e 61 74 69 76 65 20 61 73 73 65 6d  and native assem
4350: 62 6c 69 65 73 20 75 73 69 6e 67 20 73 6f 6d 65  blies using some
4360: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
4370: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 73 69       commands si
4380: 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20 20 20 20 20  milar to:..     
4390: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
43a0: 20 20 20 20 20 20 20 20 20 62 75 69 6c 64 2e 62           build.b
43b0: 61 74 20 24 7b 43 6f 6e 66 69 67 75 72 61 74 69  at ${Configurati
43c0: 6f 6e 7d 4d 61 6e 61 67 65 64 4f 6e 6c 79 20 24  on}ManagedOnly $
43d0: 7b 50 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20  {Platform}..    
43e0: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62      #          b
43f0: 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69  uild.bat ${Confi
4400: 67 75 72 61 74 69 6f 6e 7d 4e 61 74 69 76 65 4f  guration}NativeO
4410: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
4420: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4430: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 20 57      #          W
4440: 68 65 72 65 20 24 7b 43 6f 6e 66 69 67 75 72 61  here ${Configura
4450: 74 69 6f 6e 7d 20 69 73 20 65 69 74 68 65 72 20  tion} is either 
4460: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
4470: 61 73 65 22 20 61 6e 64 0d 0a 20 20 20 20 20 20  ase" and..      
4480: 20 20 23 20 20 20 20 20 20 20 20 20 20 24 7b 50    #          ${P
4490: 6c 61 74 66 6f 72 6d 7d 20 69 73 20 65 69 74 68  latform} is eith
44a0: 65 72 20 22 57 69 6e 33 32 22 20 6f 72 20 22 78  er "Win32" or "x
44b0: 36 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  64"...        #.
44c0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
44d0: 20 32 2e 20 42 75 69 6c 64 20 74 68 65 20 6d 69   2. Build the mi
44e0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
44f0: 79 20 75 73 69 6e 67 20 61 20 63 6f 6d 6d 61 6e  y using a comman
4500: 64 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a 20  d similar to:.. 
4510: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4520: 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75 69    #          bui
4530: 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67 75  ld.bat ${Configu
4540: 72 61 74 69 6f 6e 7d 20 24 7b 50 6c 61 74 66 6f  ration} ${Platfo
4550: 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  rm}..        #..
4560: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
4570: 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66 69     Where ${Confi
4580: 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69 74  guration} is eit
4590: 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20 22  her "Debug" or "
45a0: 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20 20  Release" and..  
45b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
45c0: 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73 20   ${Platform} is 
45d0: 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20 6f  either "Win32" o
45e0: 72 20 22 78 36 34 22 2e 20 20 49 66 20 74 68 69  r "x64".  If thi
45f0: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  s command is..  
4600: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
4610: 20 75 73 65 64 2c 20 76 61 72 69 6f 75 73 20 74   used, various t
4620: 65 73 74 73 20 74 68 61 74 20 72 65 71 75 69 72  ests that requir
4630: 65 20 73 75 70 70 6c 65 6d 65 6e 74 61 72 79 20  e supplementary 
4640: 6d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20  managed..       
4650: 20 23 20 20 20 20 20 20 20 20 20 20 61 73 73 65   #          asse
4660: 6d 62 6c 69 65 73 20 28 65 2e 67 2e 20 4c 49 4e  mblies (e.g. LIN
4670: 51 29 20 6d 61 79 20 62 65 20 73 6b 69 70 70 65  Q) may be skippe
4680: 64 20 75 6e 6c 65 73 73 20 74 68 6f 73 65 20 62  d unless those b
4690: 69 6e 61 72 69 65 73 0d 0a 20 20 20 20 20 20 20  inaries..       
46a0: 20 23 20 20 20 20 20 20 20 20 20 20 61 72 65 20   #          are 
46b0: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 63 6f 70  subsequently cop
46c0: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 6f 72  ied into the cor
46d0: 72 65 63 74 20 64 69 72 65 63 74 6f 72 79 20 28  rect directory (
46e0: 69 2e 65 2e 20 62 79 0d 0a 20 20 20 20 20 20 20  i.e. by..       
46f0: 20 23 20 20 20 20 20 20 20 20 20 20 22 74 65 73   #          "tes
4700: 74 5f 61 6c 6c 2e 62 61 74 22 29 2e 0d 0a 20 20  t_all.bat")...  
4710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4720: 20 23 20 20 20 20 20 20 20 4e 6f 74 65 20 74 68   #       Note th
4730: 61 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 75  at all of the bu
4740: 69 6c 64 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f  ild commands abo
4750: 76 65 20 77 69 6c 6c 20 64 65 66 61 75 6c 74 20  ve will default 
4760: 74 6f 20 75 73 69 6e 67 0d 0a 20 20 20 20 20 20  to using..      
4770: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 6c 61    #       the la
4780: 74 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  test version of 
4790: 4d 53 42 75 69 6c 64 20 61 76 61 69 6c 61 62 6c  MSBuild availabl
47a0: 65 20 61 6e 64 20 74 68 65 20 22 74 65 73 74 5f  e and the "test_
47b0: 79 65 61 72 22 20 6d 61 79 0d 0a 20 20 20 20 20  year" may..     
47c0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 65 64 20     #       need 
47d0: 74 6f 20 62 65 20 61 64 6a 75 73 74 65 64 20 61  to be adjusted a
47e0: 63 63 6f 72 64 69 6e 67 6c 79 20 74 6f 20 61 63  ccordingly to ac
47f0: 74 75 61 6c 6c 79 20 72 75 6e 20 74 68 65 20 74  tually run the t
4800: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
4810: 20 20 20 20 23 20 20 20 20 20 20 20 52 65 66 65      #       Refe
4820: 72 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  r to the comment
4830: 73 20 69 6e 20 5b 67 65 74 42 75 69 6c 64 59 65  s in [getBuildYe
4840: 61 72 5d 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  ar] for more inf
4850: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 0d 0a 20 20 20  ormation on..   
4860: 20 20 20 20 20 23 20 20 20 20 20 20 20 68 6f 77       #       how
4870: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
4880: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
4890: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6e  #..        set n
48a0: 61 74 69 76 65 20 5b 68 61 73 52 75 6e 74 69 6d  ative [hasRuntim
48b0: 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 0d  eOption native].
48c0: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
48d0: 6e 20 5b 6a 6f 69 6e 42 75 69 6c 64 44 69 72 65  n [joinBuildDire
48e0: 63 74 6f 72 79 20 24 6e 61 74 69 76 65 20 5b 67  ctory $native [g
48f0: 65 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63  etBuildBaseDirec
4900: 74 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20  tory] \..       
4910: 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 59 65       [getBuildYe
4920: 61 72 5d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61  ar] [getBuildPla
4930: 74 66 6f 72 6d 20 24 6e 61 74 69 76 65 5d 20 5b  tform $native] [
4940: 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72  getBuildConfigur
4950: 61 74 69 6f 6e 5d 5d 0d 0a 20 20 20 20 20 20 7d  ation]]..      }
4960: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4970: 70 72 6f 63 20 67 65 74 52 65 6c 65 61 73 65 56  proc getReleaseV
4980: 65 72 73 69 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20  ersion {} {..   
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
49a0: 54 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74  TE: Figure out t
49b0: 68 65 20 72 65 6c 65 61 73 65 20 76 65 72 73 69  he release versi
49c0: 6f 6e 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  on for use with 
49d0: 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63 74  the build direct
49e0: 6f 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ory..      #    
49f0: 20 20 20 77 68 65 6e 20 63 68 65 63 6b 69 6e 67     when checking
4a00: 20 66 6f 72 20 61 76 61 69 6c 61 62 6c 65 20 72   for available r
4a10: 65 6c 65 61 73 65 73 2e 0d 0a 20 20 20 20 20 20  eleases...      
4a20: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
4a30: 66 6f 20 65 78 69 73 74 73 20 3a 3a 72 65 6c 65  fo exists ::rele
4a40: 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20 26 26 20  ase_version] && 
4a50: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4a60: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 72  ring length $::r
4a70: 65 6c 65 61 73 65 5f 76 65 72 73 69 6f 6e 5d 20  elease_version] 
4a80: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
4a90: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4aa0: 23 20 4e 4f 54 45 3a 20 54 68 65 20 72 65 6c 65  # NOTE: The rele
4ab0: 61 73 65 20 76 65 72 73 69 6f 6e 20 68 61 73 20  ase version has 
4ac0: 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b  been overridden;
4ad0: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
4ae0: 69 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  it..        #   
4af0: 20 20 20 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20      verbatim... 
4b00: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4b10: 20 20 72 65 74 75 72 6e 20 24 3a 3a 72 65 6c 65    return $::rele
4b20: 61 73 65 5f 76 65 72 73 69 6f 6e 0d 0a 20 20 20  ase_version..   
4b30: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4b40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4b50: 23 20 4e 4f 54 45 3a 20 4e 6f 20 72 65 6c 65 61  # NOTE: No relea
4b60: 73 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  se version is av
4b70: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
4b80: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
4b90: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
4bb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
4bc0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4bd0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
4be0: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
4bf0: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
4c00: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
4c10: 3a 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 70  : Returns the sp
4c20: 65 63 69 66 69 65 64 20 66 69 6c 65 20 6e 61 6d  ecified file nam
4c30: 65 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20  e as if it were 
4c40: 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 0d 0a  located in the..
4c50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 75        #       bu
4c60: 69 6c 64 20 64 69 72 65 63 74 6f 72 79 2c 20 64  ild directory, d
4c70: 69 73 63 61 72 64 69 6e 67 20 61 6e 79 20 64 69  iscarding any di
4c80: 72 65 63 74 6f 72 79 20 69 6e 66 6f 72 6d 61 74  rectory informat
4c90: 69 6f 6e 20 70 72 65 73 65 6e 74 0d 0a 20 20 20  ion present..   
4ca0: 20 20 20 23 20 20 20 20 20 20 20 69 6e 20 74 68     #       in th
4cb0: 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 70  e file name as p
4cc0: 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20 63  rovided by our c
4cd0: 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d  aller...      #.
4ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66  .      return [f
4cf0: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
4d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
4d10: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
4d20: 44 69 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74  Directory] $plat
4d30: 66 6f 72 6d 20 5b 66 69 6c 65 20 74 61 69 6c 20  form [file tail 
4d40: 24 66 69 6c 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20  $fileName]]]..  
4d50: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
4d60: 20 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74   getBinaryDirect
4d70: 6f 72 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ory {} {..      
4d80: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
4d90: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
4da0: 72 65 74 75 72 6e 73 20 74 68 65 20 64 69 72 65  returns the dire
4db0: 63 74 6f 72 79 20 77 68 65 72 65 20 74 68 65 20  ctory where the 
4dc0: 74 65 73 74 20 61 70 70 6c 69 63 61 74 69 6f 6e  test application
4dd0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
4de0: 69 74 73 65 6c 66 20 28 69 2e 65 2e 20 74 68 65  itself (i.e. the
4df0: 20 45 61 67 6c 65 20 73 68 65 6c 6c 29 20 69 73   Eagle shell) is
4e00: 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69 73 20   located.  This 
4e10: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 0d  will be used as.
4e20: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
4e30: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 66  he destination f
4e40: 6f 72 20 74 68 65 20 63 6f 70 69 65 64 20 53 79  or the copied Sy
4e50: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
4e60: 20 6e 61 74 69 76 65 20 61 6e 64 0d 0a 20 20 20   native and..   
4e70: 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e 61 67     #       manag
4e80: 65 64 20 61 73 73 65 6d 62 6c 69 65 73 20 28 69  ed assemblies (i
4e90: 2e 65 2e 20 62 65 63 61 75 73 65 20 74 68 69 73  .e. because this
4ea0: 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   is one of the f
4eb0: 65 77 20 70 6c 61 63 65 73 0d 0a 20 20 20 20 20  ew places..     
4ec0: 20 23 20 20 20 20 20 20 20 77 68 65 72 65 20 74   #       where t
4ed0: 68 65 20 43 4c 52 20 77 69 6c 6c 20 61 63 74 75  he CLR will actu
4ee0: 61 6c 6c 79 20 66 69 6e 64 20 61 6e 64 20 6c 6f  ally find and lo
4ef0: 61 64 20 74 68 65 6d 20 70 72 6f 70 65 72 6c 79  ad them properly
4f00: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
4f10: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4f20: 73 74 73 20 3a 3a 62 69 6e 61 72 79 5f 64 69 72  sts ::binary_dir
4f30: 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20  ectory] && \..  
4f40: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
4f50: 6c 65 6e 67 74 68 20 24 3a 3a 62 69 6e 61 72 79  length $::binary
4f60: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
4f70: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4f80: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4f90: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
4fa0: 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 64   of the binary d
4fb0: 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
4fc0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20  n overridden;.. 
4fd0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
4fe0: 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
4ff0: 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20   verbatim...    
5000: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
5010: 65 74 75 72 6e 20 24 3a 3a 62 69 6e 61 72 79 5f  eturn $::binary_
5020: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
5030: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
5040: 20 20 20 72 65 74 75 72 6e 20 5b 69 6e 66 6f 20     return [info 
5050: 62 69 6e 61 72 79 5d 0d 0a 20 20 20 20 20 20 7d  binary]..      }
5060: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
5070: 70 72 6f 63 20 67 65 74 42 69 6e 61 72 79 46 69  proc getBinaryFi
5080: 6c 65 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d  leName { fileNam
5090: 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20  e {platform ""} 
50a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
50b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
50c0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
50d0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
50e0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
50f0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
5100: 23 20 20 20 20 20 20 20 62 69 6e 61 72 79 20 64  #       binary d
5110: 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61 72  irectory, discar
5120: 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74 6f  ding any directo
5130: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ry information p
5140: 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23 20  resent..      # 
5150: 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69 6c        in the fil
5160: 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69 64  e name as provid
5170: 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72  ed by our caller
5180: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
5190: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
51a0: 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20  ativename \..   
51b0: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
51c0: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
51d0: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
51e0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c   [file tail $fil
51f0: 65 4e 61 6d 65 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  eName]]]..    }.
5200: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5210: 43 6f 72 65 42 69 6e 61 72 79 46 69 6c 65 4e 61  CoreBinaryFileNa
5220: 6d 65 20 7b 20 7b 70 6c 61 74 66 6f 72 6d 20 22  me { {platform "
5230: 22 7d 20 7b 73 74 61 6e 64 61 72 64 20 66 61 6c  "} {standard fal
5240: 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
5250: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
5260: 52 65 74 75 72 6e 73 20 74 68 65 20 66 75 6c 6c  Returns the full
5270: 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 66 69   path for the fi
5280: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
5290: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a 20  e SQLite core.. 
52a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 74       #       nat
52b0: 69 76 65 20 6c 69 62 72 61 72 79 20 63 6f 64 65  ive library code
52c0: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
52d0: 72 6d 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63  rm.  First, chec
52e0: 6b 20 61 6e 64 20 73 65 65 20 69 66 0d 0a 20 20  k and see if..  
52f0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
5300: 53 51 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69  SQLite core nati
5310: 76 65 20 6c 69 62 72 61 72 79 20 68 61 73 20 61  ve library has a
5320: 6c 72 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64  lready been load
5330: 65 64 2e 20 20 4e 65 78 74 2c 0d 0a 20 20 20 20  ed.  Next,..    
5340: 20 20 23 20 20 20 20 20 20 20 66 61 6c 6c 62 61    #       fallba
5350: 63 6b 20 74 6f 20 77 68 61 74 20 74 68 65 20 66  ck to what the f
5360: 75 6c 6c 20 70 61 74 68 20 73 68 6f 75 6c 64 20  ull path should 
5370: 62 65 2c 20 62 61 73 65 64 20 6f 6e 20 77 68 65  be, based on whe
5380: 74 68 65 72 20 74 68 65 0d 0a 20 20 20 20 20 20  ther the..      
5390: 23 20 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f  #       mixed-mo
53a0: 64 65 20 61 73 73 65 6d 62 6c 79 20 69 73 20 62  de assembly is b
53b0: 65 69 6e 67 20 75 73 65 64 20 61 6e 64 20 74 68  eing used and th
53c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  e name of the cu
53d0: 72 72 65 6e 74 0d 0a 20 20 20 20 20 20 23 20 20  rrent..      #  
53e0: 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a       platform...
53f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
5400: 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63  f {[catch {objec
5410: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
5420: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
5440: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55  em.Data.SQLite.U
5450: 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f  nsafeNativeMetho
5460: 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ds \..          
5470: 20 20 20 20 5f 53 51 4c 69 74 65 4e 61 74 69 76      _SQLiteNativ
5480: 65 4d 6f 64 75 6c 65 46 69 6c 65 4e 61 6d 65 7d  eModuleFileName}
5490: 20 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30 20   fileName] == 0 
54a0: 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
54b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
54c0: 66 69 6c 65 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  fileName] > 0} t
54d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
54e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
54f0: 3a 20 54 68 65 20 53 51 4c 69 74 65 20 63 6f 72  : The SQLite cor
5500: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
5510: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
5520: 6e 20 6c 6f 61 64 65 64 20 76 69 61 0d 0a 20 20  n loaded via..  
5530: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
5540: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
5550: 20 70 72 65 2d 6c 6f 61 64 65 72 2e 20 20 52 65   pre-loader.  Re
5560: 74 75 72 6e 20 74 68 61 74 20 66 69 6c 65 20 6e  turn that file n
5570: 61 6d 65 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20  ame now...      
5580: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
5590: 75 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  urn $fileName.. 
55a0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
55b0: 69 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f  if {[hasRuntimeO
55c0: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74  ption native]} t
55d0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
55e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
55f0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78  : Return the mix
5600: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
5610: 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20   file name...   
5620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5630: 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74  return [file nat
5640: 69 76 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ivename \..     
5650: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69         [file joi
5660: 6e 20 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65  n [getBinaryDire
5670: 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d  ctory] $platform
5680: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
5690: 69 74 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20  ite.dll]]..     
56a0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74 61 6e   } elseif {$stan
56b0: 64 61 72 64 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  dard} then {..  
56c0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
56d0: 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20   # NOTE: Return 
56e0: 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20  the native-only 
56f0: 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74 65 20  standard SQLite 
5700: 6c 69 62 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  library file nam
5710: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
5720: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 66         return [f
5730: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
5740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 66  ..            [f
5750: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
5760: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
5770: 6c 61 74 66 6f 72 6d 20 73 71 6c 69 74 65 33 2e  latform sqlite3.
5780: 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65  dll]]..      } e
5790: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
57a0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
57b0: 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 74  : Return the nat
57c0: 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65 72 6f 70  ive-only interop
57d0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
57e0: 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ame...        #.
57f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5800: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
5810: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
5820: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
5830: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
5840: 24 70 6c 61 74 66 6f 72 6d 20 53 51 4c 69 74 65  $platform SQLite
5850: 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 5d 0d 0a  .Interop.dll]]..
5860: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
5870: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
5880: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
5890: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
58a0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
58b0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
58c0: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
58d0: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
58e0: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
58f0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
5900: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
5910: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
5920: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
5930: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
5940: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
5950: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
5960: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
5970: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
5980: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
5990: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
59a0: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
59b0: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
59c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
59d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
59e0: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
59f0: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
5a00: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5a10: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
5a20: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
5a30: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
5a40: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5a50: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
5a60: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
5a70: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
5a80: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
5a90: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
5aa0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
5ab0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
5ac0: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
5ad0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5ae0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5af0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
5b00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
5b10: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
5b20: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
5b30: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
5b40: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
5b50: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5b60: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
5b70: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
5b80: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
5b90: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
5ba0: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
5bb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
5bc0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
5bd0: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
5be0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
5bf0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
5c00: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
5c10: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5c20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5c30: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
5c40: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
5c50: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
5c60: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
5c70: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
5c80: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
5c90: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
5ca0: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
5cb0: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
5cc0: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
5cd0: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
5ce0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
5cf0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5d00: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
5d10: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
5d20: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
5d30: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
5d40: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
5d50: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
5d60: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
5d70: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
5d80: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5d90: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
5da0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
5db0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
5dc0: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
5dd0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
5de0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
5df0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
5e00: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
5e10: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
5e20: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
5e30: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
5e40: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
5e50: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
5e60: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
5e70: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
5e80: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
5e90: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
5ea0: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
5eb0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
5ec0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
5ed0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
5ee0: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
5ef0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
5f00: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
5f10: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
5f20: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5f30: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5f40: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
5f50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5f60: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
5f70: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
5f80: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
5f90: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
5fa0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
5fb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
5fc0: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
5fd0: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
5fe0: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
5ff0: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
6000: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
6010: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
6020: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
6030: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
6040: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
6050: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
6060: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
6070: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
6080: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
6090: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
60a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
60b0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
60c0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
60d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
60e0: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
60f0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
6100: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
6110: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
6120: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
6130: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
6140: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
6150: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
6160: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6170: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
6180: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
6190: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
61a0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
61b0: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
61c0: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
61d0: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
61e0: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
61f0: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
6200: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6210: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
6220: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
6230: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
6240: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
6250: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
6260: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
6270: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
6280: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
6290: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
62a0: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
62b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
62c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
62d0: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
62e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
62f0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
6300: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
6310: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
6320: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
6330: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6340: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
6350: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
6360: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
6370: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
6380: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
6390: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
63a0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
63b0: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
63c0: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
63d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
63e0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
63f0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
6400: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
6410: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
6420: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
6430: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
6440: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
6450: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
6460: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
6470: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
6480: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
6490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
64a0: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
64b0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
64c0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
64d0: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
64e0: 72 65 61 6d 62 6c 65 20 7b 20 7b 65 78 74 72 61  reamble { {extra
64f0: 56 61 72 4e 61 6d 65 73 20 22 22 7d 20 7d 20 7b  VarNames ""} } {
6500: 0d 0a 20 20 20 20 20 20 73 65 74 20 76 61 72 4e  ..      set varN
6510: 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
6520: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
6530: 4e 4f 54 45 3a 20 49 66 20 61 76 61 69 6c 61 62  NOTE: If availab
6540: 6c 65 2c 20 73 74 61 72 74 20 77 69 74 68 20 74  le, start with t
6550: 68 65 20 6d 61 73 74 65 72 20 6c 69 73 74 20 6f  he master list o
6560: 66 20 74 65 73 74 20 6f 76 65 72 72 69 64 65 0d  f test override.
6570: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 76  .      #       v
6580: 61 72 69 61 62 6c 65 73 2e 0d 0a 20 20 20 20 20  ariables...     
6590: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
65a0: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
65b0: 74 5f 6f 76 65 72 72 69 64 65 73 5d 20 26 26 20  t_overrides] && 
65c0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c  \..          [ll
65d0: 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6f 76  ength $::test_ov
65e0: 65 72 72 69 64 65 73 5d 20 3e 20 30 7d 20 74 68  errides] > 0} th
65f0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 65 76  en {..        ev
6600: 61 6c 20 6c 61 70 70 65 6e 64 20 76 61 72 4e 61  al lappend varNa
6610: 6d 65 73 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72  mes $::test_over
6620: 72 69 64 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  rides..      }..
6630: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6640: 20 23 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75   # NOTE: If requ
6650: 65 73 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c  ested by our cal
6660: 6c 65 72 2c 20 61 64 64 20 61 6e 79 20 61 64 64  ler, add any add
6670: 69 74 69 6f 6e 61 6c 20 76 61 72 69 61 62 6c 65  itional variable
6680: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
6690: 6e 61 6d 65 73 20 74 6f 20 63 6f 70 79 20 6e 6f  names to copy no
66a0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
66b0: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
66c0: 24 65 78 74 72 61 56 61 72 4e 61 6d 65 73 5d 20  $extraVarNames] 
66d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
66e0: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
66f0: 64 20 76 61 72 4e 61 6d 65 73 20 24 65 78 74 72  d varNames $extr
6700: 61 56 61 72 4e 61 6d 65 73 0d 0a 20 20 20 20 20  aVarNames..     
6710: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
6720: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
6730: 6c 64 20 74 68 65 20 73 63 72 69 70 74 20 66 72  ld the script fr
6740: 61 67 6d 65 6e 74 20 74 6f 20 62 65 20 72 65 74  agment to be ret
6750: 75 72 6e 65 64 20 62 79 20 70 72 6f 63 65 73 73  urned by process
6760: 69 6e 67 20 65 61 63 68 0d 0a 20 20 20 20 20 20  ing each..      
6770: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
6780: 20 6e 61 6d 65 20 61 6e 64 20 61 64 64 69 6e 67   name and adding
6790: 20 74 68 65 20 6e 65 63 65 63 65 73 73 61 72 79   the nececessary
67a0: 20 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74   script fragment
67b0: 73 20 66 6f 72 0d 0a 20 20 20 20 20 20 23 20 20  s for..      #  
67c0: 20 20 20 20 20 65 61 63 68 20 6f 6e 65 2e 0d 0a       each one...
67d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
67e0: 65 74 20 72 65 73 75 6c 74 20 22 22 0d 0a 0d 0a  et result ""....
67f0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 61        foreach va
6800: 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d 65 73 20  rName $varNames 
6810: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
6820: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
6830: 69 6c 64 20 74 68 65 20 71 75 61 6c 69 66 69 65  ild the qualifie
6840: 64 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  d global variabl
6850: 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20  e name...       
6860: 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   #..        set 
6870: 66 75 6c 6c 56 61 72 4e 61 6d 65 20 5b 61 70 70  fullVarName [app
6880: 65 6e 64 41 72 67 73 20 3a 3a 20 24 76 61 72 4e  endArgs :: $varN
6890: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ame]....        
68a0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
68b0: 45 3a 20 44 6f 65 73 20 74 68 65 20 76 61 72 69  E: Does the vari
68c0: 61 62 6c 65 20 65 78 69 73 74 20 69 6e 20 74 68  able exist in th
68d0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20 63  is interpreter c
68e0: 6f 6e 74 65 78 74 3f 0d 0a 20 20 20 20 20 20 20  ontext?..       
68f0: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
6900: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 24 66 75  [info exists $fu
6910: 6c 6c 56 61 72 4e 61 6d 65 5d 7d 20 74 68 65 6e  llVarName]} then
6920: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
6930: 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
6940: 45 3a 20 41 70 70 65 6e 64 20 61 20 73 63 72 69  E: Append a scri
6950: 70 74 20 66 72 61 67 6d 65 6e 74 20 74 6f 20 74  pt fragment to t
6960: 68 65 20 72 65 73 75 6c 74 20 74 68 61 74 20 77  he result that w
6970: 69 6c 6c 20 63 6f 72 72 65 63 74 6c 79 0d 0a 20  ill correctly.. 
6980: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
6990: 20 63 6f 70 79 20 61 6e 79 20 63 6f 6e 74 61 69   copy any contai
69a0: 6e 65 64 20 76 61 6c 75 65 20 74 6f 20 61 6e 6f  ned value to ano
69b0: 74 68 65 72 20 69 6e 74 65 72 70 72 65 74 65 72  ther interpreter
69c0: 20 63 6f 6e 74 65 78 74 2e 0d 0a 20 20 20 20 20   context...     
69d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
69e0: 20 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20    append result 
69f0: 5c 6e 20 22 73 65 74 20 22 20 24 66 75 6c 6c 56  \n "set " $fullV
6a00: 61 72 4e 61 6d 65 20 22 20 5c 7b 22 20 5b 73 65  arName " \{" [se
6a10: 74 20 24 66 75 6c 6c 56 61 72 4e 61 6d 65 5d 20  t $fullVarName] 
6a20: 5c 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  \}..        }.. 
6a30: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
6a40: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
6a50: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 63   If the result c
6a60: 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d  ontains one or m
6a70: 6f 72 65 20 73 63 72 69 70 74 20 66 72 61 67 6d  ore script fragm
6a80: 65 6e 74 73 2c 20 61 70 70 65 6e 64 20 61 0d 0a  ents, append a..
6a90: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
6aa0: 77 6c 69 6e 65 2e 0d 0a 20 20 20 20 20 20 23 0d  wline...      #.
6ab0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
6ac0: 6e 67 20 6c 65 6e 67 74 68 20 24 72 65 73 75 6c  ng length $resul
6ad0: 74 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  t] > 0} then {..
6ae0: 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72          append r
6af0: 65 73 75 6c 74 20 5c 6e 0d 0a 20 20 20 20 20 20  esult \n..      
6b00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
6b10: 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d  n $result..    }
6b20: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
6b30: 74 41 70 70 44 6f 6d 61 69 6e 50 72 65 61 6d 62  tAppDomainPreamb
6b40: 6c 65 20 7b 20 7b 70 72 65 66 69 78 20 22 22 7d  le { {prefix ""}
6b50: 20 7b 73 75 66 66 69 78 20 22 22 7d 20 7d 20 7b   {suffix ""} } {
6b60: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
6b70: 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72   # NOTE: This pr
6b80: 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 20  ocedure returns 
6b90: 61 20 74 65 73 74 20 73 65 74 75 70 20 73 63 72  a test setup scr
6ba0: 69 70 74 20 66 72 61 67 6d 65 6e 74 20 73 75 69  ipt fragment sui
6bb0: 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20 20 20 20  table for..     
6bc0: 20 23 20 20 20 20 20 20 20 65 76 61 6c 75 61 74   #       evaluat
6bd0: 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74 65 72 70  ion by an interp
6be0: 72 65 74 65 72 20 63 72 65 61 74 65 64 20 69 6e  reter created in
6bf0: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 61 70 70   an isolated app
6c00: 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  lication..      
6c10: 23 20 20 20 20 20 20 20 64 6f 6d 61 69 6e 2e 20  #       domain. 
6c20: 20 54 68 65 20 73 63 72 69 70 74 20 66 72 61 67   The script frag
6c30: 6d 65 6e 74 20 62 65 69 6e 67 20 72 65 74 75 72  ment being retur
6c40: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 72 72  ned will be surr
6c50: 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ounded by..     
6c60: 20 23 20 20 20 20 20 20 20 74 68 65 20 70 72 65   #       the pre
6c70: 66 69 78 20 61 6e 64 20 73 75 66 66 69 78 20 22  fix and suffix "
6c80: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 73  script fragments
6c90: 22 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6f  " specified by o
6ca0: 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20 20 20 20  ur caller,..    
6cb0: 20 20 23 20 20 20 20 20 20 20 69 66 20 61 6e 79    #       if any
6cc0: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73 63  .  The entire sc
6cd0: 72 69 70 74 20 62 65 69 6e 67 20 72 65 74 75 72  ript being retur
6ce0: 6e 65 64 20 77 69 6c 6c 20 62 65 20 73 75 62 73  ned will be subs
6cf0: 74 69 74 75 74 65 64 20 76 69 61 0d 0a 20 20 20  tituted via..   
6d00: 20 20 20 23 20 20 20 20 20 20 20 5b 73 75 62 73     #       [subs
6d10: 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  t], in the conte
6d20: 78 74 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72  xt of our caller
6d30: 2c 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  , before being r
6d40: 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20 20 20 20  eturned...      
6d50: 23 20 20 20 20 20 20 20 54 68 69 73 20 73 74 65  #       This ste
6d60: 70 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 73  p is necessary s
6d70: 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c 69 6d 69  o that some limi
6d80: 74 65 64 20 63 6f 6e 74 65 78 74 20 69 6e 66 6f  ted context info
6d90: 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  rmation,..      
6da0: 23 20 20 20 20 20 20 20 70 72 69 6d 61 72 69 6c  #       primaril
6db0: 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
6dc0: 20 74 65 73 74 69 6e 67 20 64 69 72 65 63 74 6f   testing directo
6dd0: 72 69 65 73 2c 20 63 61 6e 20 62 65 20 74 72 61  ries, can be tra
6de0: 6e 73 66 65 72 72 65 64 0d 0a 20 20 20 20 20 20  nsferred..      
6df0: 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 69  #       to the i
6e00: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 74 68  nterpreter in th
6e10: 65 20 69 73 6f 6c 61 74 65 64 20 61 70 70 6c 69  e isolated appli
6e20: 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e 2c 20 6d  cation domain, m
6e30: 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20 20 20 20  aking it..      
6e40: 23 20 20 20 20 20 20 20 61 62 6c 65 20 74 6f 20  #       able to 
6e50: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 75 6e  successfully run
6e60: 20 74 65 73 74 73 20 74 68 61 74 20 72 65 71 75   tests that requ
6e70: 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ire one or more 
6e80: 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  of the..      # 
6e90: 20 20 20 20 20 20 66 69 6c 65 73 20 69 6e 20 6f        files in o
6ea0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 69 6e  ne of the testin
6eb0: 67 20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 20  g directories.  
6ec0: 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c 64 20 6b  Callers should k
6ed0: 65 65 70 20 69 6e 0d 0a 20 20 20 20 20 20 23 20  eep in..      # 
6ee0: 20 20 20 20 20 20 6d 69 6e 64 20 74 68 61 74 20        mind that 
6ef0: 74 68 65 20 74 65 73 74 20 73 63 72 69 70 74 20  the test script 
6f00: 66 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72  fragment being r
6f10: 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f 74 20 72  eturned cannot r
6f20: 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ely on..      # 
6f30: 20 20 20 20 20 20 61 6e 79 20 73 63 72 69 70 74        any script
6f40: 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64 75   library procedu
6f50: 72 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  res that are not
6f60: 20 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65   provided by the
6f70: 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 20   Eagle..      # 
6f80: 20 20 20 20 20 20 6c 69 62 72 61 72 79 20 70 61        library pa
6f90: 63 6b 61 67 65 20 28 69 2e 65 2e 20 22 69 6e 69  ckage (i.e. "ini
6fa0: 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e 63 6c 75  t.eagle"), inclu
6fb0: 64 69 6e 67 20 74 68 6f 73 65 20 70 72 6f 76 69  ding those provi
6fc0: 64 65 64 20 62 79 0d 0a 20 20 20 20 20 20 23 20  ded by..      # 
6fd0: 20 20 20 20 20 20 74 68 65 20 45 61 67 6c 65 20        the Eagle 
6fe0: 74 65 73 74 20 70 61 63 6b 61 67 65 2c 20 75 6e  test package, un
6ff0: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 63 6f  less the file co
7000: 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d 20 69 73  ntaining them is
7010: 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20 23   loaded..      #
7020: 20 20 20 20 20 20 20 6d 61 6e 75 61 6c 6c 79 20         manually 
7030: 76 69 61 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d  via some other m
7040: 65 63 68 61 6e 69 73 6d 20 28 65 2e 67 2e 20 62  echanism (e.g. b
7050: 79 20 69 6e 63 6c 75 64 69 6e 67 20 61 70 70 72  y including appr
7060: 6f 70 72 69 61 74 65 0d 0a 20 20 20 20 20 20 23  opriate..      #
7070: 20 20 20 20 20 20 20 5b 70 61 63 6b 61 67 65 20         [package 
7080: 72 65 71 75 69 72 65 5d 20 6f 72 20 5b 73 6f 75  require] or [sou
7090: 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73 20 69 6e  rce] commands in
70a0: 20 74 68 65 20 70 72 65 66 69 78 20 6f 72 20 73   the prefix or s
70b0: 75 66 66 69 78 0d 0a 20 20 20 20 20 20 23 20 20  uffix..      #  
70c0: 20 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67       script frag
70d0: 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f 2c 20 61  ments).  Also, a
70e0: 6c 6c 20 76 61 72 69 61 62 6c 65 20 72 65 66 65  ll variable refe
70f0: 72 65 6e 63 65 73 20 61 6e 64 20 61 6c 6c 20 6e  rences and all n
7100: 65 73 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20  ested..      #  
7110: 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73 20 28 69       commands (i
7120: 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20 73 71 75  .e. those in squ
7130: 61 72 65 20 62 72 61 63 6b 65 74 73 29 20 63 6f  are brackets) co
7140: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 66  ntained in the f
7150: 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  inal..      #   
7160: 20 20 20 20 73 63 72 69 70 74 20 66 72 61 67 6d      script fragm
7170: 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20 75 70 20  ent will end up 
7180: 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 20  being evaluated 
7190: 69 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f  in the context o
71a0: 66 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  f the..      #  
71b0: 20 20 20 20 20 63 61 6c 6c 69 6e 67 20 69 6e 74       calling int
71c0: 65 72 70 72 65 74 65 72 20 61 6e 64 20 6e 6f 74  erpreter and not
71d0: 20 74 68 65 20 74 61 72 67 65 74 20 69 6e 74 65   the target inte
71e0: 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64 20  rpreter created 
71f0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
7200: 20 20 20 20 20 20 69 73 6f 6c 61 74 65 64 20 61        isolated a
7210: 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69  pplication domai
7220: 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 64 6f 6c  n unless the dol
7230: 6c 61 72 20 73 69 67 6e 73 20 61 6e 64 2f 6f 72  lar signs and/or
7240: 20 73 71 75 61 72 65 0d 0a 20 20 20 20 20 20 23   square..      #
7250: 20 20 20 20 20 20 20 62 72 61 63 6b 65 74 73 20         brackets 
7260: 61 72 65 20 73 70 65 63 69 61 6c 6c 79 20 71 75  are specially qu
7270: 6f 74 65 64 20 77 69 74 68 20 62 61 63 6b 73 6c  oted with backsl
7280: 61 73 68 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ashes...      #.
7290: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 75  .      return [u
72a0: 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73  plevel 1 [list s
72b0: 75 62 73 74 20 5b 61 70 70 65 6e 64 41 72 67 73  ubst [appendArgs
72c0: 20 24 70 72 65 66 69 78 20 7b 0d 0a 20 20 20 20   $prefix {..    
72d0: 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e 74      if {[hasRunt
72e0: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
72f0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7300: 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
7310: 6b 65 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47  ke Interpreter.G
7320: 65 74 41 63 74 69 76 65 20 41 64 64 52 75 6e 74  etActive AddRunt
7330: 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76 65  imeOption native
7340: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
7350: 20 20 20 7d 20 5b 67 65 74 54 65 73 74 4f 76 65     } [getTestOve
7360: 72 72 69 64 65 73 50 72 65 61 6d 62 6c 65 20 5b  rridesPreamble [
7370: 6c 69 73 74 20 70 61 74 68 20 74 65 73 74 5f 63  list path test_c
7380: 68 61 6e 6e 65 6c 5d 5d 20 24 73 75 66 66 69 78  hannel]] $suffix
7390: 5d 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ]]]..    }..... 
73a0: 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70 79 42     proc tryCopyB
73b0: 69 6e 61 72 79 46 69 6c 65 20 7b 20 66 69 6c 65  inaryFile { file
73c0: 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d 20 22  Name {platform "
73d0: 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d 65 20  "} {newFileName 
73e0: 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
73f0: 65 74 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  et sourceFileNam
7400: 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  e [getBinaryFile
7410: 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24  Name $fileName $
7420: 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20  platform]....   
7430: 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
7440: 69 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65  ists $sourceFile
7450: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
7460: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
7470: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
7480: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
7490: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
74a0: 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 62 69  ipped copying bi
74b0: 6e 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 73  nary file \"" $s
74c0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d  ourceFileName \.
74d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22  .            "\"
74e0: 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  , it does not ex
74f0: 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20  ist\n"]....     
7500: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
7510: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
7520: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
7530: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
7540: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
7550: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
7560: 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46 69  Name [getBuildFi
7570: 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65 4e  leName $newFileN
7580: 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a  ame $platform]..
7590: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
75a0: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
75b0: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
75c0: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 24 66 69  uildFileName $fi
75d0: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
75e0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ]..      }....  
75f0: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
7600: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7610: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
7620: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
7630: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
7640: 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  }] == 0} then {.
7650: 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
7660: 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
7670: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
7680: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
7690: 63 6f 70 69 65 64 20 62 69 6e 61 72 79 20 66 69  copied binary fi
76a0: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
76b0: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
76c0: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
76d0: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
76e0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
76f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7700: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7710: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7720: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7730: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
7740: 65 64 20 74 6f 20 63 6f 70 79 20 62 69 6e 61 72  ed to copy binar
7750: 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20  y file from \"" 
7760: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
7770: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
7780: 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65  \" to \"" $targe
7790: 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d  tFileName \"\n].
77a0: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
77b0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79  ....    proc try
77c0: 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20 7b 20  CopyBuildFile { 
77d0: 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f  fileName {platfo
77e0: 72 6d 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e  rm ""} {newFileN
77f0: 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20  ame ""} } {..   
7800: 20 20 20 73 65 74 20 73 6f 75 72 63 65 46 69 6c     set sourceFil
7810: 65 4e 61 6d 65 20 5b 67 65 74 42 75 69 6c 64 46  eName [getBuildF
7820: 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d  ileName $fileNam
7830: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a  e $platform]....
7840: 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65        if {![file
7850: 20 65 78 69 73 74 73 20 24 73 6f 75 72 63 65 46   exists $sourceF
7860: 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
7870: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
7880: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
7890: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
78a0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
78b0: 20 73 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67   skipped copying
78c0: 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22 22 20   build file \"" 
78d0: 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20  $sourceFileName 
78e0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
78f0: 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  \", it does not 
7900: 65 78 69 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  exist\n"]....   
7910: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
7920: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
7930: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
7940: 20 24 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e   $newFileName] >
7950: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
7960: 20 20 20 20 73 65 74 20 74 61 72 67 65 74 46 69      set targetFi
7970: 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72  leName [getBinar
7980: 79 46 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69  yFileName $newFi
7990: 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d  leName $platform
79a0: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
79b0: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74  {..        set t
79c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67  argetFileName [g
79d0: 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
79e0: 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74   $fileName $plat
79f0: 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  form]..      }..
7a00: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
7a10: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
7a20: 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66      file copy -f
7a30: 6f 72 63 65 20 24 73 6f 75 72 63 65 46 69 6c 65  orce $sourceFile
7a40: 4e 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65  Name $targetFile
7a50: 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  Name}] == 0} the
7a60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
7a70: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
7a80: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
7a90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
7aa0: 2d 2d 2d 20 63 6f 70 69 65 64 20 62 75 69 6c 64  --- copied build
7ab0: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
7ac0: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 22  sourceFileName "
7ad0: 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20  \" to \"" \..   
7ae0: 20 20 20 20 20 20 20 20 20 24 74 61 72 67 65 74           $target
7af0: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
7b00: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
7b10: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
7b20: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
7b30: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
7b40: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
7b50: 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20 62 75  ailed to copy bu
7b60: 69 6c 64 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22  ild file from \"
7b70: 22 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  " $sourceFileNam
7b80: 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
7b90: 20 22 5c 22 20 74 6f 20 5c 22 22 20 24 74 61 72   "\" to \"" $tar
7ba0: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  getFileName \"\n
7bb0: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
7bc0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
7bd0: 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46 69  ryDeleteBinaryFi
7be0: 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  le { fileName {p
7bf0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
7c00: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
7c10: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
7c20: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
7c30: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
7c40: 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
7c50: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
7c60: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7c70: 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
7c80: 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
7c90: 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
7ca0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
7cb0: 64 20 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72  d deleting binar
7cc0: 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65  y file \"" $file
7cd0: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
7ce0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
7cf0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
7d00: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
7d10: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7d20: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
7d30: 69 6c 65 20 64 65 6c 65 74 65 20 24 66 69 6c 65  ile delete $file
7d40: 4e 61 6d 65 7d 5d 20 3d 3d 20 30 7d 20 74 68 65  Name}] == 0} the
7d50: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
7d60: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
7d70: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
7d80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d  ..            "-
7d90: 2d 2d 2d 20 64 65 6c 65 74 65 64 20 62 69 6e 61  --- deleted bina
7da0: 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69 6c  ry file \"" $fil
7db0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
7dc0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
7dd0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7de0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
7df0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
7e00: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
7e10: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 62 69 6e  ed to delete bin
7e20: 61 72 79 20 66 69 6c 65 20 5c 22 22 20 24 66 69  ary file \"" $fi
7e30: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
7e40: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
7e50: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c  .    proc tryDel
7e60: 65 74 65 42 75 69 6c 64 46 69 6c 65 20 7b 20 66  eteBuildFile { f
7e70: 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72  ileName {platfor
7e80: 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  m ""} } {..     
7e90: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67   set fileName [g
7ea0: 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20  etBuildFileName 
7eb0: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
7ec0: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
7ed0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
7ee0: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
7ef0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
7f00: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
7f10: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
7f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
7f30: 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74  -- skipped delet
7f40: 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ing build file \
7f50: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
7f70: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
7f80: 73 74 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  st\n"]....      
7f90: 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20    return..      
7fa0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
7fb0: 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65  catch {file dele
7fc0: 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d  te $fileName}] =
7fd0: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
7fe0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
7ff0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
8000: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
8010: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65        "---- dele
8020: 74 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ted build file \
8030: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
8040: 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  n]..      } else
8050: 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
8060: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
8070: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
8080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
8090: 2d 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c  -- failed to del
80a0: 65 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c  ete build file \
80b0: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c  "" $fileName \"\
80c0: 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  n]..      }..   
80d0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
80e0: 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20  tryCopyAssembly 
80f0: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
8100: 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20 74 72  form ""} {pdb tr
8110: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ue} } {..      t
8120: 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
8130: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
8140: 6f 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  orm....      if 
8150: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
8160: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
8170: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
8180: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
8190: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
81a0: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
81b0: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  b] $platform..  
81c0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
81d0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44 65 6c  .    proc tryDel
81e0: 65 74 65 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  eteAssembly { fi
81f0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
8200: 20 22 22 7d 20 7b 70 64 62 20 74 72 75 65 7d 20   ""} {pdb true} 
8210: 7d 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 44 65  } {..      tryDe
8220: 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24  leteBinaryFile $
8230: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
8240: 72 6d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  rm....      if {
8250: 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  $pdb} then {..  
8260: 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 42        tryDeleteB
8270: 69 6e 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e  inaryFile [appen
8280: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
8290: 20 20 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e       [file rootn
82a0: 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e  ame $fileName] .
82b0: 70 64 62 5d 20 24 70 6c 61 74 66 6f 72 6d 0d 0a  pdb] $platform..
82c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
82d0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 4c  ...    proc tryL
82e0: 6f 61 64 41 73 73 65 6d 62 6c 79 20 7b 20 66 69  oadAssembly { fi
82f0: 6c 65 4e 61 6d 65 20 7b 70 6c 61 74 66 6f 72 6d  leName {platform
8300: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
8310: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 67 65  set fileName [ge
8320: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
8330: 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66  $fileName $platf
8340: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
8350: 20 7b 5b 63 61 74 63 68 20 7b 73 65 74 20 61 73   {[catch {set as
8360: 73 65 6d 62 6c 79 20 5c 0d 0a 20 20 20 20 20 20  sembly \..      
8370: 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
8380: 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46  load -loadtype F
8390: 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65  ile -alias $file
83a0: 4e 61 6d 65 5d 7d 5d 20 3d 3d 20 30 7d 20 74 68  Name]}] == 0} th
83b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
83c0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
83d0: 20 4e 6f 77 2c 20 61 64 64 20 74 68 65 20 6e 65   Now, add the ne
83e0: 63 65 73 73 61 72 79 20 74 65 73 74 20 63 6f 6e  cessary test con
83f0: 73 74 72 61 69 6e 74 2e 0d 0a 20 20 20 20 20 20  straint...      
8400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
8410: 43 6f 6e 73 74 72 61 69 6e 74 20 5b 66 69 6c 65  Constraint [file
8420: 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65 20   rootname [file 
8430: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
8440: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
8450: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 47         # NOTE: G
8460: 72 61 62 20 74 68 65 20 69 6d 61 67 65 20 72 75  rab the image ru
8470: 6e 74 69 6d 65 20 76 65 72 73 69 6f 6e 20 66 72  ntime version fr
8480: 6f 6d 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20  om the assembly 
8490: 62 65 63 61 75 73 65 0d 0a 20 20 20 20 20 20 20  because..       
84a0: 20 23 20 20 20 20 20 20 20 73 65 76 65 72 61 6c   #       several
84b0: 20 74 65 73 74 73 20 72 65 6c 79 20 6f 6e 20 69   tests rely on i
84c0: 74 20 68 61 76 69 6e 67 20 61 20 63 65 72 74 61  t having a certa
84d0: 69 6e 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20  in value...     
84e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64     #..        ad
84f0: 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
8500: 65 6e 64 41 72 67 73 20 5b 66 69 6c 65 20 74 61  endArgs [file ta
8510: 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 20 5f 20  il $fileName] _ 
8520: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
8530: 24 61 73 73 65 6d 62 6c 79 20 49 6d 61 67 65 52  $assembly ImageR
8540: 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 5d 5d 0d  untimeVersion]].
8550: 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8560: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
8570: 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
8580: 74 68 20 6f 66 20 74 68 65 20 6c 6f 61 64 65 64  th of the loaded
8590: 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
85a0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
85b0: 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20  n $fileName..   
85c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65     }....      re
85d0: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a  turn ""..    }..
85e0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 53 51  ...    proc isSQ
85f0: 4c 69 74 65 52 65 61 64 79 20 7b 7d 20 7b 0d 0a  LiteReady {} {..
8600: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8610: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
8620: 65 64 75 72 65 20 6d 75 73 74 20 72 65 74 75 72  edure must retur
8630: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  n non-zero only 
8640: 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 6e 61  if the SQLite na
8650: 74 69 76 65 0d 0a 20 20 20 20 20 20 23 20 20 20  tive..      #   
8660: 20 20 20 20 6c 69 62 72 61 72 79 20 61 6e 64 20      library and 
8670: 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
8680: 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20 61  SQLite managed a
8690: 73 73 65 6d 62 6c 79 20 61 72 65 20 6c 6f 61 64  ssembly are load
86a0: 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ed..      #     
86b0: 20 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20    and ready for 
86c0: 75 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20  use by the test 
86d0: 73 75 69 74 65 2e 20 20 43 75 72 72 65 6e 74 6c  suite.  Currentl
86e0: 79 2c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  y, this procedur
86f0: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8700: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
8710: 64 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d only after the
8720: 20 5b 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c   [tryLoadAssembl
8730: 79 5d 20 70 72 6f 63 65 64 75 72 65 20 68 61 73  y] procedure has
8740: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
8750: 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70  been called to p
8760: 72 6f 62 65 20 66 6f 72 20 74 68 65 20 53 79 73  robe for the Sys
8770: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
8780: 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
8790: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
87a0: 61 6e 64 20 74 68 65 20 5b 63 68 65 63 6b 46 6f  and the [checkFo
87b0: 72 53 51 4c 69 74 65 5d 20 70 72 6f 63 65 64 75  rSQLite] procedu
87c0: 72 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  re has been call
87d0: 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72 0d  ed to probe for.
87e0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
87f0: 68 65 20 53 51 4c 69 74 65 20 6e 61 74 69 76 65  he SQLite native
8800: 20 6c 69 62 72 61 72 79 3b 20 6f 74 68 65 72 77   library; otherw
8810: 69 73 65 2c 20 74 68 69 73 20 70 72 6f 63 65 64  ise, this proced
8820: 75 72 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 0d  ure will simply.
8830: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
8840: 6c 77 61 79 73 20 72 65 74 75 72 6e 20 7a 65 72  lways return zer
8850: 6f 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  o...      #..   
8860: 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20     return [expr 
8870: 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  {[haveConstraint
8880: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
8890: 69 74 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ite] && \..     
88a0: 20 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72       [haveConstr
88b0: 61 69 6e 74 20 53 51 4c 69 74 65 5d 7d 5d 0d 0a  aint SQLite]}]..
88c0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
88d0: 6f 63 20 6d 61 74 63 68 4d 61 63 68 69 6e 65 20  oc matchMachine 
88e0: 7b 20 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a  { platform } {..
88f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
8900: 20 4e 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20   NOTE: An empty 
8910: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70  string for the p
8920: 6c 61 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68  latform means th
8930: 61 74 20 74 68 65 20 62 75 69 6c 64 20 69 73 20  at the build is 
8940: 6e 6f 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20  not..      #    
8950: 20 20 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61     [primarily] a
8960: 20 6e 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74   native build; t
8970: 68 65 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77  herefore, it alw
8980: 61 79 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20  ays matches...  
8990: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
89a0: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
89b0: 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
89c0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
89d0: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
89e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
89f0: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
8a00: 44 6f 65 73 20 74 68 65 20 73 70 65 63 69 66 69  Does the specifi
8a10: 65 64 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63  ed platform matc
8a20: 68 20 75 70 20 74 6f 20 74 68 65 20 63 75 72 72  h up to the curr
8a30: 65 6e 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20  ent process?..  
8a40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
8a50: 7b 24 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d  {$platform eq [m
8a60: 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d  achineToPlatform
8a70: 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d   $::tcl_platform
8a80: 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e  (machine)]} then
8a90: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
8aa0: 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d  rn true..      }
8ab0: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
8ac0: 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73     # NOTE: The s
8ad0: 70 65 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72  pecified platfor
8ae0: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
8af0: 20 75 70 20 77 69 74 68 20 74 68 65 20 70 6c 61   up with the pla
8b00: 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20  tform..      #  
8b10: 20 20 20 20 20 66 6f 72 20 74 68 65 20 63 75 72       for the cur
8b20: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20  rent process... 
8b30: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65       #..      re
8b40: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
8b50: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
8b60: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 42 75 69  heckForSQLiteBui
8b70: 6c 64 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  lds { channel {s
8b80: 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20 7b  elect false} } {
8b90: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
8ba0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66   # NOTE: Check f
8bb0: 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
8bc0: 65 20 76 61 6c 69 64 20 63 6f 6d 62 69 6e 61 74  e valid combinat
8bd0: 69 6f 6e 20 6f 66 20 76 61 6c 75 65 73 20 75 73  ion of values us
8be0: 65 64 20 77 68 65 6e 0d 0a 20 20 20 20 20 20 23  ed when..      #
8bf0: 20 20 20 20 20 20 20 6c 6f 63 61 74 69 6e 67 20         locating 
8c00: 6f 75 74 20 74 68 65 20 62 75 69 6c 64 20 6f 75  out the build ou
8c10: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 2c 20  tput directory, 
8c20: 73 68 6f 77 69 6e 67 20 65 61 63 68 20 61 76 61  showing each ava
8c30: 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 23 20  ilable..      # 
8c40: 20 20 20 20 20 20 62 75 69 6c 64 20 76 61 72 69        build vari
8c50: 61 74 69 6f 6e 20 61 6c 6f 6e 67 20 74 68 65 20  ation along the 
8c60: 77 61 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  way...      #.. 
8c70: 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 74       foreach nat
8c80: 69 76 65 20 5b 6c 69 73 74 20 66 61 6c 73 65 20  ive [list false 
8c90: 74 72 75 65 5d 20 7b 0d 0a 20 20 20 20 20 20 20  true] {..       
8ca0: 20 66 6f 72 65 61 63 68 20 79 65 61 72 20 5b 67   foreach year [g
8cb0: 65 74 42 75 69 6c 64 59 65 61 72 73 5d 20 7b 0d  etBuildYears] {.
8cc0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
8cd0: 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ch configuration
8ce0: 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
8cf0: 75 72 61 74 69 6f 6e 73 5d 20 7b 0d 0a 20 20 20  urations] {..   
8d00: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
8d10: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
8d20: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
8d30: 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20 70  ffective build p
8d40: 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69  latform.  This i
8d50: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  s..            #
8d60: 20 20 20 20 20 20 20 62 61 73 65 64 20 6f 6e 20         based on 
8d70: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
8d80: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e 61 74   [primarily] nat
8d90: 69 76 65 20 62 75 69 6c 64 0d 0a 20 20 20 20 20  ive build..     
8da0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69         #       i
8db0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 46  s being used.  F
8dc0: 6f 72 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 6e  or [primarily] n
8dd0: 6f 6e 2d 6e 61 74 69 76 65 20 62 75 69 6c 64 73  on-native builds
8de0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ,..            #
8df0: 20 20 20 20 20 20 20 74 68 69 73 20 77 69 6c 6c         this will
8e00: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
8e10: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
8e20: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
8e30: 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
8e40: 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
8e50: 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a 20 20 20 20  $native]....    
8e60: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
8e70: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
8e80: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
8e90: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
8ea0: 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
8eb0: 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
8ec0: 64 20 5c 22 22 20 5b 65 78 70 72 20 5c 0d 0a 20  d \"" [expr \.. 
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8ee0: 24 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76  $native ? "nativ
8ef0: 65 2f 22 20 3a 20 22 22 7d 5d 20 5b 65 78 70 72  e/" : ""}] [expr
8f00: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
8f10: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
8f20: 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e      $platform] >
8f30: 20 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73   0 ? [appendArgs
8f40: 20 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20   $platform /] : 
8f50: 22 22 7d 5d 20 24 79 65 61 72 20 5c 0d 0a 20 20  ""}] $year \..  
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20                / 
8f70: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22  $configuration "
8f80: 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
8f90: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8fa0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42         # NOTE: B
8fb0: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
8fc0: 75 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f  ualified directo
8fd0: 72 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63  ry where the nec
8fe0: 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20  essary..        
8ff0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70      #       comp
9000: 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
9010: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
9020: 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d 0a  ould be found...
9030: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
9040: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 64             set d
9050: 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42 75  irectory [joinBu
9060: 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e 61  ildDirectory $na
9070: 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  tive \..        
9080: 20 20 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c          [getBuil
9090: 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20  dBaseDirectory] 
90a0: 24 79 65 61 72 20 24 70 6c 61 74 66 6f 72 6d 20  $year $platform 
90b0: 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5d 0d  $configuration].
90c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
90d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
90e0: 4e 4f 54 45 3a 20 44 6f 20 74 68 65 20 6e 65 63  NOTE: Do the nec
90f0: 65 73 73 61 72 79 20 66 69 6c 65 73 20 65 78 69  essary files exi
9100: 73 74 3f 20 20 43 75 72 72 65 6e 74 6c 79 2c 20  st?  Currently, 
9110: 6e 6f 20 6f 74 68 65 72 20 73 74 65 70 73 0d 0a  no other steps..
9120: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
9130: 20 20 20 20 61 72 65 20 74 61 6b 65 6e 20 74 6f      are taken to
9140: 20 76 65 72 69 66 79 20 74 68 69 73 20 62 75 69   verify this bui
9150: 6c 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 76  ld is actually v
9160: 69 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  iable...        
9170: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
9180: 20 20 20 69 66 20 7b 5b 69 73 42 75 69 6c 64 41     if {[isBuildA
9190: 76 61 69 6c 61 62 6c 65 20 24 6e 61 74 69 76 65  vailable $native
91a0: 20 24 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68   $directory]} th
91b0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
91c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
91d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
91e0: 6e 20 69 6e 20 22 73 65 6c 65 63 74 22 20 6d 6f  n in "select" mo
91f0: 64 65 2c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  de, automaticall
9200: 79 20 73 65 6c 65 63 74 20 74 68 65 20 66 69 72  y select the fir
9210: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
9220: 20 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61    #       availa
9230: 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73  ble build of Sys
9240: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
9250: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 0d  and then return.
9260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
9270: 20 20 20 20 20 20 20 69 6d 6d 65 64 69 61 74 65         immediate
9280: 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly...           
9290: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
92a0: 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74 20      if {$select 
92b0: 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65  && [matchMachine
92c0: 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65   $platform]} the
92d0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
92e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
92f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9300: 4d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64  Manually overrid
9310: 65 20 61 6c 6c 20 74 68 65 20 62 75 69 6c 64 20  e all the build 
9320: 64 69 72 65 63 74 6f 72 79 20 73 65 6c 65 63 74  directory select
9330: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ion..           
9340: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 6c       #       rel
9350: 61 74 65 64 20 74 65 73 74 20 73 65 74 74 69 6e  ated test settin
9360: 67 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  gs in order to f
9370: 6f 72 63 65 20 74 68 69 73 20 62 75 69 6c 64 0d  orce this build.
9380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9390: 20 23 20 20 20 20 20 20 20 6f 66 20 53 79 73 74   #       of Syst
93a0: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 74  em.Data.SQLite t
93b0: 6f 20 62 65 20 75 73 65 64 2e 0d 0a 20 20 20 20  o be used...    
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
93e0: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
93f0: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
9400: 76 65 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76  ve [expr {$nativ
9410: 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e ? \..         
9420: 20 20 20 20 20 20 20 20 20 20 20 22 41 64 64 52             "AddR
9430: 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22 20 3a 20  untimeOption" : 
9440: 22 52 65 6d 6f 76 65 52 75 6e 74 69 6d 65 4f 70  "RemoveRuntimeOp
9450: 74 69 6f 6e 22 7d 5d 20 20 6e 61 74 69 76 65 0d  tion"}]  native.
9460: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
9470: 20 20 20 73 65 74 20 3a 3a 74 65 73 74 5f 79 65     set ::test_ye
9480: 61 72 20 24 79 65 61 72 0d 0a 20 20 20 20 20 20  ar $year..      
9490: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
94a0: 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24 70  test_platform $p
94b0: 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
94c0: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74           set ::t
94d0: 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f  est_configuratio
94e0: 6e 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  n $configuration
94f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9500: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
9510: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
9520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9530: 20 20 20 20 20 20 22 79 65 73 2c 20 73 65 6c 65        "yes, sele
9540: 63 74 65 64 20 28 22 20 5b 65 78 70 72 20 7b 24  cted (" [expr {$
9550: 6e 61 74 69 76 65 20 3f 20 22 6e 61 74 69 76 65  native ? "native
9560: 2f 22 20 3a 20 22 22 7d 5d 20 5c 0d 0a 20 20 20  /" : ""}] \..   
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9580: 20 5b 65 78 70 72 20 7b 5b 73 74 72 69 6e 67 20   [expr {[string 
9590: 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
95a0: 5d 20 3e 20 30 20 3f 20 5b 61 70 70 65 6e 64 41  ] > 0 ? [appendA
95b0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
95c0: 20 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74             $plat
95d0: 66 6f 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24  form /] : ""}] $
95e0: 79 65 61 72 20 2f 20 24 63 6f 6e 66 69 67 75 72  year / $configur
95f0: 61 74 69 6f 6e 20 22 29 5c 6e 22 5d 0d 0a 0d 0a  ation ")\n"]....
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
9620: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
9630: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
9640: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
9650: 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20  nel yes\n..     
9660: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
9670: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9680: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9690: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e  tputs $channel n
96a0: 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  o\n..           
96b0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
96c0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
96d0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
96e0: 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d  urn false..    }
96f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
9700: 65 63 6b 46 6f 72 53 51 4c 69 74 65 52 65 6c 65  eckForSQLiteRele
9710: 61 73 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  ases { channel {
9720: 73 65 6c 65 63 74 20 66 61 6c 73 65 7d 20 7d 20  select false} } 
9730: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
9740: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
9750: 66 6f 72 20 70 61 73 74 20 72 65 6c 65 61 73 65  for past release
9760: 73 20 6f 66 20 53 79 73 74 65 6d 2e 44 61 74 61  s of System.Data
9770: 2e 53 51 4c 69 74 65 20 69 6e 20 74 68 65 20 64  .SQLite in the d
9780: 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
9790: 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 65  #       containe
97a0: 64 20 69 6e 20 74 68 65 20 22 53 79 73 74 65 6d  d in the "System
97b0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 22 20 65 6e  .Data.SQLite" en
97c0: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
97d0: 6c 65 2c 20 69 66 0d 0a 20 20 20 20 20 20 23 20  le, if..      # 
97e0: 20 20 20 20 20 20 70 72 65 73 65 6e 74 2e 0d 0a        present...
97f0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
9800: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
9810: 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74  ::env(System.Dat
9820: 61 2e 53 51 4c 69 74 65 29 5d 20 26 26 20 5c 0d  a.SQLite)] && \.
9830: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
9840: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 65 6e 76  ng length $::env
9850: 28 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  (System.Data.SQL
9860: 69 74 65 29 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ite)] > 0} then 
9870: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
9880: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75        # NOTE: Bu
9890: 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ild the fully qu
98a0: 61 6c 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  alified director
98b0: 79 20 77 68 65 72 65 20 74 68 65 20 6e 65 63 65  y where the nece
98c0: 73 73 61 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ssary..        #
98d0: 20 20 20 20 20 20 20 63 6f 6d 70 6f 6e 65 6e 74         component
98e0: 73 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  s for System.Dat
98f0: 61 2e 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 20  a.SQLite should 
9900: 62 65 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20  be found...     
9910: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
9920: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 66 69 6c  t directory [fil
9930: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
9940: 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
9950: 20 20 20 20 20 20 20 24 3a 3a 65 6e 76 28 53 79         $::env(Sy
9960: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
9970: 29 20 5b 67 65 74 52 65 6c 65 61 73 65 56 65 72  ) [getReleaseVer
9980: 73 69 6f 6e 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  sion]]]....     
9990: 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
99a0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
99b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
99c0: 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
99d0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
99e0: 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22 20 5c  te release \"" \
99f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 64  ..            $d
9a00: 69 72 65 63 74 6f 72 79 20 22 5c 22 2e 2e 2e 20  irectory "\"... 
9a10: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  "]....        if
9a20: 20 7b 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69   {[isReleaseAvai
9a30: 6c 61 62 6c 65 20 24 64 69 72 65 63 74 6f 72 79  lable $directory
9a40: 20 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e   platform]} then
9a50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
9a60: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
9a70: 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30   $platform] == 0
9a80: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
9a90: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
9aa0: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
9ab0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
9ac0: 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63 74       if {$select
9ad0: 20 26 26 20 5b 6d 61 74 63 68 4d 61 63 68 69 6e   && [matchMachin
9ae0: 65 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  e $platform]} th
9af0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
9b00: 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f 64 69    set ::build_di
9b10: 72 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f  rectory $directo
9b20: 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ry....          
9b30: 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
9b40: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65   [appendArgs "ye
9b50: 73 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 24  s, selected (" $
9b60: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
9b70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
9b80: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
9b90: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
9bb0: 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
9bc0: 6e 64 41 72 67 73 20 22 79 65 73 20 28 22 20 24  ndArgs "yes (" $
9bd0: 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e 22 5d 0d  platform ")\n"].
9be0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
9bf0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
9c00: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
9c10: 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 0d  $channel no\n...
9c20: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
9c30: 63 68 20 70 61 74 68 20 5b 6c 73 6f 72 74 20 2d  ch path [lsort -
9c40: 64 65 63 72 65 61 73 69 6e 67 20 5b 66 69 6c 65  decreasing [file
9c50: 20 6c 69 73 74 20 24 64 69 72 65 63 74 6f 72 79   list $directory
9c60: 20 2a 5d 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20   *]] {..        
9c70: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
9c80: 69 73 74 73 20 24 70 61 74 68 5d 20 26 26 20 5b  ists $path] && [
9c90: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
9ca0: 20 24 70 61 74 68 5d 7d 20 74 68 65 6e 20 7b 0d   $path]} then {.
9cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
9cc0: 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
9cd0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9cf0: 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
9d00: 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
9d10: 4c 69 74 65 20 72 65 6c 65 61 73 65 20 5c 22 22  Lite release \""
9d20: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
9d30: 20 20 20 20 20 20 24 70 61 74 68 20 22 5c 22 2e        $path "\".
9d40: 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .. "]....       
9d50: 20 20 20 20 20 20 20 69 66 20 7b 5b 69 73 52 65         if {[isRe
9d60: 6c 65 61 73 65 41 76 61 69 6c 61 62 6c 65 20 24  leaseAvailable $
9d70: 70 61 74 68 20 70 6c 61 74 66 6f 72 6d 5d 7d 20  path platform]} 
9d80: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
9d90: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
9da0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74  ing length $plat
9db0: 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  form] == 0} then
9dc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
9dd0: 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f        set platfo
9de0: 72 6d 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20 20  rm unknown..    
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
9e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9e10: 20 69 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20   if {$select && 
9e20: 5b 6d 61 74 63 68 4d 61 63 68 69 6e 65 20 24 70  [matchMachine $p
9e30: 6c 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b  latform]} then {
9e40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9e50: 20 20 20 20 73 65 74 20 3a 3a 62 75 69 6c 64 5f      set ::build_
9e60: 64 69 72 65 63 74 6f 72 79 20 24 70 61 74 68 0d  directory $path.
9e70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
9e80: 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
9e90: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
9ea0: 22 79 65 73 2c 20 73 65 6c 65 63 74 65 64 20 28  "yes, selected (
9eb0: 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29 5c 6e  " $platform ")\n
9ec0: 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
9ed0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
9ee0: 72 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rue..           
9ef0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f10: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
9f20: 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79 65 73  [appendArgs "yes
9f30: 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20 22 29   (" $platform ")
9f40: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
9f50: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
9f60: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
9f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9f80: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
9f90: 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  no\n..          
9fa0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
9fb0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
9fc0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
9fd0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
9fe0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
9ff0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
a000: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a010: 22 2d 2d 2d 2d 20 65 6e 76 69 72 6f 6e 6d 65 6e  "---- environmen
a020: 74 20 76 61 72 69 61 62 6c 65 20 5c 22 53 79 73  t variable \"Sys
a030: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c  tem.Data.SQLite\
a040: 22 20 69 73 20 6e 6f 74 20 22 20 5c 0d 0a 20 20  " is not " \..  
a050: 20 20 20 20 20 20 20 20 20 20 22 73 65 74 2c 20            "set, 
a060: 73 6b 69 70 70 69 6e 67 20 63 68 65 63 6b 20 66  skipping check f
a070: 6f 72 20 72 65 6c 65 61 73 65 73 2e 2e 2e 5c 6e  or releases...\n
a080: 22 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  "]..      }.... 
a090: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
a0a0: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
a0b0: 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51   proc checkForSQ
a0c0: 4c 69 74 65 4c 69 62 72 61 72 79 20 7b 20 63 68  LiteLibrary { ch
a0d0: 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20 20 20 20 20  annel } {..     
a0e0: 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
a0f0: 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
a100: 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  or SQLite core l
a110: 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d 0a 20  ibrary... ".... 
a120: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a130: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a140: 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
a150: 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
a160: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
a170: 69 74 65 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20  ite.SQLite3 \.. 
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
a190: 69 74 65 56 65 72 73 69 6f 6e 7d 20 76 65 72 73  iteVersion} vers
a1a0: 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ion] == 0} then 
a1b0: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
a1c0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
a1d0: 65 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72  eck if the retur
a1e0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20  ned version was 
a1f0: 6e 75 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61  null.  If so, ma
a200: 6b 65 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20  ke it easy..    
a210: 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 73      #       to s
a220: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
a230: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
a240: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72  ring length $ver
a250: 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  sion] == 0} then
a260: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
a270: 74 20 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a  t version null..
a280: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
a290: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
a2a0: 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20  # NOTE: Attempt 
a2b0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
a2c0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
a2d0: 69 66 69 65 72 20 66 6f 72 20 74 68 65 20 53 51  ifier for the SQ
a2e0: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20  Lite..        # 
a2f0: 20 20 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61        core libra
a300: 72 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ry...        #..
a310: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
a320: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
a330: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
a340: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
a350: 75 62 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74  ublic System.Dat
a360: 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33  a.SQLite.SQLite3
a370: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a380: 20 20 20 20 53 51 4c 69 74 65 53 6f 75 72 63 65      SQLiteSource
a390: 49 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74  Id} sourceId]} t
a3a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
a3b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
a3c0: 4e 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20  NOTE: We failed 
a3d0: 74 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73  to query the Fos
a3e0: 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74  sil source ident
a3f0: 69 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  ifier...        
a400: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
a410: 65 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e  et sourceId unkn
a420: 6f 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  own..        }..
a430: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a440: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
a450: 63 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ck if the return
a460: 65 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  ed Fossil source
a470: 20 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20   identifier was 
a480: 6e 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20  null.  If..     
a490: 20 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d     #       so, m
a4a0: 61 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73  ake it easy to s
a4b0: 70 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  pot...        #.
a4c0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
a4d0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75  ring length $sou
a4e0: 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65  rceId] == 0} the
a4f0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  n {..          s
a500: 65 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c  et sourceId null
a510: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
a520: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a530: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
a540: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
a550: 69 62 72 61 72 79 20 61 70 70 65 61 72 73 20 74  ibrary appears t
a560: 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 2e 0d  o be available..
a570: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a580: 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
a590: 74 20 53 51 4c 69 74 65 0d 0a 0d 0a 20 20 20 20  t SQLite....    
a5a0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
a5b0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
a5c0: 79 65 73 20 28 22 20 24 76 65 72 73 69 6f 6e 20  yes (" $version 
a5d0: 22 20 22 20 24 73 6f 75 72 63 65 49 64 20 22 29  " " $sourceId ")
a5e0: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  \n"]..      } el
a5f0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
a600: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c  uts $channel no\
a610: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  n..      }..    
a620: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
a630: 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49 6e 74  heckForSQLiteInt
a640: 65 72 6f 70 20 7b 20 63 68 61 6e 6e 65 6c 20 7d  erop { channel }
a650: 20 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   {..      tputs 
a660: 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63  $channel "---- c
a670: 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69  hecking for SQLi
a680: 74 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  te interop assem
a690: 62 6c 79 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  bly... "....    
a6a0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
a6c0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
a6d0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 53 79  gs +NonPublic Sy
a6e0: 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
a6f0: 2e 53 51 4c 69 74 65 33 20 5c 0d 0a 20 20 20 20  .SQLite3 \..    
a700: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 72 6f            Intero
a710: 70 56 65 72 73 69 6f 6e 7d 20 76 65 72 73 69 6f  pVersion} versio
a720: 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  n] == 0} then {.
a730: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a740: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
a750: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
a760: 64 20 76 65 72 73 69 6f 6e 20 77 61 73 20 6e 75  d version was nu
a770: 6c 6c 2e 20 20 49 66 20 73 6f 2c 20 6d 61 6b 65  ll.  If so, make
a780: 20 69 74 20 65 61 73 79 0d 0a 20 20 20 20 20 20   it easy..      
a790: 20 20 23 20 20 20 20 20 20 20 74 6f 20 73 70 6f    #       to spo
a7a0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
a7b0: 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
a7c0: 6e 67 20 6c 65 6e 67 74 68 20 24 76 65 72 73 69  ng length $versi
a7d0: 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  on] == 0} then {
a7e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
a7f0: 76 65 72 73 69 6f 6e 20 6e 75 6c 6c 0d 0a 20 20  version null..  
a800: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a810: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
a820: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
a830: 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73 69   query the Fossi
a840: 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
a850: 69 65 72 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ier for the SQLi
a860: 74 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  te..        #   
a870: 20 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79      core library
a880: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
a890: 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
a8a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
a8b0: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
a8c0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
a8d0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
a8e0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
a8f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a900: 20 20 49 6e 74 65 72 6f 70 53 6f 75 72 63 65 49    InteropSourceI
a910: 64 7d 20 73 6f 75 72 63 65 49 64 5d 7d 20 74 68  d} sourceId]} th
a920: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
a930: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
a940: 4f 54 45 3a 20 57 65 20 66 61 69 6c 65 64 20 74  OTE: We failed t
a950: 6f 20 71 75 65 72 79 20 74 68 65 20 46 6f 73 73  o query the Foss
a960: 69 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69  il source identi
a970: 66 69 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  fier...         
a980: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
a990: 74 20 73 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f  t sourceId unkno
a9a0: 77 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  wn..        }...
a9b0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
a9c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
a9d0: 6b 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 65  k if the returne
a9e0: 64 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20  d Fossil source 
a9f0: 69 64 65 6e 74 69 66 69 65 72 20 77 61 73 20 6e  identifier was n
aa00: 75 6c 6c 2e 20 20 49 66 0d 0a 20 20 20 20 20 20  ull.  If..      
aa10: 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 6d 61    #       so, ma
aa20: 6b 65 20 69 74 20 65 61 73 79 20 74 6f 20 73 70  ke it easy to sp
aa30: 6f 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ot...        #..
aa40: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
aa50: 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
aa60: 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
aa70: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
aa80: 74 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d  t sourceId null.
aa90: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
aaa0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
aab0: 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
aac0: 65 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70  e SQLite interop
aad0: 20 61 73 73 65 6d 62 6c 79 20 61 70 70 65 61 72   assembly appear
aae0: 73 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  s to be availabl
aaf0: 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
ab00: 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
ab10: 61 69 6e 74 20 53 51 4c 69 74 65 49 6e 74 65 72  aint SQLiteInter
ab20: 6f 70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  op....        tp
ab30: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
ab40: 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28 22  pendArgs "yes ("
ab50: 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73   $version " " $s
ab60: 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a  ourceId ")\n"]..
ab70: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ab80: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
ab90: 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20  hannel no\n..   
aba0: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
abb0: 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
abc0: 72 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  rSQLiteDefineCon
abd0: 73 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20  stant { channel 
abe0: 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  name } {..      
abf0: 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
ac00: 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
ac10: 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
ac20: 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
ac30: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65  m.Data.SQLite de
ac40: 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22  fine constant \"
ac50: 22 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  " $name \..     
ac60: 20 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a       "\"... "]..
ac70: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
ac80: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
ac90: 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
aca0: 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
acb0: 6c 69 63 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  lic System.Data.
acc0: 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 5c  SQLite.SQLite3 \
acd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ace0: 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 7d  DefineConstants}
acf0: 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73   defineConstants
ad00: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
ad10: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65          if {[lse
ad20: 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63  arch -exact -noc
ad30: 61 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74  ase $defineConst
ad40: 61 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d  ants $name] != -
ad50: 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  1} then {..     
ad60: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
ad70: 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74    # NOTE: Yes, t
ad80: 68 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  his define const
ad90: 61 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ant was enabled 
ada0: 77 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64  when the managed
adb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
adc0: 20 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73      assembly was
add0: 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20   compiled...    
ade0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
adf0: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
ae00: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 64 65 66   [appendArgs def
ae10: 69 6e 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74  ineConstant.Syst
ae20: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 20  em.Data.SQLite. 
ae30: 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
ae40: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
ae50: 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20  el yes\n..      
ae60: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
ae70: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
ae80: 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20  nnel no\n..     
ae90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
aea0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  se {..        tp
aeb0: 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72  uts $channel err
aec0: 6f 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  or\n..      }.. 
aed0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
aee0: 63 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72  c getDateTimeFor
aef0: 6d 61 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  mat {} {..      
af00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
af10: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
af20: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74  simply returns t
af30: 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74  he "default" Dat
af40: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65  eTime format use
af50: 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
af60: 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
af70: 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
af80: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
af90: 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f  ists ::datetime_
afa0: 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20  format] && \..  
afb0: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
afc0: 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69  length $::dateti
afd0: 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  me_format] > 0} 
afe0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
aff0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b000: 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  E: Return the ma
b010: 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
b020: 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
b030: 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e  DateTime format.
b040: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b050: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
b060: 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a  atetime_format..
b070: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
b080: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
b090: 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
b0a0: 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74  n an ISO8601 Dat
b0b0: 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d  eTime format com
b0c0: 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c  patible with SQL
b0d0: 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ite,..        # 
b0e0: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
b0f0: 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75  a.SQLite, and su
b100: 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64  itable for round
b110: 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74  -tripping with t
b120: 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
b130: 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61      DateTime cla
b140: 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77  ss of the framew
b150: 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61  ork.  If this va
b160: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d  lue is changed,.
b170: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
b180: 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d   various tests m
b190: 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ay fail...      
b1a0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
b1b0: 75 72 6e 20 22 79 79 79 79 2d 4d 4d 2d 64 64 20  urn "yyyy-MM-dd 
b1c0: 48 48 3a 6d 6d 3a 73 73 2e 46 46 46 46 46 46 46  HH:mm:ss.FFFFFFF
b1d0: 4b 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  K"..      }..   
b1e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
b1f0: 65 6e 75 6d 65 72 61 62 6c 65 54 6f 4c 69 73 74  enumerableToList
b200: 20 7b 20 65 6e 75 6d 65 72 61 62 6c 65 20 7d 20   { enumerable } 
b210: 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 72 65 73  {..      set res
b220: 75 6c 74 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  ult [list]....  
b230: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
b240: 6c 65 6e 67 74 68 20 24 65 6e 75 6d 65 72 61 62  length $enumerab
b250: 6c 65 5d 20 3d 3d 20 30 20 7c 7c 20 24 65 6e 75  le] == 0 || $enu
b260: 6d 65 72 61 62 6c 65 20 65 71 20 22 6e 75 6c 6c  merable eq "null
b270: 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  "} then {..     
b280: 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c     return $resul
b290: 74 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  t..      }....  
b2a0: 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
b2b0: 63 68 20 2d 61 6c 69 61 73 20 69 74 65 6d 20 24  ch -alias item $
b2c0: 65 6e 75 6d 65 72 61 62 6c 65 20 7b 0d 0a 20 20  enumerable {..  
b2d0: 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
b2e0: 67 20 6c 65 6e 67 74 68 20 24 69 74 65 6d 5d 20  g length $item] 
b2f0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
b300: 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
b310: 65 73 75 6c 74 20 5b 24 69 74 65 6d 20 54 6f 53  esult [$item ToS
b320: 74 72 69 6e 67 5d 0d 0a 20 20 20 20 20 20 20 20  tring]..        
b330: 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
b340: 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
b350: 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  lt..    }.....  
b360: 20 20 70 72 6f 63 20 63 61 74 63 68 41 6e 64 52    proc catchAndR
b370: 65 74 75 72 6e 20 7b 20 73 63 72 69 70 74 20 7b  eturn { script {
b380: 73 74 61 63 6b 54 72 61 63 65 20 66 61 6c 73 65  stackTrace false
b390: 7d 20 7b 73 74 72 69 63 74 20 74 72 75 65 7d 20  } {strict true} 
b3a0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
b3b0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
b3c0: 75 61 74 65 20 74 68 65 20 73 63 72 69 70 74 20  uate the script 
b3d0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
b3e0: 63 61 6c 6c 65 72 20 69 6e 20 74 68 65 69 72 20  caller in their 
b3f0: 63 6f 6e 74 65 78 74 2c 0d 0a 20 20 20 20 20 20  context,..      
b400: 23 20 20 20 20 20 20 20 63 61 70 74 75 72 69 6e  #       capturin
b410: 67 20 62 6f 74 68 20 74 68 65 20 72 65 73 75 6c  g both the resul
b420: 74 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  t and the return
b430: 20 63 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d   code...      #.
b440: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20  .      set code 
b450: 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20  [catch {uplevel 
b460: 31 20 24 73 63 72 69 70 74 7d 20 72 65 73 75 6c  1 $script} resul
b470: 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  t]....      #.. 
b480: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 69 64       # NOTE: Did
b490: 20 74 68 65 20 73 63 72 69 70 74 20 70 72 6f 76   the script prov
b4a0: 69 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c  ided by our call
b4b0: 65 72 20 4e 4f 54 20 72 61 69 73 65 20 61 6e 20  er NOT raise an 
b4c0: 65 72 72 6f 72 3f 0d 0a 20 20 20 20 20 20 23 0d  error?..      #.
b4d0: 0a 20 20 20 20 20 20 69 66 20 7b 24 73 74 72 69  .      if {$stri
b4e0: 63 74 20 26 26 20 24 63 6f 64 65 20 3d 3d 20 30  ct && $code == 0
b4f0: 20 7c 7c 20 21 24 73 74 72 69 63 74 20 26 26 20   || !$strict && 
b500: 24 63 6f 64 65 20 21 3d 20 31 7d 20 74 68 65 6e  $code != 1} then
b510: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
b520: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
b530: 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e 20  uccess.  Return 
b540: 61 20 6c 69 73 74 20 77 69 74 68 20 74 68 65 20  a list with the 
b550: 72 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20  return code and 
b560: 74 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20  the result...   
b570: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b580: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f  return [list $co
b590: 64 65 20 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20  de $result]..   
b5a0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 73 74     } elseif {$st
b5b0: 61 63 6b 54 72 61 63 65 7d 20 74 68 65 6e 20 7b  ackTrace} then {
b5c0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b5d0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
b5e0: 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c 65  lure.  Our calle
b5f0: 72 20 77 61 6e 74 73 20 61 20 66 75 6c 6c 20 73  r wants a full s
b600: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 20 61  tack trace (if a
b610: 70 70 6c 69 63 61 62 6c 65 29 2c 0d 0a 20 20 20  pplicable),..   
b620: 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65 74       #       ret
b630: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
b640: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
b650: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 76  and the result v
b660: 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20  erbatim...      
b670: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
b680: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
b690: 24 72 65 73 75 6c 74 5d 0d 0a 20 20 20 20 20 20  $result]..      
b6a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
b6b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b6c0: 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20 4f  OTE: Failure.  O
b6d0: 75 72 20 63 61 6c 6c 65 72 20 64 6f 65 73 20 6e  ur caller does n
b6e0: 6f 74 20 77 61 6e 74 20 61 20 66 75 6c 6c 20 73  ot want a full s
b6f0: 74 61 63 6b 20 74 72 61 63 65 20 28 69 66 0d 0a  tack trace (if..
b700: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b710: 61 70 70 6c 69 63 61 62 6c 65 29 2c 20 72 65 74  applicable), ret
b720: 75 72 6e 20 61 20 6c 69 73 74 20 77 69 74 68 20  urn a list with 
b730: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2c  the return code,
b740: 20 74 68 65 20 65 72 72 6f 72 0d 0a 20 20 20 20   the error..    
b750: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 64 65      #       code
b760: 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72   for the interpr
b770: 65 74 65 72 2c 20 61 6e 64 20 74 68 65 20 65 72  eter, and the er
b780: 72 6f 72 20 6d 65 73 73 61 67 65 20 75 70 20 74  ror message up t
b790: 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  o the..        #
b7a0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 77 68 65         point whe
b7b0: 72 65 20 74 68 65 20 73 74 61 63 6b 20 74 72 61  re the stack tra
b7c0: 63 65 20 73 68 6f 75 6c 64 20 73 74 61 72 74 2e  ce should start.
b7d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b7e0: 20 20 20 20 20 73 65 74 20 69 6e 64 65 78 20 5b       set index [
b7f0: 73 74 72 69 6e 67 20 66 69 72 73 74 20 22 20 20  string first "  
b800: 20 61 74 20 22 20 24 72 65 73 75 6c 74 5d 3b 20   at " $result]; 
b810: 23 20 48 41 43 4b 3a 20 52 65 6c 69 61 62 6c 65  # HACK: Reliable
b820: 3f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  ?....        ret
b830: 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65 20  urn [list $code 
b840: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5b 65 78  $::errorCode [ex
b850: 70 72 20 7b 24 69 6e 64 65 78 20 21 3d 20 2d 31  pr {$index != -1
b860: 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   ? \..          
b870: 20 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b    [string trim [
b880: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 65  string range $re
b890: 73 75 6c 74 20 30 20 24 69 6e 64 65 78 5d 5d 20  sult 0 $index]] 
b8a0: 3a 20 24 72 65 73 75 6c 74 7d 5d 5d 0d 0a 20 20  : $result}]]..  
b8b0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
b8c0: 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c  .    proc compil
b8d0: 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20  eCSharpWith {.. 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20             text 
b8f0: 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73  memory symbols s
b900: 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72  trict resultsVar
b910: 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61  Name errorsVarNa
b920: 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20  me fileNames..  
b930: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d            args }
b940: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
b950: 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63 65     # NOTE: Since
b960: 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74 6f   we are going to
b970: 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f 64   use this method
b980: 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73 73   name a lot, ass
b990: 69 67 6e 20 69 74 20 74 6f 20 61 0d 0a 20 20 20  ign it to a..   
b9a0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
b9b0: 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20 20 20 20  ble first...    
b9c0: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 61    #..      set a
b9d0: 64 64 20 52 65 66 65 72 65 6e 63 65 64 41 73 73  dd ReferencedAss
b9e0: 65 6d 62 6c 69 65 73 2e 41 64 64 0d 0a 0d 0a 20  emblies.Add.... 
b9f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
ba00: 4e 4f 54 45 3a 20 43 72 65 61 74 65 20 74 68 65  NOTE: Create the
ba10: 20 62 61 73 65 20 63 6f 6d 6d 61 6e 64 20 74 6f   base command to
ba20: 20 65 76 61 6c 75 61 74 65 20 61 6e 64 20 61 64   evaluate and ad
ba30: 64 20 74 68 65 20 70 72 6f 70 65 72 74 79 20 73  d the property s
ba40: 65 74 74 69 6e 67 73 0d 0a 20 20 20 20 20 20 23  ettings..      #
ba50: 20 20 20 20 20 20 20 74 68 61 74 20 61 72 65 20         that are 
ba60: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 6e 65  almost always ne
ba70: 65 64 65 64 20 62 79 20 6f 75 72 20 75 6e 69 74  eded by our unit
ba80: 20 74 65 73 74 73 20 28 69 2e 65 2e 20 74 68 65   tests (i.e. the
ba90: 20 53 79 73 74 65 6d 0d 0a 20 20 20 20 20 20 23   System..      #
baa0: 20 20 20 20 20 20 20 61 6e 64 20 53 79 73 74 65         and Syste
bab0: 6d 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20  m.Data assembly 
bac0: 72 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20  references)...  
bad0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74      #..      set
bae0: 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73 74 20 5c   command [list \
baf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70  ..          comp
bb00: 69 6c 65 43 53 68 61 72 70 20 24 74 65 78 74 20  ileCSharp $text 
bb10: 24 6d 65 6d 6f 72 79 20 24 73 79 6d 62 6f 6c 73  $memory $symbols
bb20: 20 24 73 74 72 69 63 74 20 72 65 73 75 6c 74 73   $strict results
bb30: 20 65 72 72 6f 72 73 20 5c 0d 0a 20 20 20 20 20   errors \..     
bb40: 20 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d       $add System
bb50: 2e 64 6c 6c 20 24 61 64 64 20 53 79 73 74 65 6d  .dll $add System
bb60: 2e 44 61 74 61 2e 64 6c 6c 20 24 61 64 64 20 53  .Data.dll $add S
bb70: 79 73 74 65 6d 2e 54 72 61 6e 73 61 63 74 69 6f  ystem.Transactio
bb80: 6e 73 2e 64 6c 6c 20 5c 0d 0a 20 20 20 20 20 20  ns.dll \..      
bb90: 20 20 20 20 24 61 64 64 20 53 79 73 74 65 6d 2e      $add System.
bba0: 58 6d 6c 2e 64 6c 6c 5d 0d 0a 0d 0a 20 20 20 20  Xml.dll]....    
bbb0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
bbc0: 45 3a 20 41 64 64 20 61 6c 6c 20 74 68 65 20 70  E: Add all the p
bbd0: 72 6f 76 69 64 65 64 20 66 69 6c 65 20 6e 61 6d  rovided file nam
bbe0: 65 73 20 61 73 20 61 73 73 65 6d 62 6c 79 20 72  es as assembly r
bbf0: 65 66 65 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20  eferences...    
bc00: 20 20 23 0d 0a 20 20 20 20 20 20 66 6f 72 65 61    #..      forea
bc10: 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69 6c  ch fileName $fil
bc20: 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
bc30: 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61 6e    lappend comman
bc40: 64 20 24 61 64 64 20 5b 67 65 74 42 69 6e 61 72  d $add [getBinar
bc50: 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e  yFileName $fileN
bc60: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
bc70: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
bc80: 23 20 4e 4f 54 45 3a 20 41 64 64 20 74 68 65 20  # NOTE: Add the 
bc90: 65 78 74 72 61 20 61 72 67 75 6d 65 6e 74 73 2c  extra arguments,
bca0: 20 69 66 20 61 6e 79 2c 20 74 6f 20 74 68 65 20   if any, to the 
bcb0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 75  command to evalu
bcc0: 61 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ate...      #.. 
bcd0: 20 20 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e       eval lappen
bce0: 64 20 63 6f 6d 6d 61 6e 64 20 24 61 72 67 73 0d  d command $args.
bcf0: 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
bd00: 20 20 23 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20    # NOTE: Alias 
bd10: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63  the compiler loc
bd20: 61 6c 20 72 65 73 75 6c 74 73 20 61 6e 64 20 65  al results and e
bd30: 72 72 6f 72 73 20 76 61 72 69 61 62 6c 65 73 20  rrors variables 
bd40: 74 6f 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  to the..      # 
bd50: 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e        variable n
bd60: 61 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79  ames provided by
bd70: 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20   our caller...  
bd80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76      #..      upv
bd90: 61 72 20 31 20 24 72 65 73 75 6c 74 73 56 61 72  ar 1 $resultsVar
bda0: 4e 61 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20  Name results..  
bdb0: 20 20 20 20 75 70 76 61 72 20 31 20 24 65 72 72      upvar 1 $err
bdc0: 6f 72 73 56 61 72 4e 61 6d 65 20 65 72 72 6f 72  orsVarName error
bdd0: 73 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  s....      #..  
bde0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 76 61 6c      # NOTE: Eval
bdf0: 75 61 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  uate the constru
be00: 63 74 65 64 20 5b 63 6f 6d 70 69 6c 65 43 53 68  cted [compileCSh
be10: 61 72 70 5d 20 63 6f 6d 6d 61 6e 64 20 61 6e 64  arp] command and
be20: 20 72 65 74 75 72 6e 20 74 68 65 0d 0a 20 20 20   return the..   
be30: 20 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c     #       resul
be40: 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  t...      #..   
be50: 20 20 20 65 76 61 6c 20 24 63 6f 6d 6d 61 6e 64     eval $command
be60: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
be70: 70 72 6f 63 20 69 73 4d 65 6d 6f 72 79 44 62 20  proc isMemoryDb 
be80: 7b 20 66 69 6c 65 4e 61 6d 65 20 7d 20 7b 0d 0a  { fileName } {..
be90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
bea0: 20 4e 4f 54 45 3a 20 49 73 20 74 68 65 20 73 70   NOTE: Is the sp
beb0: 65 63 69 66 69 65 64 20 64 61 74 61 62 61 73 65  ecified database
bec0: 20 66 69 6c 65 20 6e 61 6d 65 20 72 65 61 6c 6c   file name reall
bed0: 79 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  y an in-memory d
bee0: 61 74 61 62 61 73 65 3f 0d 0a 20 20 20 20 20 20  atabase?..      
bef0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
bf00: 5b 65 78 70 72 20 7b 24 66 69 6c 65 4e 61 6d 65  [expr {$fileName
bf10: 20 65 71 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 7c   eq ":memory:" |
bf20: 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  | \..          [
bf30: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 69  string range $fi
bf40: 6c 65 4e 61 6d 65 20 30 20 31 32 5d 20 65 71 20  leName 0 12] eq 
bf50: 22 66 69 6c 65 3a 3a 6d 65 6d 6f 72 79 3a 22 7d  "file::memory:"}
bf60: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
bf70: 20 70 72 6f 63 20 69 73 54 61 62 6c 65 49 6e 44   proc isTableInD
bf80: 62 20 7b 20 6e 61 6d 65 20 7b 76 61 72 4e 61 6d  b { name {varNam
bf90: 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e db} } {..     
bfa0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bfb0: 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 73  : Refer to the s
bfc0: 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62 6c  pecified variabl
bfd0: 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e  e (e.g. "db") in
bfe0: 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   the context of 
bff0: 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  our..      #    
c000: 20 20 20 63 61 6c 6c 65 72 2e 20 20 49 74 20 63     caller.  It c
c010: 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
c020: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c030: 68 61 6e 64 6c 65 20 74 68 61 74 20 77 69 6c 6c  handle that will
c040: 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
c050: 20 20 20 75 73 65 64 20 74 6f 20 65 78 65 63 75     used to execu
c060: 74 65 20 74 68 65 20 71 75 65 72 79 20 75 73 65  te the query use
c070: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
c080: 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
c090: 65 20 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  e is..      #   
c0a0: 20 20 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74      present in t
c0b0: 68 61 74 20 64 61 74 61 62 61 73 65 2e 0d 0a 20  hat database... 
c0c0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
c0d0: 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64  var 1 $varName d
c0e0: 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  b....      #..  
c0f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 45 78 65 63      # NOTE: Exec
c100: 75 74 65 20 74 68 65 20 53 51 4c 20 71 75 65 72  ute the SQL quer
c110: 79 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 71  y against the sq
c120: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
c130: 65 20 74 6f 20 63 68 65 63 6b 20 69 66 0d 0a 20  e to check if.. 
c140: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
c150: 20 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20   named table is 
c160: 70 72 65 73 65 6e 74 20 61 6e 64 20 72 65 74 75  present and retu
c170: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69  rn non-zero if i
c180: 74 20 69 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  t is...      #..
c190: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
c1a0: 70 72 20 7b 5b 73 71 6c 20 65 78 65 63 75 74 65  pr {[sql execute
c1b0: 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c 61 72   -execute scalar
c1c0: 20 24 64 62 20 5c 0d 0a 20 20 20 20 20 20 20 20   $db \..        
c1d0: 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28    "SELECT COUNT(
c1e0: 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  *) FROM sqlite_m
c1f0: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
c200: 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
c210: 61 6d 65 20 3d 20 3f 3b 22 20 5c 0d 0a 20 20 20  ame = ?;" \..   
c220: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 70 61 72         [list par
c230: 61 6d 31 20 53 74 72 69 6e 67 20 24 6e 61 6d 65  am1 String $name
c240: 5d 5d 20 3e 20 30 7d 5d 0d 0a 20 20 20 20 7d 0d  ]] > 0}]..    }.
c250: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 69  ....    proc tri
c260: 6d 53 71 6c 20 7b 20 73 71 6c 20 7d 20 7b 0d 0a  mSql { sql } {..
c270: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65        return [re
c280: 67 73 75 62 20 2d 61 6c 6c 20 2d 2d 20 7b 5c 73  gsub -all -- {\s
c290: 2b 7d 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  +} [string trim 
c2a0: 24 73 71 6c 5d 20 22 20 22 5d 0d 0a 20 20 20 20  $sql] " "]..    
c2b0: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65  }.....    proc e
c2c0: 78 65 63 75 74 65 53 71 6c 20 7b 20 73 71 6c 20  xecuteSql { sql 
c2d0: 7b 65 78 65 63 75 74 65 20 6e 6f 6e 65 7d 20 7b  {execute none} {
c2e0: 66 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7d 20 7b  fileName ""} } {
c2f0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
c300: 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
c310: 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
c320: 20 7b 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 3a   {set fileName :
c330: 6d 65 6d 6f 72 79 3a 7d 0d 0a 20 20 20 20 20 20  memory:}..      
c340: 73 65 74 75 70 44 62 20 24 66 69 6c 65 4e 61 6d  setupDb $fileNam
c350: 65 20 22 22 20 22 22 20 22 22 20 22 22 20 22 22  e "" "" "" "" ""
c360: 20 66 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c   false false fal
c370: 73 65 20 66 61 6c 73 65 20 6d 65 6d 44 62 0d 0a  se false memDb..
c380: 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20  ..      try {.. 
c390: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73         return [s
c3a0: 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
c3b0: 75 74 65 20 24 65 78 65 63 75 74 65 20 24 6d 65  ute $execute $me
c3c0: 6d 44 62 20 24 73 71 6c 5d 0d 0a 20 20 20 20 20  mDb $sql]..     
c3d0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d 0a 20 20   } finally {..  
c3e0: 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44 62 20        cleanupDb 
c3f0: 24 66 69 6c 65 4e 61 6d 65 20 6d 65 6d 44 62 20  $fileName memDb 
c400: 66 61 6c 73 65 20 66 61 6c 73 65 0d 0a 20 20 20  false false..   
c410: 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
c420: 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
c430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c440: 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22  fileName {mode "
c450: 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  "} {dateTimeForm
c460: 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  at ""} {dateTime
c470: 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20  Kind ""} {flags 
c480: 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""}..           
c490: 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61   {extra ""} {qua
c4a0: 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65  lify true} {dele
c4b0: 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61  te true} {uri fa
c4c0: 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  lse}..          
c4d0: 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75    {temporary tru
c4e0: 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  e} {varName db} 
c4f0: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
c500: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73      # NOTE: Firs
c510: 74 2c 20 73 65 65 20 69 66 20 6f 75 72 20 63 61  t, see if our ca
c520: 6c 6c 65 72 20 68 61 73 20 72 65 71 75 65 73 74  ller has request
c530: 65 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ed an in-memory 
c540: 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20  database...     
c550: 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73   #..      set is
c560: 4d 65 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79  Memory [isMemory
c570: 44 62 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  Db $fileName]...
c580: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
c590: 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c  # NOTE: For now,
c5a0: 20 61 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61   all test databa
c5b0: 73 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ses used by the 
c5c0: 74 65 73 74 20 73 75 69 74 65 20 61 72 65 20 70  test suite are p
c5d0: 6c 61 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20  laced..      #  
c5e0: 20 20 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61       into the da
c5f0: 74 61 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  tabase directory
c600: 2e 20 20 45 61 63 68 20 64 61 74 61 62 61 73 65  .  Each database
c610: 20 61 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c   and related fil
c620: 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
c630: 20 20 75 73 65 64 20 62 79 20 61 20 74 65 73 74    used by a test
c640: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e   should be clean
c650: 65 64 20 75 70 20 62 79 20 74 68 61 74 20 74 65  ed up by that te
c660: 73 74 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20  st using the..  
c670: 20 20 20 20 23 20 20 20 20 20 20 20 22 63 6c 65      #       "cle
c680: 61 6e 75 70 44 62 22 20 70 72 6f 63 65 64 75 72  anupDb" procedur
c690: 65 2c 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20  e, below...     
c6a0: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
c6b0: 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61  isMemory && $qua
c6c0: 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  lify} then {..  
c6d0: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
c6e0: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
c6f0: 65 74 44 61 74 61 62 61 73 65 44 69 72 65 63 74  etDatabaseDirect
c700: 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  ory] [file tail 
c710: 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20  $fileName]]..   
c720: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
c730: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
c740: 79 20 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74  y default, delet
c750: 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69  e any pre-existi
c760: 6e 67 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ng database with
c770: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a   the same file..
c780: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
c790: 6d 65 20 69 66 20 69 74 20 63 75 72 72 65 6e 74  me if it current
c7a0: 6c 79 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20  ly exists...    
c7b0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
c7c0: 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65  $isMemory && $de
c7d0: 6c 65 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78  lete && [file ex
c7e0: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
c7f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
c800: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
c810: 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
c820: 65 6c 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78  elete any pre-ex
c830: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
c840: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 66 69  with the same fi
c850: 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  le..        #   
c860: 20 20 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20      name...     
c870: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
c880: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
c890: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
c8a0: 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d   error]} then {.
c8b0: 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
c8c0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
c8d0: 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
c8e0: 64 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  d to delete the 
c8f0: 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79  file, report why
c900: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
c910: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
c920: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
c930: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
c950: 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
c960: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61 74  ed to delete dat
c970: 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20 24  abase file \"" $
c980: 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  fileName \..    
c990: 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64 75            "\" du
c9a0: 72 69 6e 67 20 73 65 74 75 70 2c 20 65 72 72 6f  ring setup, erro
c9b0: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
c9c0: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d   \n]..        }.
c9d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
c9e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
c9f0: 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
ca00: 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
ca10: 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
ca20: 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
ca30: 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
ca40: 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65      caller.  The
ca50: 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f   handle to the o
ca60: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77  pened database w
ca70: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68  ill be stored th
ca80: 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
ca90: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
caa0: 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
cab0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
cac0: 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e  E: Start buildin
cad0: 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
cae0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e   string.  The on
caf0: 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74  ly required port
cb00: 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
cb10: 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
cb20: 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74  tion string is t
cb30: 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
cb40: 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74  which contains t
cb50: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
cb60: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
cb70: 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66  name itself.  If
cb80: 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
cb90: 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61  s to use a URI a
cba0: 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
cbb0: 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
cbc0: 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72  , use the FullUr
cbd0: 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  i connection str
cbe0: 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d  ing property to.
cbf0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
cc00: 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20  revent the data 
cc10: 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72  source string fr
cc20: 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64  om being mangled
cc30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
cc40: 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e    if {$uri} then
cc50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
cc60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c  connection {Full
cc70: 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  Uri=${fileName}}
cc80: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
cc90: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
cca0: 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53  nnection {Data S
ccb0: 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65  ource=${fileName
ccc0: 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
ccd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
cce0: 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73  NOTE: Since this
ccf0: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e   procedure has n
cd00: 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65  o special knowle
cd10: 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20  dge of what the 
cd20: 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23  default..      #
cd30: 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69         setting i
cd40: 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c  s for the ToFull
cd50: 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Path connection 
cd60: 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20  string propery, 
cd70: 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20  always..      # 
cd80: 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61        add the va
cd90: 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75  lue we know abou
cda0: 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  t to the connect
cdb0: 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  ion string...   
cdc0: 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65     #..      appe
cdd0: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
cde0: 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61  ToFullPath=${qua
cdf0: 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20  lify}}....      
ce00: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ce10: 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
ce20: 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e  pecified a journ
ce30: 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65  al mode, add the
ce40: 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
ce50: 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
ce60: 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
ce70: 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
ce80: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
ce90: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
cea0: 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74  th $mode] > 0} t
ceb0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
cec0: 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
ced0: 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d   {;Journal Mode=
cee0: 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20  ${mode}}..      
cef0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
cf00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
cf10: 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
cf20: 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66  ied a DateTime f
cf30: 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e  ormat, add the n
cf40: 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
cf50: 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
cf60: 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
cf70: 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
cf80: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
cf90: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
cfa0: 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   $dateTimeFormat
cfb0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
cfc0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
cfd0: 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
cfe0: 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65  imeFormat=${date
cff0: 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20  TimeFormat}}..  
d000: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
d010: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d020: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
d030: 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69  ecified a DateTi
d040: 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20  meKind, add the 
d050: 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
d060: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
d070: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
d080: 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
d090: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
d0a0: 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
d0b0: 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d  h $dateTimeKind]
d0c0: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
d0d0: 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
d0e0: 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
d0f0: 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d  meKind=${dateTim
d100: 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d  eKind}}..      }
d110: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
d120: 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68     # NOTE: If th
d130: 65 72 65 20 61 72 65 20 61 6e 79 20 67 6c 6f 62  ere are any glob
d140: 61 6c 20 28 70 65 72 20 74 65 73 74 20 72 75 6e  al (per test run
d150: 29 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61  ) connection fla
d160: 67 73 20 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20  gs currently..  
d170: 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74 2c      #       set,
d180: 20 75 73 65 20 74 68 65 6d 20 6e 6f 77 20 28 69   use them now (i
d190: 2e 65 2e 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67  .e. by combining
d1a0: 20 74 68 65 6d 20 77 69 74 68 20 74 68 65 20 6f   them with the o
d1b0: 6e 65 73 20 66 6f 72 20 74 68 69 73 0d 0a 20 20  nes for this..  
d1c0: 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e      #       conn
d1d0: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
d1e0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
d1f0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e  fo exists ::conn
d200: 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 20 26 26  ection_flags] &&
d210: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
d220: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
d230: 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73  connection_flags
d240: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
d250: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
d260: 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28    # NOTE: Show (
d270: 61 6e 64 20 6c 6f 67 29 20 74 68 61 74 20 77 65  and log) that we
d280: 20 64 65 74 65 63 74 65 64 20 73 6f 6d 65 20 67   detected some g
d290: 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  lobal connection
d2a0: 20 66 6c 61 67 73 2e 0d 0a 20 20 20 20 20 20 20   flags...       
d2b0: 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
d2c0: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
d2d0: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
d2f0: 2d 2d 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63  -- global connec
d300: 74 69 6f 6e 20 66 6c 61 67 73 20 64 65 74 65 63  tion flags detec
d310: 74 65 64 3a 20 22 20 24 3a 3a 63 6f 6e 6e 65 63  ted: " $::connec
d320: 74 69 6f 6e 5f 66 6c 61 67 73 20 5c 6e 5d 0d 0a  tion_flags \n]..
d330: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
d340: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6d       # NOTE: Com
d350: 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65 70 6c  bine and/or repl
d360: 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ace the connecti
d370: 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74 68 65  on flags and the
d380: 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20 20 20  n show the..    
d390: 20 20 20 20 23 20 20 20 20 20 20 20 6e 65 77 20      #       new 
d3a0: 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20 20 20  value...        
d3b0: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
d3c0: 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46 6c 61  lags [combineFla
d3d0: 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63 6f 6e  gs $flags $::con
d3e0: 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d 0d 0a  nection_flags]..
d3f0: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
d400: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
d410: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
d420: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
d430: 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65 63   combined connec
d440: 74 69 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20  tion flags are: 
d450: 22 20 24 66 6c 61 67 73 20 5c 6e 5d 0d 0a 20 20  " $flags \n]..  
d460: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
d470: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d480: 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
d490: 65 63 69 66 69 65 64 20 73 6f 6d 65 20 53 51 4c  ecified some SQL
d4a0: 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  iteConnectionFla
d4b0: 67 73 2c 20 61 64 64 20 74 68 65 0d 0a 20 20 20  gs, add the..   
d4c0: 20 20 20 23 20 20 20 20 20 20 20 6e 65 63 65 73     #       neces
d4d0: 73 61 72 79 20 70 6f 72 74 69 6f 6e 20 6f 66 20  sary portion of 
d4e0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  the connection s
d4f0: 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20 20 20 20  tring now...    
d500: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
d510: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 66  string length $f
d520: 6c 61 67 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20  lags] > 0} then 
d530: 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  {..        appen
d540: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46  d connection {;F
d550: 6c 61 67 73 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a  lags=${flags}}..
d560: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d570: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d580: 3a 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20  : If our caller 
d590: 73 70 65 63 69 66 69 65 64 20 61 6e 20 65 78 74  specified an ext
d5a0: 72 61 20 70 61 79 6c 6f 61 64 20 74 6f 20 74 68  ra payload to th
d5b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
d5c0: 20 20 20 20 23 20 20 20 20 20 20 20 73 74 72 69      #       stri
d5d0: 6e 67 2c 20 61 70 70 65 6e 64 20 69 74 20 6e 6f  ng, append it no
d5e0: 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  w...      #..   
d5f0: 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
d600: 65 6e 67 74 68 20 24 65 78 74 72 61 5d 20 3e 20  ength $extra] > 
d610: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
d620: 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
d630: 74 69 6f 6e 20 5c 3b 20 24 65 78 74 72 61 0d 0a  tion \; $extra..
d640: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d650: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
d660: 3a 20 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62  : Open the datab
d670: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  ase connection n
d680: 6f 77 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20  ow, placing the 
d690: 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61  opaque handle va
d6a0: 6c 75 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  lue..      #    
d6b0: 20 20 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69     into the vari
d6c0: 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20 62  able specified b
d6d0: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20  y our caller... 
d6e0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65       #..      se
d6f0: 74 20 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d  t db [sql open -
d700: 74 79 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62  type SQLite [sub
d710: 73 74 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d  st $connection]]
d720: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
d730: 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69     # NOTE: Confi
d740: 67 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  gure the tempora
d750: 72 79 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72  ry directory for
d760: 20 74 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65   the newly opene
d770: 64 20 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20  d database..    
d780: 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
d790: 74 69 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20  tion now unless 
d7a0: 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69  our caller forbi
d7b0: 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d  ds it...      #.
d7c0: 0a 20 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70  .      if {$temp
d7d0: 6f 72 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20  orary && ![info 
d7e0: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54  exists ::no(setT
d7f0: 65 6d 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72  emporaryDirector
d800: 79 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  y)]} then {..   
d810: 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74 65       sql execute
d820: 20 24 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73   $db [appendArgs
d830: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
d840: 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f  "PRAGMA temp_sto
d850: 72 65 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c  re_directory = \
d860: 22 22 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  "" [getTemporary
d870: 44 69 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d  Directory] \"\;]
d880: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
d890: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
d8a0: 54 45 3a 20 41 6c 77 61 79 73 20 72 65 74 75 72  TE: Always retur
d8b0: 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
d8c0: 20 68 61 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63   handle upon suc
d8d0: 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  cess...      #..
d8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 62        return $db
d8f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d900: 70 72 6f 63 20 67 65 74 44 62 43 6f 6e 6e 65 63  proc getDbConnec
d910: 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20  tion { {varName 
d920: 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  db} } {..      #
d930: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
d940: 52 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65  Refer to the spe
d950: 63 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20  cified variable 
d960: 28 65 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74  (e.g. "db") in t
d970: 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75  he context of ou
d980: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
d990: 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61   caller.  The ha
d9a0: 6e 64 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ndle to the data
d9b0: 62 61 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20  base previously 
d9c0: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a  opened via the..
d9d0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
d9e0: 65 74 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72  etupDb] procedur
d9f0: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
da00: 65 64 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20  ed there...     
da10: 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   #..      upvar 
da20: 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d  1 $varName db...
da30: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
da40: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 72 65 74  # NOTE: This ret
da50: 75 72 6e 73 20 74 68 65 20 41 44 4f 2e 4e 45 54  urns the ADO.NET
da60: 20 49 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f   IDbConnection o
da70: 62 6a 65 63 74 20 69 6e 73 74 61 6e 63 65 20 66  bject instance f
da80: 6f 72 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  or the..      # 
da90: 20 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20        specified 
daa0: 64 61 74 61 62 73 65 20 68 61 6e 64 6c 65 2e 20  databse handle. 
dab0: 20 53 69 6e 63 65 20 67 65 74 74 69 6e 67 20 74   Since getting t
dac0: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 6c 69 65  his object relie
dad0: 73 20 75 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20  s upon..      # 
dae0: 20 20 20 20 20 20 45 61 67 6c 65 20 69 6e 74 65        Eagle inte
daf0: 72 6e 61 6c 73 2c 20 67 72 65 61 74 20 63 61 72  rnals, great car
db00: 65 20 73 68 6f 75 6c 64 20 62 65 20 74 61 6b 65  e should be take
db10: 6e 20 74 6f 20 61 76 6f 69 64 20 64 69 73 70 6f  n to avoid dispo
db20: 73 69 6e 67 20 6f 66 0d 0a 20 20 20 20 20 20 23  sing of..      #
db30: 20 20 20 20 20 20 20 74 68 69 73 20 6f 62 6a 65         this obje
db40: 63 74 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ct or otherwise 
db50: 70 75 74 74 69 6e 67 20 69 74 20 69 6e 74 6f 20  putting it into 
db60: 61 6e 20 69 6e 76 61 6c 69 64 20 73 74 61 74 65  an invalid state
db70: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
db80: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
db90: 74 73 20 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ts db]} then {..
dba0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
dbb0: 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
dbc0: 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
dbd0: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
dbe0: 75 62 6c 69 63 20 2d 6f 62 6a 65 63 74 66 6c 61  ublic -objectfla
dbf0: 67 73 20 2b 4e 6f 44 69 73 70 6f 73 65 20 5c 0d  gs +NoDispose \.
dc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dc10: 20 2d 61 6c 69 61 73 20 49 6e 74 65 72 70 72 65   -alias Interpre
dc20: 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f  ter.GetActive.co
dc30: 6e 6e 65 63 74 69 6f 6e 73 20 49 74 65 6d 20 24  nnections Item $
dc40: 64 62 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  db} \..         
dc50: 20 20 20 20 20 20 20 72 65 73 75 6c 74 5d 20 3d         result] =
dc60: 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
dc70: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
dc80: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 75 63 63      # NOTE: Succ
dc90: 65 73 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ess, return the 
dca0: 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
dcb0: 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  ndle...         
dcc0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   #..          re
dcd0: 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20  turn $result..  
dce0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
dcf0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
dd00: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46         # NOTE: F
dd10: 61 69 6c 75 72 65 2c 20 72 65 70 6f 72 74 20 77  ailure, report w
dd20: 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  hy...          #
dd30: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
dd40: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
dd50: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
dd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
dd70: 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
dd80: 69 6c 65 64 20 74 6f 20 67 65 74 20 63 6f 6e 6e  iled to get conn
dd90: 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f  ection handle fo
dda0: 72 20 64 61 74 61 62 61 73 65 20 5c 22 22 20 5c  r database \"" \
ddb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ddc0: 24 64 62 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20  $db "\", error: 
ddd0: 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c  " \n\t $result \
dde0: 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n]..        }.. 
ddf0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
de00: 0d 0a 20 20 20 20 70 72 6f 63 20 66 72 65 65 44  ..    proc freeD
de10: 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 7b 76  bConnection { {v
de20: 61 72 4e 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  arName connectio
de30: 6e 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  n} } {..      #.
de40: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52  .      # NOTE: R
de50: 65 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  efer to the spec
de60: 69 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28  ified variable (
de70: 65 2e 67 2e 20 22 63 6f 6e 6e 65 63 74 69 6f 6e  e.g. "connection
de80: 22 29 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ") in the..     
de90: 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
dea0: 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 20   of our caller. 
deb0: 20 54 68 65 20 6f 70 61 71 75 65 20 6f 62 6a 65   The opaque obje
dec0: 63 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 6e  ct handle for an
ded0: 20 41 44 4f 2e 4e 45 54 0d 0a 20 20 20 20 20 20   ADO.NET..      
dee0: 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
def0: 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  on previously re
df00: 74 75 72 6e 65 64 20 62 79 20 5b 67 65 74 44 62  turned by [getDb
df10: 43 6f 6e 6e 65 63 74 69 6f 6e 5d 20 73 68 6f 75  Connection] shou
df20: 6c 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20  ld be..      #  
df30: 20 20 20 20 20 73 74 6f 72 65 64 20 74 68 65 72       stored ther
df40: 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  e...      #..   
df50: 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
df60: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
df70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
df80: 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
df90: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 6f   to remove the o
dfa0: 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e  paque object han
dfb0: 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  dle from the int
dfc0: 65 72 70 72 65 74 65 72 0d 0a 20 20 20 20 20 20  erpreter..      
dfd0: 23 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 54 68  #       now.  Th
dfe0: 69 73 20 5b 6f 62 6a 65 63 74 20 64 69 73 70 6f  is [object dispo
dff0: 73 65 5d 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  se] call will no
e000: 74 20 61 63 74 75 61 6c 6c 79 20 64 69 73 70 6f  t actually dispo
e010: 73 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  se of the..     
e020: 20 23 20 20 20 20 20 20 20 75 6e 64 65 72 6c 79   #       underly
e030: 69 6e 67 20 6f 62 6a 65 63 74 20 62 65 63 61 75  ing object becau
e040: 73 65 20 74 68 65 20 2b 4e 6f 44 69 73 70 6f 73  se the +NoDispos
e050: 65 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  e flag was set o
e060: 6e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  n it..      #   
e070: 20 20 20 20 64 75 72 69 6e 67 20 63 72 65 61 74      during creat
e080: 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 61 71 75  ion of the opaqu
e090: 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 2e  e object handle.
e0a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e0b0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
e0c0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 5d 20 26 26  s connection] &&
e0d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 63   \..          [c
e0e0: 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 64 69 73  atch {object dis
e0f0: 70 6f 73 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e  pose $connection
e100: 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b  } error]} then {
e110: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e120: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
e130: 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
e140: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 68 61 6e  o remove the han
e150: 64 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e  dle, report why.
e160: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
e170: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
e180: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
e190: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
e1a0: 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
e1b0: 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
e1c0: 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
e1d0: 20 68 61 6e 64 6c 65 20 5c 22 22 20 24 63 6f 6e   handle \"" $con
e1e0: 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  nection \..     
e1f0: 20 20 20 20 20 20 20 22 5c 22 2c 20 65 72 72 6f         "\", erro
e200: 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
e210: 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
e220: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e230: 63 20 61 64 64 44 62 43 6f 6e 6e 65 63 74 69 6f  c addDbConnectio
e240: 6e 20 7b 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b  n { connection {
e250: 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20 7b 0d  varName db} } {.
e260: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
e270: 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f  # NOTE: Refer to
e280: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76   the specified v
e290: 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64  ariable (e.g. "d
e2a0: 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  b") in the conte
e2b0: 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20  xt of our..     
e2c0: 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e   #       caller.
e2d0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
e2e0: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
e2f0: 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
e300: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
e310: 72 65 61 74 65 20 61 20 63 6f 72 72 65 63 74 6c  reate a correctl
e320: 79 20 66 6f 72 6d 61 74 74 65 64 20 6e 61 6d 65  y formatted name
e330: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
e340: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 0d  e connection to.
e350: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62  .      #       b
e360: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
e370: 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74  ist managed by t
e380: 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
e390: 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
e3a0: 20 20 20 20 20 20 73 65 74 20 64 62 20 5b 6f 62        set db [ob
e3b0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
e3c0: 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
e3d0: 0a 20 20 20 20 20 20 20 20 20 20 45 61 67 6c 65  .          Eagle
e3e0: 2e 5f 43 6f 6d 70 6f 6e 65 6e 74 73 2e 50 72 69  ._Components.Pri
e3f0: 76 61 74 65 2e 46 6f 72 6d 61 74 4f 70 73 20 44  vate.FormatOps D
e400: 61 74 61 62 61 73 65 4f 62 6a 65 63 74 4e 61 6d  atabaseObjectNam
e410: 65 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c 0d  e $connection \.
e420: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74  .          SQLit
e430: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 6f 62 6a  eConnection [obj
e440: 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74 65 72  ect invoke Inter
e450: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
e460: 20 4e 65 78 74 49 64 5d 5d 0d 0a 0d 0a 20 20 20   NextId]]....   
e470: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
e480: 54 45 3a 20 41 64 64 20 74 68 65 20 64 61 74 61  TE: Add the data
e490: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e4a0: 70 72 6f 76 69 64 65 64 20 62 79 20 6f 75 72 20  provided by our 
e4b0: 63 61 6c 6c 65 72 20 74 6f 20 74 68 65 20 6c 69  caller to the li
e4c0: 73 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  st..      #     
e4d0: 20 20 6f 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e    of those known
e4e0: 20 74 6f 20 74 68 65 20 45 61 67 6c 65 20 69 6e   to the Eagle in
e4f0: 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
e500: 20 20 23 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63    #..      objec
e510: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
e520: 2b 4e 6f 6e 50 75 62 6c 69 63 20 49 6e 74 65 72  +NonPublic Inter
e530: 70 72 65 74 65 72 2e 47 65 74 41 63 74 69 76 65  preter.GetActive
e540: 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 41 64 64  .connections Add
e550: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 64   \..          $d
e560: 62 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  b $connection.. 
e570: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
e580: 63 20 63 6c 65 61 6e 75 70 44 62 20 7b 20 66 69  c cleanupDb { fi
e590: 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65 20  leName {varName 
e5a0: 64 62 7d 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75  db} {collect tru
e5b0: 65 7d 20 7b 71 75 61 6c 69 66 79 20 74 72 75 65  e} {qualify true
e5c0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
e5d0: 20 20 20 20 20 20 20 20 7b 64 65 6c 65 74 65 20          {delete 
e5e0: 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  true} } {..     
e5f0: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
e600: 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
e610: 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
e620: 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
e630: 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
e640: 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
e650: 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
e660: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
e670: 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
e680: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
e690: 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
e6a0: 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
e6b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
e6c0: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
e6d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
e6e0: 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
e6f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
e700: 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
e710: 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
e720: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
e730: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
e740: 66 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69  fer to the speci
e750: 66 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65  fied variable (e
e760: 2e 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65  .g. "db") in the
e770: 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d   context of our.
e780: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63  .      #       c
e790: 61 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64  aller.  The hand
e7a0: 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  le to the databa
e7b0: 73 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  se previously op
e7c0: 65 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20  ened via the..  
e7d0: 20 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74      #       [set
e7e0: 75 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20  upDb] procedure 
e7f0: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
e800: 20 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23   there...      #
e810: 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20  ..      upvar 1 
e820: 24 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20  $varName db.... 
e830: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
e840: 4e 4f 54 45 3a 20 43 6c 6f 73 65 20 74 68 65 20  NOTE: Close the 
e850: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
e860: 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 2e 20  e database now. 
e870: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   This should all
e880: 6f 77 20 75 73 0d 0a 20 20 20 20 20 20 23 20 20  ow us..      #  
e890: 20 20 20 20 20 74 6f 20 64 65 6c 65 74 65 20 74       to delete t
e8a0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
e8b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0d 0a 20 20  tabase file...  
e8c0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
e8d0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 62  {[info exists db
e8e0: 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 73 71 6c  ] && [catch {sql
e8f0: 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f   close $db} erro
e900: 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
e910: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
e920: 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f   NOTE: We someho
e930: 77 20 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73  w failed to clos
e940: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  e the database, 
e950: 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
e960: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
e970: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
e980: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e990: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
e9a0: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
e9b0: 66 61 69 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20  failed to close 
e9c0: 64 61 74 61 62 61 73 65 20 5c 22 22 20 24 64 62  database \"" $db
e9d0: 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c   "\", error: " \
e9e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e  ..            \n
e9f0: 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20  \t $error \n].. 
ea00: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ea10: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
ea20: 20 46 69 72 73 74 2c 20 73 65 65 20 69 66 20 6f   First, see if o
ea30: 75 72 20 63 61 6c 6c 65 72 20 68 61 73 20 72 65  ur caller has re
ea40: 71 75 65 73 74 65 64 20 61 6e 20 69 6e 2d 6d 65  quested an in-me
ea50: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0d 0a  mory database...
ea60: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 73        #..      s
ea70: 65 74 20 69 73 4d 65 6d 6f 72 79 20 5b 69 73 4d  et isMemory [isM
ea80: 65 6d 6f 72 79 44 62 20 24 66 69 6c 65 4e 61 6d  emoryDb $fileNam
ea90: 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20  e]....      #.. 
eaa0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
eab0: 6c 64 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  ld the full path
eac0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
ead0: 20 66 69 6c 65 20 6e 61 6d 65 2e 20 20 46 6f 72   file name.  For
eae0: 20 6e 6f 77 2c 20 61 6c 6c 20 74 65 73 74 0d 0a   now, all test..
eaf0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61        #       da
eb00: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
eb10: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 74   stored in the t
eb20: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
eb30: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
eb40: 20 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f      if {!$isMemo
eb50: 72 79 20 26 26 20 24 71 75 61 6c 69 66 79 7d 20  ry && $qualify} 
eb60: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
eb70: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
eb80: 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 44 61 74 61  le join [getData
eb90: 62 61 73 65 44 69 72 65 63 74 6f 72 79 5d 20 5b  baseDirectory] [
eba0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
ebb0: 61 6d 65 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ame]]..      }..
ebc0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
ebd0: 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
ebe0: 66 20 74 68 65 20 66 69 6c 65 20 73 74 69 6c 6c  f the file still
ebf0: 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
ec00: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
ec10: 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65  sMemory && $dele
ec20: 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  te && [file exis
ec30: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
ec40: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
ec50: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
ec60: 3a 20 53 6b 69 70 20 64 65 6c 65 74 69 6e 67 20  : Skip deleting 
ec70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
ec80: 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20  f somebody sets 
ec90: 74 68 65 20 67 6c 6f 62 61 6c 0d 0a 20 20 20 20  the global..    
eca0: 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69      #       vari
ecb0: 61 62 6c 65 20 74 6f 20 70 72 65 76 65 6e 74 20  able to prevent 
ecc0: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
ecd0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
ece0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
ecf0: 6c 65 61 6e 75 70 44 62 46 69 6c 65 29 5d 7d 20  leanupDbFile)]} 
ed00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ed10: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
ed20: 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
ed30: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
ed40: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  t database file 
ed50: 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  now...          
ed60: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
ed70: 7b 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  {[set code [catc
ed80: 68 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24  h {file delete $
ed90: 66 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d  fileName} error]
eda0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
edb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
edc0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
edd0: 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
ede0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
edf0: 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
ee00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
ee20: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
ee30: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
ee40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee50: 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
ee60: 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
ee70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c   database file \
ee80: 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a  "" $fileName \..
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 22 5c 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e  "\" during clean
eeb0: 75 70 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  up, error: " \n\
eec0: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
eed0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
eee0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
eef0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ef00: 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
ef10: 20 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64   that we skipped
ef20: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69   deleting the fi
ef30: 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  le...          #
ef40: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
ef50: 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20 20 20 20  code 0....      
ef60: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
ef70: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
ef80: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
ef90: 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
efa0: 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64 20 64 65  NING: skipped de
efb0: 6c 65 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  leting database 
efc0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
efd0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
efe0: 20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63      "\" during c
eff0: 6c 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20  leanup\n"]..    
f000: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
f010: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
f020: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
f030: 3a 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20  : The file does 
f040: 6e 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65  not exist, succe
f050: 73 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ss!..        #..
f060: 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65          set code
f070: 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   0..      }.... 
f080: 20 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64       return $cod
f090: 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  e..    }.....   
f0a0: 20 70 72 6f 63 20 73 65 74 75 70 44 62 49 6e 74   proc setupDbInt
f0b0: 65 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 20 7b  erruptCallback {
f0c0: 20 63 68 61 6e 6e 65 6c 20 6c 6f 67 20 7d 20 7b   channel log } {
f0d0: 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
f0e0: 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 73 65 74  hannel "---- set
f0f0: 74 69 6e 67 20 75 70 20 64 65 62 75 67 67 65 72  ting up debugger
f100: 20 69 6e 74 65 72 72 75 70 74 20 63 61 6c 6c 62   interrupt callb
f110: 61 63 6b 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ack... "....    
f120: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
f130: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f140: 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20     # NOTE: Make 
f150: 73 75 72 65 20 74 68 65 20 73 63 72 69 70 74 20  sure the script 
f160: 64 65 62 75 67 67 65 72 20 61 6e 64 20 74 68 65  debugger and the
f170: 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
f180: 72 65 74 65 72 20 61 72 65 0d 0a 20 20 20 20 20  reter are..     
f190: 20 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70     #       setup
f1a0: 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
f1b0: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  se...        #..
f1c0: 20 20 20 20 20 20 20 20 64 65 62 75 67 20 73 65          debug se
f1d0: 74 75 70 20 74 72 75 65 20 74 72 75 65 0d 0a 0d  tup true true...
f1e0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
f1f0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64      # NOTE: Load
f200: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 70   the necessary p
f210: 61 63 6b 61 67 65 73 20 69 6e 74 6f 20 74 68 65  ackages into the
f220: 20 69 73 6f 6c 61 74 65 64 20 69 6e 74 65 72 70   isolated interp
f230: 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 20 20  reter...        
f240: 23 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  #..        debug
f250: 20 65 76 61 6c 20 7b 0d 0a 20 20 20 20 20 20 20   eval {..       
f260: 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
f270: 72 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20 20  re Eagle..      
f280: 20 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75      package requ
f290: 69 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72  ire Eagle.Librar
f2a0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 70 61 63  y..          pac
f2b0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61 67  kage require Eag
f2c0: 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20 20  le.Test..       
f2d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
f2e0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f2f0: 20 43 6f 70 79 20 74 68 65 20 6e 65 63 65 73 73   Copy the necess
f300: 61 72 79 20 76 61 72 69 61 62 6c 65 73 20 69 6e  ary variables in
f310: 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20  to the isolated 
f320: 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
f330: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f340: 20 64 65 62 75 67 20 69 6e 76 6f 6b 65 20 30 20   debug invoke 0 
f350: 73 65 74 20 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  set ::test_chann
f360: 65 6c 20 24 63 68 61 6e 6e 65 6c 3b 20 23 20 4e  el $channel; # N
f370: 4f 54 45 3a 20 46 6f 72 20 5b 74 70 75 74 73 5d  OTE: For [tputs]
f380: 2e 0d 0a 20 20 20 20 20 20 20 20 64 65 62 75 67  ...        debug
f390: 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a   invoke 0 set ::
f3a0: 74 65 73 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23  test_log $log; #
f3b0: 20 4e 4f 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67   NOTE: For [tlog
f3c0: 5d 2e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ].....        #.
f3d0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
f3e0: 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61 6c   Install the cal
f3f0: 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f 20  lback script to 
f400: 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  be evaluated in 
f410: 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20 20  the isolated..  
f420: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
f430: 74 65 72 70 72 65 74 65 72 20 77 68 65 6e 20 74  terpreter when t
f440: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 20  his interpreter 
f450: 69 73 20 69 6e 74 65 72 72 75 70 74 65 64 20 62  is interrupted b
f460: 79 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20 20  y script..      
f470: 20 20 23 20 20 20 20 20 20 20 63 61 6e 63 65 6c    #       cancel
f480: 6c 61 74 69 6f 6e 2c 20 65 74 63 2e 0d 0a 20 20  lation, etc...  
f490: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f4a0: 20 64 65 62 75 67 20 63 61 6c 6c 62 61 63 6b 20   debug callback 
f4b0: 61 70 70 6c 79 20 7b 7b 73 65 6e 64 65 72 20 65  apply {{sender e
f4c0: 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23  } {..          #
f4d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
f4e0: 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 69  TE: Check if thi
f4f0: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e  s callback is on
f500: 65 20 74 68 61 74 20 77 65 20 63 61 72 65 20 61  e that we care a
f510: 62 6f 75 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  bout...         
f520: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
f530: 20 7b 22 43 61 6e 63 65 6c 65 64 22 20 69 6e 20   {"Canceled" in 
f540: 5b 73 70 6c 69 74 20 5b 24 65 20 49 6e 74 65 72  [split [$e Inter
f550: 72 75 70 74 54 79 70 65 5d 20 22 2c 20 22 5d 7d  ruptType] ", "]}
f560: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
f570: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
f580: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72      # NOTE: Iter
f590: 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
f5a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f5b0: 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68  ions known to th
f5c0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  e..            #
f5d0: 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 69 6e         parent in
f5e0: 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
f5f0: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
f600: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
f610: 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
f620: 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r \..           
f630: 20 20 20 20 20 5b 6f 62 6a 65 63 74 20 69 6e 76       [object inv
f640: 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
f650: 75 62 6c 69 63 20 24 65 20 49 6e 74 65 72 70 72  ublic $e Interpr
f660: 65 74 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73  eter.connections
f670: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
f680: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
f690: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
f6a0: 6d 70 74 20 74 6f 20 63 61 6e 63 65 6c 20 61 6e  mpt to cancel an
f6b0: 79 20 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e  y SQL queries in
f6c0: 20 70 72 6f 67 72 65 73 73 20 6f 6e 20 74 68 69   progress on thi
f6d0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
f6e0: 20 23 20 20 20 20 20 20 20 64 61 74 61 62 61 73   #       databas
f6f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20  e connection... 
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
f720: 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69 72 20   {[catch {$pair 
f730: 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20 65 72  Value.Cancel} er
f740: 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ror]} then {..  
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
f760: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
f770: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
f780: 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  \n \..          
f790: 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
f7a0: 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
f7b0: 74 6f 20 63 61 6e 63 65 6c 20 71 75 65 72 79 20  to cancel query 
f7c0: 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5c  for connection \
f7d0: 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
f7e0: 20 20 20 20 20 20 20 20 20 20 5b 24 70 61 69 72            [$pair
f7f0: 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f 72   Key] "\", error
f800: 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
f810: 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
f820: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
f830: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
f840: 0d 0a 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20  ..        }}..  
f850: 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
f860: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
f870: 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
f880: 20 69 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61   interruptCallba
f890: 63 6b 2e 73 71 6c 69 74 65 33 0d 0a 0d 0a 20 20  ck.sqlite3....  
f8a0: 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
f8b0: 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20  nnel yes\n..    
f8c0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
f8d0: 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
f8e0: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22  el [appendArgs "
f8f0: 6e 6f 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  no, error: " \n\
f900: 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
f910: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
f920: 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e 75  .    proc cleanu
f930: 70 46 69 6c 65 20 7b 20 66 69 6c 65 4e 61 6d 65  pFile { fileName
f940: 20 7b 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20   {collect true} 
f950: 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7d 20  {force false} } 
f960: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
f970: 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70    # NOTE: Attemp
f980: 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20 70  t to force all p
f990: 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65 22  ending "garbage"
f9a0: 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20 63   objects to be c
f9b0: 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20 20  ollected,..     
f9c0: 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64 69   #       includi
f9d0: 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65 6d  ng SQLite statem
f9e0: 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70 20  ents and backup 
f9f0: 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73 68  objects; this sh
fa00: 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20 20  ould allow..    
fa10: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75 6e    #       the un
fa20: 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
fa30: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  e file to be del
fa40: 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eted...      #..
fa50: 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65        if {$colle
fa60: 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  ct} then {..    
fa70: 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61      collectGarba
fa80: 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ge $::test_chann
fa90: 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  el..      }.... 
faa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
fab0: 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
fac0: 68 65 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  he file still ex
fad0: 69 73 74 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ists...      #..
fae0: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
faf0: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
fb00: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
fb10: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
fb20: 4e 4f 54 45 3a 20 53 6b 69 70 20 64 65 6c 65 74  NOTE: Skip delet
fb30: 69 6e 67 20 74 65 73 74 20 66 69 6c 65 73 20 69  ing test files i
fb40: 66 20 73 6f 6d 65 62 6f 64 79 20 73 65 74 73 20  f somebody sets 
fb50: 74 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  the global varia
fb60: 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ble..        #  
fb70: 20 20 20 20 20 74 6f 20 70 72 65 76 65 6e 74 20       to prevent 
fb80: 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
fb90: 20 20 20 20 20 20 20 20 69 66 20 7b 24 66 6f 72          if {$for
fba0: 63 65 20 7c 7c 20 21 5b 69 6e 66 6f 20 65 78 69  ce || ![info exi
fbb0: 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
fbc0: 46 69 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  File)]} then {..
fbd0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fbe0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
fbf0: 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74 65  ttempt to delete
fc00: 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 20 6e   the test file n
fc10: 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
fc20: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
fc30: 5b 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  [set code [catch
fc40: 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
fc50: 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 5d  ileName} error]]
fc60: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
fc70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fc80: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
fc90: 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
fca0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  o delete the fil
fcb0: 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a  e, report why...
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
fcd0: 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
fce0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
fcf0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
fd20: 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20  ailed to delete 
fd30: 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20 24 66  test file \"" $f
fd40: 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20  ileName \..     
fd50: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
fd60: 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 2c 20 65  uring cleanup, e
fd70: 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
fd80: 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
fd90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20     }..        } 
fda0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
fdb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
fdc0: 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 61 74   NOTE: Show that
fdd0: 20 77 65 20 73 6b 69 70 70 65 64 20 64 65 6c 65   we skipped dele
fde0: 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0d 0a  ting the file...
fdf0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
fe00: 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
fe10: 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  0....          t
fe20: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
fe30: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
fe40: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
fe50: 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
fe60: 20 73 6b 69 70 70 65 64 20 64 65 6c 65 74 69 6e   skipped deletin
fe70: 67 20 74 65 73 74 20 66 69 6c 65 20 5c 22 22 20  g test file \"" 
fe80: 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
fe90: 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
fea0: 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
feb0: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
fec0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
fed0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
fee0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 66 69 6c   # NOTE: The fil
fef0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
ff00: 2c 20 73 75 63 63 65 73 73 21 0d 0a 20 20 20 20  , success!..    
ff10: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73      #..        s
ff20: 65 74 20 63 6f 64 65 20 30 0d 0a 20 20 20 20 20  et code 0..     
ff30: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
ff40: 72 6e 20 24 63 6f 64 65 0d 0a 20 20 20 20 7d 0d  rn $code..    }.
ff50: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 6f 6c  ....    proc col
ff60: 6c 65 63 74 47 61 72 62 61 67 65 20 7b 20 63 68  lectGarbage { ch
ff70: 61 6e 6e 65 6c 20 7b 6d 69 6c 6c 69 73 65 63 6f  annel {milliseco
ff80: 6e 64 73 20 31 30 30 30 7d 20 7b 71 75 69 65 74  nds 1000} {quiet
ff90: 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
ffa0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62    if {[catch {ob
ffb0: 6a 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47  ject invoke GC G
ffc0: 65 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61  etTotalMemory fa
ffd0: 6c 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20  lse} result] == 
ffe0: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
fff0: 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
10000 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
10010 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
10020 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
10040 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  --- memory in us
10050 65 20 62 79 20 74 68 65 20 43 4c 52 20 62 65 66  e by the CLR bef
10060 6f 72 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e  ore collection..
10070 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  . " \..         
10080 20 20 20 20 20 24 72 65 73 75 6c 74 20 22 20 62       $result " b
10090 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  ytes\n"]..      
100a0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
100b0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
100c0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
100d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
100e0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
100f0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
10100 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75  get CLR memory u
10110 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c  sage, error: " \
10120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e  ..            \n
10130 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
10140 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
10150 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
10160 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10170 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10180 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
10190 23 23 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20  ##########....  
101a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
101b0 4f 54 45 3a 20 52 65 70 65 61 74 65 64 6c 79 20  OTE: Repeatedly 
101c0 61 74 74 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65  attempt to colle
101d0 63 74 20 67 61 72 62 61 67 65 20 75 6e 74 69 6c  ct garbage until
101e0 20 74 68 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75   the allotted nu
101f0 6d 62 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20  mber..      #   
10200 20 20 20 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f      of milliseco
10210 6e 64 73 20 68 61 73 20 65 6c 61 70 73 65 64 2e  nds has elapsed.
10220 20 20 41 6c 77 61 79 73 20 61 74 74 65 6d 70 74    Always attempt
10230 20 74 6f 20 63 6f 6c 6c 65 63 74 20 67 61 72 62   to collect garb
10240 61 67 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  age..      #    
10250 20 20 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65     at least once
10260 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
10270 20 20 73 65 74 20 73 74 61 72 74 20 5b 63 6c 6f    set start [clo
10280 63 6b 20 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20  ck seconds]..   
10290 20 20 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70     set stop [exp
102a0 72 20 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69  r {$start + ($mi
102b0 6c 6c 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30  lliseconds / 100
102c0 30 29 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 64 6f  0)}]....      do
102d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
102e0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
102f0 74 74 65 6d 70 74 20 74 6f 20 66 6f 72 63 65 20  ttempt to force 
10300 61 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63  a full garbage c
10310 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f 77 2e 20 20  ollection now.  
10320 52 65 70 6f 72 74 20 61 6e 79 0d 0a 20 20 20 20  Report any..    
10330 20 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f      #       erro
10340 72 20 74 68 61 74 20 69 73 20 65 6e 63 6f 75 6e  r that is encoun
10350 74 65 72 65 64 20 69 66 20 77 65 20 66 61 69 6c  tered if we fail
10360 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
10370 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
10380 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
10390 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
103a0 79 20 74 72 75 65 7d 20 65 72 72 6f 72 5d 7d 20  y true} error]} 
103b0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
103c0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
103d0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
103f0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
10400 6c 65 64 20 66 75 6c 6c 20 67 61 72 62 61 67 65  led full garbage
10410 20 63 6f 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72   collection, err
10420 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
10430 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
10440 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
10450 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74  }....        set
10460 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73 65 63 6f   now [clock seco
10470 6e 64 73 5d 0d 0a 20 20 20 20 20 20 7d 20 77 68  nds]..      } wh
10480 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 3d 20 24  ile {$start <= $
10490 6e 6f 77 20 26 26 20 24 6e 6f 77 20 3c 20 24 73  now && $now < $s
104a0 74 6f 70 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23  top}....      ##
104b0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104c0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
104f0 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
10500 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
10510 65 63 74 20 69 6e 76 6f 6b 65 20 47 43 20 47 65  ect invoke GC Ge
10520 74 54 6f 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c  tTotalMemory fal
10530 73 65 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  se} result] == 0
10540 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10550 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
10560 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
10570 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10580 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
105a0 2d 2d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  -- memory in use
105b0 20 62 79 20 74 68 65 20 43 4c 52 20 61 66 74 65   by the CLR afte
105c0 72 20 63 6f 6c 6c 65 63 74 69 6f 6e 2e 2e 2e 20  r collection... 
105d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
105e0 20 20 20 24 72 65 73 75 6c 74 20 22 20 62 79 74     $result " byt
105f0 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  es\n"]..        
10600 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
10610 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
10620 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
10630 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
10640 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
10650 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 67 65  NG: failed to ge
10660 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20 75 73 61  t CLR memory usa
10670 67 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  ge, error: " \..
10680 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 5c 74              \n\t
10690 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20   $result \n]..  
106a0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
106b0 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51 4c  .    proc getSQL
106c0 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
106d0 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74  { channel {quiet
106e0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
106f0 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c     set result [l
10700 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ist]....      if
10710 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e   {[haveConstrain
10720 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
10730 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e     defineConstan
10740 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t.System.Data.SQ
10750 4c 69 74 65 2e 43 4f 55 4e 54 5f 48 41 4e 44 4c  Lite.COUNT_HANDL
10760 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  E]} then {..    
10770 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
10780 20 4e 4f 54 45 3a 20 41 64 64 20 65 61 63 68 20   NOTE: Add each 
10790 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65 20  critical handle 
107a0 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 72 65 73  count to the res
107b0 75 6c 74 69 6e 67 20 6c 69 73 74 2e 0d 0a 20 20  ulting list...  
107c0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
107d0 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 5b 6c   foreach name [l
107e0 69 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 43 6f  ist connectionCo
107f0 75 6e 74 20 73 74 61 74 65 6d 65 6e 74 43 6f 75  unt statementCou
10800 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e 74 5d 20  nt backupCount] 
10810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
10820 20 76 61 6c 75 65 20 5b 6f 62 6a 65 63 74 20 69   value [object i
10830 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
10840 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
10850 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e           System.
10860 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61  Data.SQLite.Unsa
10870 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20  feNativeMethods 
10880 24 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  $name]....      
10890 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
108a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
108b0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
108c0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
108d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
108e0 20 20 20 22 2d 2d 2d 2d 20 63 72 69 74 69 63 61     "---- critica
108f0 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20 5c  l handle count \
10900 22 22 20 24 6e 61 6d 65 20 22 5c 22 20 69 73 20  "" $name "\" is 
10910 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  " $value \n]..  
10920 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10930 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
10940 65 73 75 6c 74 20 24 76 61 6c 75 65 0d 0a 20 20  esult $value..  
10950 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
10960 20 65 6c 73 65 69 66 20 7b 21 24 71 75 69 65 74   elseif {!$quiet
10970 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
10990 4f 54 45 3a 20 54 68 65 20 61 63 74 75 61 6c 20  OTE: The actual 
109a0 68 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 72  handle counts ar
109b0 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 3b  e not available;
109c0 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74   therefore, just
109d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
109e0 20 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74    return an empt
109f0 79 20 6c 69 73 74 2e 0d 0a 20 20 20 20 20 20 20  y list...       
10a00 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
10a10 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
10a20 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
10a30 20 63 6f 75 6e 74 73 20 75 6e 61 76 61 69 6c 61   counts unavaila
10a40 62 6c 65 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ble\n"..      }.
10a50 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
10a60 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a  $result..    }..
10a70 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73 68 75 74  ...    proc shut
10a80 64 6f 77 6e 53 51 4c 69 74 65 20 7b 20 63 68 61  downSQLite { cha
10a90 6e 6e 65 6c 20 7b 66 6f 72 63 65 20 66 61 6c 73  nnel {force fals
10aa0 65 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  e} {quiet false}
10ab0 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
10ac0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 6b       # NOTE: Mak
10ad0 65 20 73 75 72 65 20 74 68 61 74 20 53 51 4c 69  e sure that SQLi
10ae0 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
10af0 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 73 68  is completely sh
10b00 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 0d 0a 20  utdown.  This.. 
10b10 20 20 20 20 20 23 20 20 20 20 20 20 20 69 73 20       #       is 
10b20 75 73 65 64 20 62 79 20 74 65 73 74 73 20 74 68  used by tests th
10b30 61 74 20 63 68 61 6e 67 65 20 63 6f 6e 66 69 67  at change config
10b40 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
10b50 61 6e 64 2f 6f 72 20 74 68 6f 73 65 0d 0a 20 20  and/or those..  
10b60 20 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74      #       that
10b70 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
10b80 72 65 20 6c 6f 67 67 69 6e 67 20 69 73 20 69 6e  re logging is in
10b90 69 74 69 61 6c 69 7a 65 64 20 28 69 2e 65 2e 20  itialized (i.e. 
10ba0 6a 75 73 74 20 69 6e 20 63 61 73 65 0d 0a 20 20  just in case..  
10bb0 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
10bc0 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69 62 72  SQLite core libr
10bd0 61 72 79 20 77 61 73 20 69 6e 69 74 69 61 6c 69  ary was initiali
10be0 7a 65 64 20 69 6e 20 74 68 65 20 70 72 6f 63 65  zed in the proce
10bf0 73 73 20 70 72 69 6f 72 20 74 6f 0d 0a 20 20 20  ss prior to..   
10c00 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 53     #       the S
10c10 51 4c 69 74 65 4c 6f 67 20 63 6c 61 73 73 20 62  QLiteLog class b
10c20 65 69 6e 67 20 61 62 6c 65 20 74 6f 20 73 65 74  eing able to set
10c30 75 70 20 69 74 73 20 6c 6f 67 67 69 6e 67 20 63  up its logging c
10c40 61 6c 6c 62 61 63 6b 29 2e 0d 0a 20 20 20 20 20  allback)...     
10c50 20 23 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 6c   #       Normall
10c60 79 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6f  y, this should o
10c70 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
10c80 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 6c 6f   if SQLite is lo
10c90 61 64 65 64 20 61 6e 64 0d 0a 20 20 20 20 20 20  aded and..      
10ca0 23 20 20 20 20 20 20 20 72 65 61 64 79 20 66 6f  #       ready fo
10cb0 72 20 75 73 65 20 62 79 20 74 68 65 20 74 65 73  r use by the tes
10cc0 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20  t suite...      
10cd0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 66 6f  #..      if {$fo
10ce0 72 63 65 20 7c 7c 20 5b 69 73 53 51 4c 69 74 65  rce || [isSQLite
10cf0 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  Ready]} then {..
10d00 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
10d10 20 20 20 23 20 42 55 47 46 49 58 3a 20 42 65 66     # BUGFIX: Bef
10d20 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 65 20  ore calling the 
10d30 6e 61 74 69 76 65 20 73 68 75 74 64 6f 77 6e 20  native shutdown 
10d40 66 75 6e 63 74 69 6f 6e 2c 20 6d 61 6b 65 20 73  function, make s
10d50 75 72 65 20 62 6f 74 68 0d 0a 20 20 20 20 20 20  ure both..      
10d60 20 20 23 20 20 20 20 20 20 20 20 20 6f 66 20 74    #         of t
10d70 68 65 20 50 52 41 47 4d 41 20 72 65 6c 61 74 65  he PRAGMA relate
10d80 64 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d 65  d directory name
10d90 73 20 61 72 65 20 66 72 65 65 64 2e 0d 0a 20 20  s are freed...  
10da0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
10db0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
10dc0 69 72 65 63 74 6f 72 69 65 73 20 24 63 68 61 6e  irectories $chan
10dd0 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20  nel true....    
10de0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
10df0 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66  object invoke -f
10e00 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20  lags +NonPublic 
10e10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
10e20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
10e30 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69  QLite.UnsafeNati
10e40 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20  veMethods \..   
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10e60 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 7d 20 72  ite3_shutdown} r
10e70 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65  esult] == 0} the
10e80 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
10e90 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
10ea0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
10eb0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
10ec0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
10ee0 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  --- call sqlite3
10ef0 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e 20 6f  _shutdown()... o
10f00 6b 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d  k: " $result \n]
10f10 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
10f20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
10f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
10f40 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
10f50 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
10f60 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
10f70 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
10f80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
10f90 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 68 75  call sqlite3_shu
10fa0 74 64 6f 77 6e 28 29 2e 2e 2e 20 65 72 72 6f 72  tdown()... error
10fb0 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74  : " \n\t $result
10fc0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
10fd0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
10fe0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
10ff0 0a 20 20 20 20 70 72 6f 63 20 72 65 70 6f 72 74  .    proc report
11000 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73 20  SQLiteResources 
11010 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75 69 65 74  { channel {quiet
11020 20 66 61 6c 73 65 7d 20 7b 63 6f 6c 6c 65 63 74   false} {collect
11030 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20   true} } {..    
11040 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
11050 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6f 75 74 70  E: Skip all outp
11060 75 74 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  ut if we are run
11070 6e 69 6e 67 20 69 6e 20 22 71 75 69 65 74 22 20  ning in "quiet" 
11080 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  mode...      #..
11090 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
110a0 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20  onstraint \..   
110b0 20 20 20 20 20 20 20 20 20 20 20 64 65 66 69 6e             defin
110c0 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
110d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 49 4e 54  .Data.SQLite.INT
110e0 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
110f0 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  LE] && \..      
11100 20 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61      [haveConstra
11110 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
11120 20 20 20 20 20 64 65 66 69 6e 65 43 6f 6e 73 74       defineConst
11130 61 6e 74 2e 53 79 73 74 65 6d 2e 44 61 74 61 2e  ant.System.Data.
11140 53 51 4c 69 74 65 2e 54 52 41 43 4b 5f 4d 45 4d  SQLite.TRACK_MEM
11150 4f 52 59 5f 42 59 54 45 53 5d 7d 20 74 68 65 6e  ORY_BYTES]} then
11160 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11170 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11180 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11190 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
111a0 63 75 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69  current memory i
111b0 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65 4d  n use by SQLiteM
111c0 65 6d 6f 72 79 2e 2e 2e 20 22 0d 0a 20 20 20 20  emory... "..    
111d0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
111e0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f 62 6a   if {[catch {obj
111f0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
11200 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11230 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20  te.SQLiteMemory 
11240 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11250 20 20 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65     bytesAllocate
11260 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d  d} memory] == 0}
11270 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11280 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11290 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
112a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
112b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
112c0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
112d0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
112e0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
112f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
11300 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d   memory unknown.
11310 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
11320 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
11330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
11340 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
11350 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79  pendArgs $memory
11360 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
11370 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
11380 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
11390 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
113a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
113b0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 6d 61 78 69  annel "---- maxi
113c0 6d 75 6d 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73  mum memory in us
113d0 65 20 62 79 20 53 51 4c 69 74 65 4d 65 6d 6f 72  e by SQLiteMemor
113e0 79 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 20 20  y... "..        
113f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
11400 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
11410 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
11420 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
11430 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
11440 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
11450 51 4c 69 74 65 4d 65 6d 6f 72 79 20 5c 0d 0a 20  QLiteMemory \.. 
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
11470 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63  aximumBytesAlloc
11480 61 74 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d  ated} memory] ==
11490 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
114a0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
114b0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
114c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
114d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
114e0 73 20 24 6d 65 6d 6f 72 79 20 22 20 62 79 74 65  s $memory " byte
114f0 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
11500 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c   }..        } el
11510 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
11520 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f  set memory unkno
11530 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  wn....          
11540 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
11550 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
11560 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11570 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
11580 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ory \n]..       
11590 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
115a0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
115b0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
115c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
115d0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d  puts $channel "-
115e0 2d 2d 2d 20 63 75 72 72 65 6e 74 20 6d 65 6d 6f  --- current memo
115f0 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  ry in use by SQL
11600 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20  ite... "..      
11610 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  }....      if {[
11620 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69 6e  catch {object in
11630 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e  voke -flags +Non
11640 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20  Public \..      
11650 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
11660 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66  ata.SQLite.Unsaf
11670 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c  eNativeMethods \
11680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11690 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
116a0 73 65 64 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20  sed} memory] == 
116b0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
116c0 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
116d0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
116e0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
116f0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
11700 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d  mory " bytes\n"]
11710 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11720 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11730 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11740 23 20 4e 4f 54 45 3a 20 4d 61 79 62 65 20 74 68  # NOTE: Maybe th
11750 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c 69  e SQLite core li
11760 62 72 61 72 79 20 69 73 20 75 6e 61 76 61 69 6c  brary is unavail
11770 61 62 6c 65 3f 0d 0a 20 20 20 20 20 20 20 20 23  able?..        #
11780 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 65  ..        set me
11790 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
117a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
117b0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
117c0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
117d0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
117e0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
117f0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11800 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 72  }....      set r
11810 65 73 75 6c 74 20 24 6d 65 6d 6f 72 79 3b 20 23  esult $memory; #
11820 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6d 65   NOTE: Return me
11830 6d 6f 72 79 20 69 6e 2d 75 73 65 20 74 6f 20 6f  mory in-use to o
11840 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 20 20  ur caller.....  
11850 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
11860 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11870 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
11880 22 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65  "---- maximum me
11890 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53  mory in use by S
118a0 51 4c 69 74 65 2e 2e 2e 20 22 0d 0a 20 20 20 20  QLite... "..    
118b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
118c0 7b 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20  {[catch {object 
118d0 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
118e0 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
118f0 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
11900 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
11910 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
11920 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11930 20 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79    sqlite3_memory
11940 5f 68 69 67 68 77 61 74 65 72 20 30 7d 20 6d 65  _highwater 0} me
11950 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
11960 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
11970 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11980 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
11990 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
119a0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
119b0 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
119c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
119d0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
119e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
119f0 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69 74   Maybe the SQLit
11a00 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 69  e core library i
11a10 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  s unavailable?..
11a20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
11a30 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
11a40 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
11a50 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
11a60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
11a70 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
11a80 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
11a90 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
11aa0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  }..      }....  
11ab0 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74      if {$collect
11ac0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11ad0 20 20 63 6f 6c 6c 65 63 74 47 61 72 62 61 67 65    collectGarbage
11ae0 20 24 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20   $channel..     
11af0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
11b00 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11b10 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
11b20 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
11b30 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
11b40 75 73 65 20 62 79 20 74 68 65 20 43 4c 52 2e 2e  use by the CLR..
11b50 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  . "..      }....
11b60 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
11b70 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
11b80 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
11b90 79 20 66 61 6c 73 65 7d 20 6d 65 6d 6f 72 79 5d  y false} memory]
11ba0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
11bb0 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
11bc0 6e 67 20 69 73 20 69 6e 74 65 67 65 72 20 2d 73  ng is integer -s
11bd0 74 72 69 63 74 20 24 6d 65 6d 6f 72 79 5d 7d 20  trict $memory]} 
11be0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11bf0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
11c00 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
11c10 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
11c20 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d  l [appendArgs $m
11c30 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22  emory " bytes\n"
11c40 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
11c50 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
11c60 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
11c70 6d 65 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a  memory invalid..
11c80 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
11c90 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
11ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
11cb0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
11cc0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
11cd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
11ce0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
11cf0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
11d00 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20       set memory 
11d10 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20  unknown....     
11d20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
11d30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
11d40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11d50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
11d60 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
11d70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
11d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
11d90 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
11da0 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
11db0 72 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  rSQLiteDirectori
11dc0 65 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 72 65  es { channel {re
11dd0 73 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  set false} } {..
11de0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
11df0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
11e00 74 68 65 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  the sqlite3_win3
11e10 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
11e20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69  function is avai
11e30 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d  lable...      #.
11e40 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
11e50 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
11e60 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
11e70 67 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 73  g for function s
11e80 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
11e90 5f 64 69 72 65 63 74 6f 72 79 2e 2e 2e 20 22 0d  _directory... ".
11ea0 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
11eb0 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63    # NOTE: This c
11ec0 61 6c 6c 20 74 6f 20 74 68 65 20 73 71 6c 69 74  all to the sqlit
11ed0 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
11ee0 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20  ectory function 
11ef0 75 73 65 73 20 74 68 65 0d 0a 20 20 20 20 20 20  uses the..      
11f00 23 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 20  #       invalid 
11f10 76 61 6c 75 65 20 30 20 66 6f 72 20 74 68 65 20  value 0 for the 
11f20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
11f30 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 64 65   This code is de
11f40 73 69 67 6e 65 64 0d 0a 20 20 20 20 20 20 23 20  signed..      # 
11f50 20 20 20 20 20 20 74 6f 20 63 68 65 63 6b 20 69        to check i
11f60 66 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75  f calling the fu
11f70 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 61 69 73  nction will rais
11f80 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 28  e an exception (
11f90 69 2e 65 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  i.e...      #   
11fa0 20 20 20 20 74 68 65 20 61 63 74 75 61 6c 20 72      the actual r
11fb0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 66 75 6e  esult of the fun
11fc0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6d  ction does not m
11fd0 61 74 74 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  atter as long as
11fe0 20 6e 6f 0d 0a 20 20 20 20 20 20 23 20 20 20 20   no..      #    
11ff0 20 20 20 64 69 72 65 63 74 6f 72 79 20 69 73 20     directory is 
12000 63 68 61 6e 67 65 64 29 2e 0d 0a 20 20 20 20 20  changed)...     
12010 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63   #..      if {[c
12020 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
12030 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
12040 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12050 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
12060 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
12070 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65  ta.SQLite.Unsafe
12080 4e 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d  NativeMethods \.
12090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
120a0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
120b0 5f 64 69 72 65 63 74 6f 72 79 20 30 20 6e 75 6c  _directory 0 nul
120c0 6c 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  l}] == 0} then {
120d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
120e0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 61 6c       # NOTE: Cal
120f0 6c 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ling the sqlite3
12100 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
12110 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 64 6f  tory function do
12120 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20  es not..        
12130 23 20 20 20 20 20 20 20 63 61 75 73 65 20 61 6e  #       cause an
12140 20 65 78 63 65 70 74 69 6f 6e 3b 20 74 68 65 72   exception; ther
12150 65 66 6f 72 65 2c 20 69 74 20 6d 75 73 74 20 62  efore, it must b
12160 65 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65  e available (i.e
12170 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  ...        #    
12180 20 20 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69     even though i
12190 74 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  t should return 
121a0 61 20 66 61 69 6c 75 72 65 20 72 65 74 75 72 6e  a failure return
121b0 20 63 6f 64 65 20 69 6e 20 74 68 69 73 0d 0a 20   code in this.. 
121c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
121d0 61 73 65 29 2e 0d 0a 20 20 20 20 20 20 20 20 23  ase)...        #
121e0 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e  ..        addCon
121f0 73 74 72 61 69 6e 74 20 73 71 6c 69 74 65 33 5f  straint sqlite3_
12200 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
12210 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74  ory....        t
12220 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65  puts $channel ye
12230 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  s\n....        #
12240 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
12250 3a 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65  : Does our calle
12260 72 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20  r want to reset 
12270 74 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f  the directories?
12280 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
12290 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74 7d       if {$reset}
122a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
122b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
122c0 23 20 4e 4f 54 45 3a 20 4e 6f 77 20 6d 61 6b 65  # NOTE: Now make
122d0 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
122e0 73 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79  se and temporary
122f0 20 64 69 72 65 63 74 6f 72 69 65 73 20 61 72 65   directories are
12300 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
12310 20 20 20 20 72 65 73 65 74 20 74 68 65 69 72 20      reset their 
12320 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 2c 20  default values, 
12330 77 68 69 63 68 20 73 68 6f 75 6c 64 20 62 65 20  which should be 
12340 6e 75 6c 6c 20 66 6f 72 20 62 6f 74 68 2e 0d 0a  null for both...
12350 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
12360 20 20 53 69 6e 63 65 20 74 68 65 20 73 71 6c 69    Since the sqli
12370 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
12380 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
12390 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 0d 0a   is available,..
123a0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
123b0 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20    use it...     
123c0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
123d0 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64 65 78    for {set index
123e0 20 31 7d 20 7b 24 69 6e 64 65 78 20 3c 20 33 7d   1} {$index < 3}
123f0 20 7b 69 6e 63 72 20 69 6e 64 65 78 7d 20 7b 0d   {incr index} {.
12400 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
12410 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
12430 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
12440 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
12450 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12460 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
12470 61 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e  a.SQLite.UnsafeN
12480 61 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a  ativeMethods \..
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
124b0 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 20  2_set_directory 
124c0 24 69 6e 64 65 78 20 6e 75 6c 6c 7d 20 5c 0d 0a  $index null} \..
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124e0 20 20 20 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30      result] == 0
124f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12500 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12510 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12520 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12530 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61          "---- ca
12540 6c 6c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  ll sqlite3_win32
12550 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 22  _set_directory("
12560 20 24 69 6e 64 65 78 20 5c 0d 0a 20 20 20 20 20   $index \..     
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2c 20               ", 
12580 6e 75 6c 6c 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24  null)... ok: " $
12590 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
125a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
125b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
125c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
125d0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
12600 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
12610 65 63 74 6f 72 79 28 22 20 24 69 6e 64 65 78 20  ectory(" $index 
12620 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
12630 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e 2e       ", null)...
12640 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
12650 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
12660 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
12670 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
12680 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  }..      } else 
12690 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
126a0 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a   $channel no\n..
126b0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
126c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f 65       # NOTE: Doe
126d0 73 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e  s our caller wan
126e0 74 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 64  t to reset the d
126f0 69 72 65 63 74 6f 72 69 65 73 3f 20 20 54 68 69  irectories?  Thi
12700 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a 20 20 20 20  s can only..    
12710 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20 70      #       be p
12720 65 72 66 6f 72 6d 65 64 20 69 66 20 53 51 4c 69  erformed if SQLi
12730 74 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  te is loaded and
12740 20 72 65 61 64 79 20 66 6f 72 20 75 73 65 20 62   ready for use b
12750 79 20 74 68 65 20 74 65 73 74 0d 0a 20 20 20 20  y the test..    
12760 20 20 20 20 23 20 20 20 20 20 20 20 73 75 69 74      #       suit
12770 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
12780 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65         if {$rese
12790 74 20 26 26 20 5b 69 73 53 51 4c 69 74 65 52 65  t && [isSQLiteRe
127a0 61 64 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ady]} then {..  
127b0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
127c0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77       # NOTE: Now
127d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64   make sure the d
127e0 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d 70  atabase and temp
127f0 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69 65  orary directorie
12800 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20 20  s are..         
12810 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74   #       reset t
12820 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c  heir default val
12830 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c  ues, which shoul
12840 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f  d be null for bo
12850 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  th...          #
12860 20 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65         Since the
12870 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
12880 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
12890 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a  ction does not..
128a0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
128b0 20 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61    appear to be a
128c0 76 61 69 6c 61 62 6c 65 2c 20 75 73 65 20 74 68  vailable, use th
128d0 65 20 61 73 73 6f 63 69 61 74 65 64 20 50 52 41  e associated PRA
128e0 47 4d 41 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20  GMA commands..  
128f0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12900 69 6e 73 74 65 61 64 2e 0d 0a 20 20 20 20 20 20  instead...      
12910 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
12920 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74 6f   foreach directo
12930 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73 74  ry [list data_st
12940 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74 65  ore_directory te
12950 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f  mp_store_directo
12960 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ry] {..         
12970 20 20 20 73 65 74 20 73 71 6c 20 5b 61 70 70 65     set sql [appe
12980 6e 64 41 72 67 73 20 22 50 52 41 47 4d 41 20 22  ndArgs "PRAGMA "
12990 20 24 64 69 72 65 63 74 6f 72 79 20 22 20 3d 20   $directory " = 
129a0 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a 20 20 20 20 20  \"\";"]....     
129b0 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
129c0 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24 73  h {executeSql $s
129d0 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30  ql} result] == 0
129e0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
129f0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12a00 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12a10 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12a20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78          "---- ex
12a30 65 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24  ecute PRAGMA " $
12a40 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f  directory "... o
12a50 6b 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  k: \"" \..      
12a60 20 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73              $res
12a70 75 6c 74 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ult \"\n]..     
12a80 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
12a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
12aa0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12ab0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12ad0 2d 2d 2d 2d 20 65 78 65 63 75 74 65 20 50 52 41  ---- execute PRA
12ae0 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
12af0 20 22 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20 5c   "... error: " \
12b00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12b10 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
12b20 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
12b30 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
12b40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
12b50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
12b60 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46  .      # NOTE: F
12b70 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68 65  inally, show the
12b80 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
12b90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
12ba0 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20 20  nd temporary..  
12bb0 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
12bc0 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63  ctories.  This c
12bd0 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f  an only be perfo
12be0 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20 69  rmed if SQLite i
12bf0 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20 20  s loaded..      
12c00 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61 64  #       and read
12c10 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  y for use by the
12c20 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20   test suite...  
12c30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
12c40 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79 5d  {[isSQLiteReady]
12c50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12c60 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63 74    foreach direct
12c70 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f 73  ory [list data_s
12c80 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20 74  tore_directory t
12c90 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74  emp_store_direct
12ca0 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  ory] {..        
12cb0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
12cc0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d 2d   [appendArgs "--
12cd0 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24 64  -- checking " $d
12ce0 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22 5d  irectory "... "]
12cf0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
12d00 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72 67  t sql [appendArg
12d10 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69 72  s "PRAGMA " $dir
12d20 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20 20  ectory \;]....  
12d30 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
12d40 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20 24  ch {executeSql $
12d50 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73 75  sql scalar} resu
12d60 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  lt] == 0} then {
12d70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
12d80 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
12d90 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c 22  pendArgs "ok: \"
12da0 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d 0d  " $result \"\n].
12db0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
12dc0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
12dd0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
12de0 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72 72  [appendArgs "err
12df0 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73 75  or: " \n\t $resu
12e00 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
12e10 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
12e20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
12e30 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61 64  ...    proc load
12e40 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e  SQLiteTestSettin
12e50 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73 75  gs { channel {su
12e60 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74 20  ffix ""} {quiet 
12e70 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
12e80 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
12e90 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67 20  E: Skip loading 
12ea0 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66 20  the settings if 
12eb0 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73 20  their usage has 
12ec0 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d 0a  been disabled...
12ed0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
12ee0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
12ef0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73 74   ::no(sqliteTest
12f00 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65 6e  Settings)]} then
12f10 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
12f20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c         # NOTE: L
12f30 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d 75  oad custom per-u
12f40 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68  ser and/or per-h
12f50 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e 67  ost test setting
12f60 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
12f70 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  #..        if {[
12f80 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63  info exists ::tc
12f90 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72 29  l_platform(user)
12fa0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12fb0 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65 74       set userSet
12fc0 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66  tingsFileName [f
12fd0 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d  ile join [getCom
12fe0 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d  monDirectory] \.
12ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
13000 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69  appendArgs setti
13010 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a  ngs $suffix . $:
13020 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73  :tcl_platform(us
13030 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a  er) .eagle]]....
13040 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66            if {[f
13050 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65 72  ile exists $user
13060 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65  SettingsFileName
13070 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13080 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
13090 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
130a0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
130b0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
130c0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
130d0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
130e0 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72  loading per-user
130f0 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66   test settings f
13100 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73               $us
13120 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
13130 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20  me \"...\n]..   
13140 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
13150 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
13160 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
13170 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75 73  [list source $us
13180 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61  erSettingsFileNa
13190 6d 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20  me]} \..        
131a0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
131b0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
131c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
131d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
131f0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
13200 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
13230 66 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70  failed to load p
13240 65 72 2d 75 73 65 72 20 73 65 74 74 69 6e 67 73  er-user settings
13250 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20   file \"" \..   
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 24 75 73 65 72 53 65 74 74 69 6e 67 73 46 69   $userSettingsFi
13280 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f  leName "\", erro
13290 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
132a0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
132b0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
132c0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
132d0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
132e0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
132f0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13300 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13310 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13320 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13330 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
13340 6b 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70  kipped loading p
13350 65 72 2d 75 73 65 72 20 74 65 73 74 20 73 65 74  er-user test set
13360 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
13370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13380 20 20 20 20 24 75 73 65 72 53 65 74 74 69 6e 67      $userSetting
13390 73 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69  sFileName "\", i
133a0 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
133b0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
133c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
133d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
133e0 20 20 20 20 20 20 20 23 23 23 23 23 23 23 23 23         #########
133f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13410 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
13420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0d 0a  ##############..
13430 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69  ..        if {[i
13440 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 63 6c  nfo exists ::tcl
13450 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73 74 29 5d  _platform(host)]
13460 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13470 20 20 20 20 73 65 74 20 68 6f 73 74 53 65 74 74      set hostSett
13480 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b 66 69  ingsFileName [fi
13490 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f 6d 6d  le join [getComm
134a0 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c 0d 0a  onDirectory] \..
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
134c0 70 70 65 6e 64 41 72 67 73 20 73 65 74 74 69 6e  ppendArgs settin
134d0 67 73 20 24 73 75 66 66 69 78 20 2e 20 24 3a 3a  gs $suffix . $::
134e0 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 68 6f 73  tcl_platform(hos
134f0 74 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d 0a 20  t) .eagle]].... 
13500 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
13510 6c 65 20 65 78 69 73 74 73 20 24 68 6f 73 74 53  le exists $hostS
13520 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 5d  ettingsFileName]
13530 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13540 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
13550 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
13560 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
13570 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
13580 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
13590 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
135a0 6f 61 64 69 6e 67 20 70 65 72 2d 68 6f 73 74 20  oading per-host 
135b0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
135c0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
135d0 20 20 20 20 20 20 20 20 20 20 20 20 24 68 6f 73              $hos
135e0 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
135f0 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20 20 20  e \"...\n]..    
13600 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
13610 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
13620 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 5b  tch {uplevel 1 [
13630 6c 69 73 74 20 73 6f 75 72 63 65 20 24 68 6f 73  list source $hos
13640 74 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  tSettingsFileNam
13650 65 5d 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e]} \..         
13660 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
13670 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13680 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
13690 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
136b0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
136c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66  "==== WARNING: f
136f0 61 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65  ailed to load pe
13700 72 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20  r-host settings 
13710 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c  $hostSettingsFil
13740 65 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72  eName "\", error
13750 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20  : " \n\t $error 
13760 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
13770 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
13780 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d    }..          }
13790 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
137a0 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
137b0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
137c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
137d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
137e0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
137f0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b          "---- sk
13800 69 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65  ipped loading pe
13810 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74  r-host test sett
13820 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d  ings file \"" \.
13830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13840 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73     $hostSettings
13850 46 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74  FileName "\", it
13860 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c   does not exist\
13870 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n"]..           
13880 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
13890 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
138a0 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
138b0 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74     proc runSQLit
138c0 65 54 65 73 74 50 72 6f 6c 6f 67 75 65 20 7b 7d  eTestPrologue {}
138d0 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
138e0 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20     # NOTE: Skip 
138f0 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73 74  running our cust
13900 6f 6d 20 70 72 6f 6c 6f 67 75 65 20 69 66 20 74  om prologue if t
13910 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73 20  he main one has 
13920 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20  been..      #   
13930 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20      skipped...  
13940 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
13950 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
13960 3a 6e 6f 28 70 72 6f 6c 6f 67 75 65 2e 65 61 67  :no(prologue.eag
13970 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  le)]} then {..  
13980 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13990 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
139a0 65 20 22 62 65 66 6f 72 65 2d 63 6f 6e 73 74 72  e "before-constr
139b0 61 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65  aints" custom pe
139c0 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
139d0 72 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20  r-host..        
139e0 23 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74  #       test set
139f0 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
13a00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
13a10 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
13a20 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
13a30 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
13a40 61 6e 6e 65 6c 20 2e 62 65 66 6f 72 65 5d 0d 0a  annel .before]..
13a50 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13a60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
13a70 70 20 61 6c 6c 20 53 79 73 74 65 6d 2e 44 61 74  p all System.Dat
13a80 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74 65 64  a.SQLite related
13a90 20 66 69 6c 65 20 68 61 6e 64 6c 69 6e 67 20 28   file handling (
13aa0 64 65 6c 65 74 69 6e 67 2c 0d 0a 20 20 20 20 20  deleting,..     
13ab0 20 20 20 23 20 20 20 20 20 20 20 63 6f 70 79 69     #       copyi
13ac0 6e 67 2c 20 61 6e 64 20 6c 6f 61 64 69 6e 67 29  ng, and loading)
13ad0 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
13ae0 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
13af0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
13b00 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
13b10 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65 73  ::no(sqliteFiles
13b20 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
13b30 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13b40 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74 65 72     # NOTE: Deter
13b50 6d 69 6e 65 20 74 68 65 20 6e 61 6d 65 20 66 6f  mine the name fo
13b60 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 61  r the current na
13b70 74 69 76 65 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a  tive platform...
13b80 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13b90 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
13ba0 6f 72 6d 20 5b 61 72 63 68 69 74 65 63 74 75 72  orm [architectur
13bb0 65 46 6f 72 50 6c 61 74 66 6f 72 6d 20 5b 67 65  eForPlatform [ge
13bc0 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 74  tBuildPlatform t
13bd0 72 75 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  rue]]....       
13be0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
13bf0 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 74 68 65  # NOTE: Show the
13c00 20 70 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 77   platform that w
13c10 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 68  ill be used to h
13c20 65 6c 70 20 6c 6f 63 61 74 65 20 6e 61 74 69 76  elp locate nativ
13c30 65 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  e..          #  
13c40 20 20 20 20 20 62 75 69 6c 64 20 66 69 6c 65 73       build files
13c50 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
13c60 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
13c70 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
13c80 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
13ca0 2d 2d 20 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20  -- platform for 
13cb0 6c 6f 63 61 74 69 6e 67 20 6e 61 74 69 76 65 20  locating native 
13cc0 62 75 69 6c 64 20 66 69 6c 65 73 20 69 73 20 5c  build files is \
13cd0 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  "" \..          
13ce0 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c 22      $platform \"
13cf0 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  \n]....         
13d00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
13d10 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e  NOTE: Skip tryin
13d20 67 20 74 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  g to delete any 
13d30 66 69 6c 65 73 20 69 66 20 77 65 20 61 72 65 20  files if we are 
13d40 73 6f 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  so instructed...
13d50 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
13d60 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
13d70 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
13d80 6c 65 74 65 53 71 6c 69 74 65 46 69 6c 65 73 29  leteSqliteFiles)
13d90 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
13da0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
13db0 41 73 73 65 6d 62 6c 79 20 73 71 6c 69 74 65 33  Assembly sqlite3
13dc0 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  .dll..          
13dd0 20 20 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d    tryDeleteAssem
13de0 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  bly SQLite.Inter
13df0 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  op.dll..        
13e00 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
13e10 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
13e20 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
13e30 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
13e40 65 74 65 41 73 73 65 6d 62 6c 79 20 53 79 73 74  eteAssembly Syst
13e50 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c  em.Data.SQLite.L
13e60 69 6e 71 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20  inq.dll....     
13e70 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69         if {[stri
13e80 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66  ng length $platf
13e90 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  orm] > 0} then {
13ea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13eb0 74 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c  tryDeleteAssembl
13ec0 79 20 73 71 6c 69 74 65 33 2e 64 6c 6c 20 24 70  y sqlite3.dll $p
13ed0 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
13ee0 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
13ef0 41 73 73 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e  Assembly SQLite.
13f00 49 6e 74 65 72 6f 70 2e 64 6c 6c 20 24 70 6c 61  Interop.dll $pla
13f10 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20  tform..         
13f20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73       tryDeleteAs
13f30 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
13f40 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
13f50 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
13f60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
13f70 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
13f80 74 72 61 69 6e 74 20 66 69 6c 65 5f 73 71 6c 69  traint file_sqli
13f90 74 65 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  te3.dll..       
13fa0 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
13fb0 72 61 69 6e 74 20 66 69 6c 65 5f 53 51 4c 69 74  raint file_SQLit
13fc0 65 2e 49 6e 74 65 72 6f 70 2e 64 6c 6c 0d 0a 20  e.Interop.dll.. 
13fd0 20 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76             remov
13fe0 65 43 6f 6e 73 74 72 61 69 6e 74 20 66 69 6c 65  eConstraint file
13ff0 5f 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  _System.Data.SQL
14000 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20  ite.dll..       
14010 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74       removeConst
14020 72 61 69 6e 74 20 66 69 6c 65 5f 53 79 73 74 65  raint file_Syste
14030 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
14040 6e 71 2e 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20  nq.dll..        
14050 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14060 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
14070 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20  NOTE: Check for 
14080 74 68 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22  the "autoSelect"
14090 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e   runtime option.
140a0 20 20 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20    If present,.. 
140b0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
140c0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 75 74 6f   attempt to auto
140d0 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c 65 63 74  matically select
140e0 20 74 68 65 20 66 69 72 73 74 20 61 76 61 69 6c   the first avail
140f0 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20  able..          
14100 23 20 20 20 20 20 20 20 62 75 69 6c 64 20 28 6f  #       build (o
14110 72 20 22 72 65 6c 65 61 73 65 22 29 20 6f 66 20  r "release") of 
14120 53 51 4c 69 74 65 20 61 6e 64 20 53 79 73 74 65  SQLite and Syste
14130 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 0d 0a 20  m.Data.SQLite.. 
14140 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
14150 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 74 68   for use with th
14160 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
14170 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14180 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75        if {[hasRu
14190 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 61 75 74 6f  ntimeOption auto
141a0 53 65 6c 65 63 74 5d 7d 20 74 68 65 6e 20 7b 0d  Select]} then {.
141b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
141c0 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74  {![checkForSQLit
141d0 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73 74 5f  eBuilds $::test_
141e0 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d 20 74  channel true]} t
141f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
14200 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
14210 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
14220 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
14230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
14240 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
14250 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
14260 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
14270 6b 69 70 20 74 72 79 69 6e 67 20 74 6f 20 76 65  kip trying to ve
14280 72 69 66 79 20 74 68 65 20 62 75 69 6c 64 20 64  rify the build d
14290 69 72 65 63 74 6f 72 79 20 69 66 20 77 65 20 61  irectory if we a
142a0 72 65 20 73 6f 0d 0a 20 20 20 20 20 20 20 20 20  re so..         
142b0 20 23 20 20 20 20 20 20 20 69 6e 73 74 72 75 63   #       instruc
142c0 74 65 64 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ted; otherwise, 
142d0 6d 61 6b 65 20 73 75 72 65 20 69 74 20 61 63 74  make sure it act
142e0 75 61 6c 6c 79 20 65 78 69 73 74 73 20 6f 72 0d  ually exists or.
142f0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
14300 20 20 20 68 61 6c 74 20 74 68 65 20 65 6e 74 69     halt the enti
14310 72 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  re testing proce
14320 73 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ss if it does no
14330 74 20 65 78 69 73 74 2e 0d 0a 20 20 20 20 20 20  t exist...      
14340 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14350 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
14360 74 73 20 3a 3a 6e 6f 28 76 65 72 69 66 79 42 75  ts ::no(verifyBu
14370 69 6c 64 44 69 72 65 63 74 6f 72 79 29 5d 7d 20  ildDirectory)]} 
14380 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
14390 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
143a0 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 20 74 68     # NOTE: At th
143b0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 62 75  is point, the bu
143c0 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 4d 55  ild directory MU
143d0 53 54 20 65 78 69 73 74 20 61 73 20 61 0d 0a 20  ST exist as a.. 
143e0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
143f0 20 20 20 76 61 6c 69 64 20 64 69 72 65 63 74 6f     valid directo
14400 72 79 20 66 6f 72 20 74 68 65 20 74 65 73 74 69  ry for the testi
14410 6e 67 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ng process to co
14420 6e 74 69 6e 75 65 2e 0d 0a 20 20 20 20 20 20 20  ntinue...       
14430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14440 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
14450 79 20 5b 67 65 74 42 75 69 6c 64 44 69 72 65 63  y [getBuildDirec
14460 74 6f 72 79 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  tory]....       
14470 20 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20       if {![file 
14480 65 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72  exists $director
14490 79 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20  y] || \..       
144a0 20 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20           ![file 
144b0 69 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  isdirectory $dir
144c0 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
144d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
144e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
144f0 23 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69  # NOTE: Just pri
14500 6f 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68  or to actually h
14510 61 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69  alting the testi
14520 6e 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20  ng process,..   
14530 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
14540 20 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20     add an error 
14550 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20  to the test log 
14560 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  file...         
14570 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14580 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
14590 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
145a0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
145c0 2d 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72  -- could not ver
145d0 69 66 79 20 62 75 69 6c 64 20 64 69 72 65 63 74  ify build direct
145e0 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63 74 6f  ory \"" $directo
145f0 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
14600 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61 6c 6c          "\", all
14610 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64 5c   testing halted\
14620 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n"]....         
14630 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14640 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 61        # NOTE: Ra
14650 69 73 69 6e 67 20 61 20 73 63 72 69 70 74 20 65  ising a script e
14660 72 72 6f 72 20 66 72 6f 6d 20 74 68 69 73 20 70  rror from this p
14670 6f 69 6e 74 20 73 68 6f 75 6c 64 20 68 61 6c 74  oint should halt
14680 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14690 23 20 20 20 20 20 20 20 74 68 65 20 74 65 73 74  #       the test
146a0 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20  ing process...  
146b0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
146d0 6f 72 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  or [appendArgs \
146e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
146f0 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 76      "could not v
14700 65 72 69 66 79 20 62 75 69 6c 64 20 64 69 72 65  erify build dire
14710 63 74 6f 72 79 20 5c 22 22 20 24 64 69 72 65 63  ctory \"" $direc
14720 74 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20  tory \..        
14730 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 61            "\", a
14740 6c 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65  ll testing halte
14750 64 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d"]..           
14760 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
14770 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14780 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14790 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
147a0 20 63 6f 70 79 20 61 6e 79 20 66 69 6c 65 73 20   copy any files 
147b0 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73  if we are so ins
147c0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
147d0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
147e0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
147f0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
14800 74 65 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  teFiles)]} then 
14810 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
14820 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
14830 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
14840 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 0d 0a 0d  te.dll.config...
14850 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
14860 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 73 71 6c  CopyAssembly sql
14870 69 74 65 33 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  ite3.dll..      
14880 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
14890 65 6d 62 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74  embly SQLite.Int
148a0 65 72 6f 70 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  erop.dll..      
148b0 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
148c0 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
148d0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20  a.SQLite.dll..  
148e0 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70            tryCop
148f0 79 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65 6d  yAssembly System
14900 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e  .Data.SQLite.Lin
14910 71 2e 64 6c 6c 0d 0a 0d 0a 20 20 20 20 20 20 20  q.dll....       
14920 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
14930 20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72   length $platfor
14940 6d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  m] > 0} then {..
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
14960 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 73 71  yCopyAssembly sq
14970 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66  lite3.dll $platf
14980 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
14990 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
149a0 6c 79 20 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f  ly SQLite.Intero
149b0 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d  p.dll $platform.
149c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
149d0 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 53  ryCopyAssembly S
149e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
149f0 65 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72 6d 0d  e.dll $platform.
14a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
14a10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
14a20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
14a30 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
14a40 69 70 20 74 72 79 69 6e 67 20 74 6f 20 6c 6f 61  ip trying to loa
14a50 64 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 77  d any files if w
14a60 65 20 61 72 65 20 73 6f 20 69 6e 73 74 72 75 63  e are so instruc
14a70 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ted...          
14a80 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  #..          if 
14a90 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
14aa0 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 46 69  :no(loadSqliteFi
14ab0 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
14ac0 20 20 20 20 20 20 20 20 20 20 20 74 72 79 4c 6f             tryLo
14ad0 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73 74 65  adAssembly Syste
14ae0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c  m.Data.SQLite.dl
14af0 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  l..            t
14b00 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53  ryLoadAssembly S
14b10 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
14b20 65 2e 4c 69 6e 71 2e 64 6c 6c 0d 0a 0d 0a 20 20  e.Linq.dll....  
14b30 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
14b40 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70 6c  tring length $pl
14b50 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74 68 65  atform] > 0} the
14b60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
14b70 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
14b80 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
14b90 51 4c 69 74 65 2e 64 6c 6c 20 24 70 6c 61 74 66  QLite.dll $platf
14ba0 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  orm..           
14bb0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
14bc0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
14bd0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
14be0 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
14bf0 66 20 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61  f auxiliary Mana
14c00 67 65 64 20 44 65 62 75 67 67 69 6e 67 20 41 73  ged Debugging As
14c10 73 69 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a  sistants (MDA)..
14c20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
14c30 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20    configuration 
14c40 66 69 6c 65 73 20 74 68 61 74 20 6d 61 79 20 6e  files that may n
14c50 65 65 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65  eed to be delete
14c60 64 20 6f 72 20 63 6f 70 69 65 64 2e 0d 0a 20 20  d or copied...  
14c70 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14c80 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e 66       set mdaConf
14c90 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73  igFileNames [lis
14ca0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
14cb0 20 20 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78 65     Installer.exe
14cc0 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74  .mda.config test
14cd0 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20  .exe.mda.config 
14ce0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
14cf0 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 2e 6d 64   testlinq.exe.md
14d00 61 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20  a.config]....   
14d10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14d20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
14d30 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
14d40 65 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73  e external files
14d50 20 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e   if we are so in
14d60 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20  structed...     
14d70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
14d80 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
14d90 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53  sts ::no(deleteS
14da0 71 6c 69 74 65 45 78 74 65 72 6e 61 6c 46 69 6c  qliteExternalFil
14db0 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  es)]} then {..  
14dc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
14dd0 68 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c 65 4e  h mdaConfigFileN
14de0 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67 46 69  ame $mdaConfigFi
14df0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
14e00 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65           tryDele
14e10 74 65 42 75 69 6c 64 46 69 6c 65 20 24 6d 64 61  teBuildFile $mda
14e20 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 0d 0a  ConfigFileName..
14e30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
14e40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
14e50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
14e60 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
14e70 70 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  p trying to copy
14e80 20 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 73 20   external files 
14e90 69 66 20 77 65 20 61 72 65 20 73 6f 20 69 6e 73  if we are so ins
14ea0 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20 20 20  tructed...      
14eb0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
14ec0 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
14ed0 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
14ee0 74 65 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29  teExternalFiles)
14ef0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14f00 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
14f10 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 6f        # NOTE: Co
14f20 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20 44  py the Managed D
14f30 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
14f40 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69 67  nts (MDA) config
14f50 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  uration..       
14f60 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
14f70 65 20 66 6f 72 20 74 68 65 20 45 61 67 6c 65 20  e for the Eagle 
14f80 73 68 65 6c 6c 20 74 6f 20 74 68 65 20 62 75 69  shell to the bui
14f90 6c 64 20 6f 75 74 70 75 74 20 64 69 72 65 63 74  ld output direct
14fa0 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
14fb0 20 20 23 20 20 20 20 20 20 20 77 68 69 6c 65 20    #       while 
14fc0 75 73 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  using each of th
14fd0 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 76  e names of the v
14fe0 61 72 69 6f 75 73 20 6c 65 67 61 63 79 20 74 65  arious legacy te
14ff0 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
15000 23 20 20 20 20 20 20 20 65 78 65 63 75 74 61 62  #       executab
15010 6c 65 73 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  les.  This will 
15020 68 65 6c 70 20 74 6f 20 6d 61 6b 65 20 73 75 72  help to make sur
15030 65 20 74 68 61 74 20 61 6c 6c 20 74 68 65 0d 0a  e that all the..
15040 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
15050 20 20 20 20 6c 65 67 61 63 79 20 74 65 73 74 73      legacy tests
15060 20 72 75 6e 20 77 69 74 68 20 65 78 61 63 74 6c   run with exactl
15070 79 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  y the same set o
15080 66 20 4d 61 6e 61 67 65 64 0d 0a 20 20 20 20 20  f Managed..     
15090 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 44         #       D
150a0 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74 61  ebugging Assista
150b0 6e 74 73 20 63 6f 6e 66 69 67 75 72 65 64 2e 0d  nts configured..
150c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
150d0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
150e0 61 63 68 20 6d 64 61 43 6f 6e 66 69 67 46 69 6c  ach mdaConfigFil
150f0 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66 69 67  eName $mdaConfig
15100 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
15110 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
15120 70 79 42 69 6e 61 72 79 46 69 6c 65 20 45 61 67  pyBinaryFile Eag
15130 6c 65 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e  leShell.exe.mda.
15140 63 6f 6e 66 69 67 20 22 22 20 24 6d 64 61 43 6f  config "" $mdaCo
15150 6e 66 69 67 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  nfigFileName..  
15160 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
15170 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15180 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63    }....        c
15190 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
151a0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
151b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
151c0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
151d0 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
151e0 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 73 71 6c  version of \"sql
151f0 69 74 65 33 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20  ite3.dll\"... " 
15200 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
15210 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b   [file version [
15220 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d  getBinaryFileNam
15230 65 20 73 71 6c 69 74 65 33 2e 64 6c 6c 5d 5d 20  e sqlite3.dll]] 
15240 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
15250 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63 68 20  ..        catch 
15260 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
15270 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
15280 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
15290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
152a0 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69  "---- file versi
152b0 6f 6e 20 6f 66 20 5c 22 53 51 4c 69 74 65 2e 49  on of \"SQLite.I
152c0 6e 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20  nterop.dll\"... 
152d0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
152e0 20 20 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e     [file version
152f0 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e   [getBinaryFileN
15300 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65 72  ame SQLite.Inter
15310 6f 70 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20  op.dll]] \n]..  
15320 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15330 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
15340 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15350 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
15360 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
15370 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
15380 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
15390 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
153a0 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 20 5c  ite.dll\"... " \
153b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
153c0 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5b 67  [file version [g
153d0 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  etBinaryFileName
153e0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
153f0 69 74 65 2e 64 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20  ite.dll]] \n].. 
15400 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
15410 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
15420 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15430 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15440 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15450 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
15460 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
15470 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  \"System.Data.SQ
15480 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 5c 22 2e  Lite.Linq.dll\".
15490 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  .. " \..        
154a0 20 20 20 20 20 20 5b 66 69 6c 65 20 76 65 72 73        [file vers
154b0 69 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ion [getBinaryFi
154c0 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
154d0 74 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64  ta.SQLite.Linq.d
154e0 6c 6c 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ll]] \n]..      
154f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69    }....        i
15500 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15510 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
15520 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15530 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
15540 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15550 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
15560 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
15580 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
15590 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72   of \"" $platfor
155a0 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
155b0 20 20 20 20 20 22 2f 73 71 6c 69 74 65 33 2e 64       "/sqlite3.d
155c0 6c 6c 5c 22 2e 2e 2e 20 22 20 5b 66 69 6c 65 20  ll\"... " [file 
155d0 76 65 72 73 69 6f 6e 20 5c 0d 0a 20 20 20 20 20  version \..     
155e0 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74 42             [getB
155f0 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 73 71  inaryFileName sq
15600 6c 69 74 65 33 2e 64 6c 6c 20 24 70 6c 61 74 66  lite3.dll $platf
15610 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  orm]] \n]..     
15620 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
15630 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
15640 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
15650 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
15660 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
15680 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
15690 20 6f 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72   of \"" $platfor
156a0 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  m \..           
156b0 20 20 20 20 20 22 2f 53 51 4c 69 74 65 2e 49 6e       "/SQLite.In
156c0 74 65 72 6f 70 2e 64 6c 6c 5c 22 2e 2e 2e 20 22  terop.dll\"... "
156d0 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 5c   [file version \
156e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
156f0 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65    [getBinaryFile
15700 4e 61 6d 65 20 53 51 4c 69 74 65 2e 49 6e 74 65  Name SQLite.Inte
15710 72 6f 70 2e 64 6c 6c 20 24 70 6c 61 74 66 6f 72  rop.dll $platfor
15720 6d 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  m]] \n]..       
15730 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15740 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20    catch {..     
15750 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
15760 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
15770 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
15780 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
15790 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f  - file version o
157a0 66 20 5c 22 22 20 24 70 6c 61 74 66 6f 72 6d 20  f \"" $platform 
157b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
157c0 20 20 20 22 2f 53 79 73 74 65 6d 2e 44 61 74 61     "/System.Data
157d0 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e  .SQLite.dll\"...
157e0 20 22 20 5b 66 69 6c 65 20 76 65 72 73 69 6f 6e   " [file version
157f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
15800 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 46 69      [getBinaryFi
15810 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61  leName System.Da
15820 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
15830 6c 61 74 66 6f 72 6d 5d 5d 20 5c 6e 5d 0d 0a 20  latform]] \n].. 
15840 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
15850 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
15860 20 73 65 74 20 61 73 73 65 6d 62 6c 69 65 73 20   set assemblies 
15870 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 41  [object invoke A
15880 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65 6e 74  ppDomain.Current
15890 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65 6d 62  Domain GetAssemb
158a0 6c 69 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  lies]....       
158b0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
158c0 61 73 73 65 6d 62 6c 79 20 24 61 73 73 65 6d 62  assembly $assemb
158d0 6c 69 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  lies {..        
158e0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
158f0 74 63 68 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74  tch \{System.Dat
15900 61 2e 53 51 4c 69 74 65 2a 20 24 61 73 73 65 6d  a.SQLite* $assem
15910 62 6c 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  bly]} then {..  
15920 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15930 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
15940 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15960 2d 2d 2d 2d 20 66 6f 75 6e 64 20 61 73 73 65 6d  ---- found assem
15970 62 6c 79 3a 20 22 20 24 61 73 73 65 6d 62 6c 79  bly: " $assembly
15980 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
15990 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
159a0 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
159b0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
159c0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
159d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
159e0 20 20 22 2d 2d 2d 2d 20 64 65 66 69 6e 65 20 63    "---- define c
159f0 6f 6e 73 74 61 6e 74 73 20 66 6f 72 20 5c 22 53  onstants for \"S
15a00 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
15a10 65 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  e\"... "....    
15a20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
15a30 20 7b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   {object invoke 
15a40 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
15a50 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
15a60 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
15a70 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
15a80 33 20 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  3 DefineConstant
15a90 73 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  s} \..          
15aa0 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 43 6f          defineCo
15ab0 6e 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74  nstants] == 0} t
15ac0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15ad0 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
15ae0 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
15af0 41 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74  Args [formatList
15b00 20 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20   [lsort \..     
15b10 20 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69             $defi
15b20 6e 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f  neConstants] <no
15b30 6e 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ne>] \n]..      
15b40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
15b50 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
15b60 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
15b70 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20  unknown\n..     
15b80 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
15b90 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74  }....        cat
15ba0 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
15bb0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15bc0 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
15bd0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75         "---- sou
15be0 72 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  rce version of \
15bf0 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c  "System.Data.SQL
15c00 69 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a  ite.dll\"... "..
15c10 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
15c20 5b 63 61 74 63 68 20 7b 6f 62 6a 65 63 74 20 69  [catch {object i
15c30 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
15c40 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
15c60 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
15c70 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
15c80 20 50 72 6f 76 69 64 65 72 56 65 72 73 69 6f 6e   ProviderVersion
15c90 7d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  } \..           
15ca0 20 20 20 20 20 20 20 76 65 72 73 69 6f 6e 5d 20         version] 
15cb0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
15cc0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73            if {[s
15cd0 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 65  tring length $ve
15ce0 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74 68 65  rsion] == 0} the
15cf0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
15d00 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20 6e     set version n
15d10 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
15d20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15d30 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15d40 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
15d50 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d 0d 0a  s $version \n]..
15d60 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
15d70 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15d80 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
15d90 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d  annel unknown\n.
15da0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
15db0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15dc0 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
15dd0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
15de0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
15e00 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63 6b 6f  -- source checko
15e10 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d 2e 44  ut of \"System.D
15e20 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5c 22  ata.SQLite.dll\"
15e30 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ... "....       
15e40 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 6f     if {[catch {o
15e50 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
15e60 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
15e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15e80 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
15e90 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e  SQLite.SQLiteCon
15ea0 6e 65 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72  nection Provider
15eb0 53 6f 75 72 63 65 49 64 7d 20 5c 0d 0a 20 20 20  SourceId} \..   
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15ed0 6f 75 72 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74  ourceId] == 0} t
15ee0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
15ef0 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
15f00 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d  ength $sourceId]
15f10 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
15f30 20 73 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a   sourceId null..
15f40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
15f50 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
15f60 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
15f70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 73 6f   [appendArgs $so
15f80 75 72 63 65 49 64 20 5c 6e 5d 0d 0a 20 20 20 20  urceId \n]..    
15f90 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
15fb0 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
15fc0 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20  l unknown\n..   
15fd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
15fe0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
15ff0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16000 3a 20 43 68 65 63 6b 20 74 68 65 20 61 76 61 69  : Check the avai
16010 6c 61 62 6c 65 20 62 75 69 6c 64 73 20 28 61 6e  lable builds (an
16020 64 20 22 72 65 6c 65 61 73 65 73 22 29 20 6f 66  d "releases") of
16030 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a 20 20 20   SQLite and..   
16040 20 20 20 20 20 23 20 20 20 20 20 20 20 53 79 73       #       Sys
16050 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
16060 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16070 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
16080 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
16090 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20  t_channel..     
160a0 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
160b0 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74 65 73  eReleases $::tes
160c0 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
160d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
160e0 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 77 65 20  # NOTE: Now, we 
160f0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 66 20  need to know if 
16100 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20  the SQLite core 
16110 6c 69 62 72 61 72 79 20 69 73 20 61 76 61 69 6c  library is avail
16120 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  able..        # 
16130 20 20 20 20 20 20 28 69 2e 65 2e 20 62 65 63 61        (i.e. beca
16140 75 73 65 20 74 68 65 20 6d 61 6e 61 67 65 64 2d  use the managed-
16150 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61  only System.Data
16160 2e 53 51 4c 69 74 65 20 61 73 73 65 6d 62 6c 79  .SQLite assembly
16170 20 63 61 6e 0d 0a 20 20 20 20 20 20 20 20 23 20   can..        # 
16180 20 20 20 20 20 20 6c 6f 61 64 20 77 69 74 68 6f        load witho
16190 75 74 20 69 74 3b 20 68 6f 77 65 76 65 72 2c 20  ut it; however, 
161a0 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20 61 6e 79  it cannot do any
161b0 74 68 69 6e 67 20 75 73 65 66 75 6c 20 77 69 74  thing useful wit
161c0 68 6f 75 74 0d 0a 20 20 20 20 20 20 20 20 23 20  hout..        # 
161d0 20 20 20 20 20 20 69 74 29 2e 20 20 49 66 20 77        it).  If w
161e0 65 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  e are using the 
161f0 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d  mixed-mode assem
16200 62 6c 79 20 61 6e 64 20 77 65 20 61 6c 72 65 61  bly and we alrea
16210 64 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  dy..        #   
16220 20 20 20 20 66 6f 75 6e 64 20 69 74 20 28 61 62      found it (ab
16230 6f 76 65 29 2c 20 74 68 69 73 20 73 68 6f 75 6c  ove), this shoul
16240 64 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  d always succeed
16250 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
16260 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
16270 4c 69 74 65 4c 69 62 72 61 72 79 20 24 3a 3a 74  LiteLibrary $::t
16280 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20  est_channel.... 
16290 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
162a0 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
162b0 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e  if the SQLite in
162c0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 69  terop assembly i
162d0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
162e0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
162f0 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 49   checkForSQLiteI
16300 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73 74 5f 63  nterop $::test_c
16310 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20  hannel....      
16320 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
16330 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 53  OTE: Check the S
16340 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 61  QLite database a
16350 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  nd temporary dir
16360 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20 20 20 20  ectories...     
16370 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
16380 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
16390 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
163a0 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20  channel....     
163b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
163c0 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
163d0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 76 61   determine if va
163e0 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65 2d 74 69  rious compile-ti
163f0 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65 65 64 65  me options neede
16400 64 20 66 6f 72 0d 0a 20 20 20 20 20 20 20 20 23  d for..        #
16410 20 20 20 20 20 20 20 74 65 73 74 20 63 6f 6e 73         test cons
16420 74 72 61 69 6e 74 73 20 77 65 72 65 20 65 6e 61  traints were ena
16430 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
16440 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 20 20  aged assembly.  
16450 54 68 65 72 65 0d 0a 20 20 20 20 20 20 20 20 23  There..        #
16460 20 20 20 20 20 20 20 61 72 65 20 73 6f 6d 65 20         are some 
16470 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
16480 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 61  ions that must a
16490 6c 73 6f 20 68 61 76 65 20 62 65 65 6e 20 65 6e  lso have been en
164a0 61 62 6c 65 64 0d 0a 20 20 20 20 20 20 20 20 23  abled..        #
164b0 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 69         for the i
164c0 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
164d0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 65  in order to be e
164e0 66 66 65 63 74 69 76 65 2e 20 20 46 6f 72 20 74  ffective.  For t
164f0 68 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20  hose..        # 
16500 20 20 20 20 20 20 6f 70 74 69 6f 6e 73 2c 20 69        options, i
16510 74 20 77 69 6c 6c 20 62 65 20 61 73 73 75 6d 65  t will be assume
16520 64 20 74 68 61 74 20 69 74 20 77 61 73 20 65 6e  d that it was en
16530 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20 69 6e  abled for the in
16540 74 65 72 6f 70 0d 0a 20 20 20 20 20 20 20 20 23  terop..        #
16550 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20         assembly 
16560 69 66 20 69 74 20 77 61 73 20 65 6e 61 62 6c 65  if it was enable
16570 64 20 66 6f 72 20 74 68 65 20 6d 61 6e 61 67 65  d for the manage
16580 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20  d assembly...   
16590 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
165a0 66 6f 72 65 61 63 68 20 64 65 66 69 6e 65 43 6f  foreach defineCo
165b0 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20 5c 0d 0a  nstant [list \..
165c0 20 20 20 20 20 20 20 20 20 20 20 20 43 48 45 43              CHEC
165d0 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54 5f 48 41  K_STATE COUNT_HA
165e0 4e 44 4c 45 20 44 45 42 55 47 20 49 4e 54 45 52  NDLE DEBUG INTER
165f0 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45 52 4f 50  OP_CODEC INTEROP
16600 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20 20 20 20  _DEBUG \..      
16610 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 45 58        INTEROP_EX
16620 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  TENSION_FUNCTION
16630 53 20 49 4e 54 45 52 4f 50 5f 4c 45 47 41 43 59  S INTEROP_LEGACY
16640 5f 43 4c 4f 53 45 20 49 4e 54 45 52 4f 50 5f 4c  _CLOSE INTEROP_L
16650 4f 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  OG \..          
16660 20 20 49 4e 54 45 52 4f 50 5f 54 45 53 54 5f 45    INTEROP_TEST_E
16670 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52 4f 50  XTENSION INTEROP
16680 5f 56 49 52 54 55 41 4c 5f 54 41 42 4c 45 20 4e  _VIRTUAL_TABLE N
16690 45 54 5f 32 30 20 4e 45 54 5f 33 35 20 5c 0d 0a  ET_20 NET_35 \..
166a0 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
166b0 34 30 20 4e 45 54 5f 34 35 20 4e 45 54 5f 34 35  40 NET_45 NET_45
166c0 31 20 4e 45 54 5f 43 4f 4d 50 41 43 54 5f 32 30  1 NET_COMPACT_20
166d0 20 50 4c 41 54 46 4f 52 4d 5f 43 4f 4d 50 41 43   PLATFORM_COMPAC
166e0 54 46 52 41 4d 45 57 4f 52 4b 20 5c 0d 0a 20 20  TFRAMEWORK \..  
166f0 20 20 20 20 20 20 20 20 20 20 50 52 45 4c 4f 41            PRELOA
16700 44 5f 4e 41 54 49 56 45 5f 4c 49 42 52 41 52 59  D_NATIVE_LIBRARY
16710 20 52 45 54 41 52 47 45 54 41 42 4c 45 20 53 51   RETARGETABLE SQ
16720 4c 49 54 45 5f 53 54 41 4e 44 41 52 44 20 5c 0d  LITE_STANDARD \.
16730 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 48 52  .            THR
16740 4f 57 5f 4f 4e 5f 44 49 53 50 4f 53 45 44 20 54  OW_ON_DISPOSED T
16750 52 41 43 45 20 54 52 41 43 45 5f 43 4f 4e 4e 45  RACE TRACE_CONNE
16760 43 54 49 4f 4e 20 54 52 41 43 45 5f 48 41 4e 44  CTION TRACE_HAND
16770 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
16780 20 20 54 52 41 43 45 5f 50 52 45 4c 4f 41 44 20    TRACE_PRELOAD 
16790 54 52 41 43 45 5f 53 48 41 52 45 44 20 54 52 41  TRACE_SHARED TRA
167a0 43 45 5f 53 54 41 54 45 4d 45 4e 54 20 54 52 41  CE_STATEMENT TRA
167b0 43 45 5f 57 41 52 4e 49 4e 47 20 5c 0d 0a 20 20  CE_WARNING \..  
167c0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 4b 5f            TRACK_
167d0 4d 45 4d 4f 52 59 5f 42 59 54 45 53 20 55 53 45  MEMORY_BYTES USE
167e0 5f 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45  _INTEROP_DLL USE
167f0 5f 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44  _PREPARE_V2 WIND
16800 4f 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20  OWS] {..        
16810 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
16820 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
16830 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  the compile-time
16840 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65   option is liste
16850 64 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  d in the list of
16860 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
16870 20 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73      "define cons
16880 74 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63  tants" kept trac
16890 6b 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61  k of by the mana
168a0 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ged assembly... 
168b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
168c0 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
168d0 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61  LiteDefineConsta
168e0 6e 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  nt $::test_chann
168f0 65 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  el $defineConsta
16900 6e 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  nt..        }...
16910 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
16920 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
16930 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
16940 69 6c 64 20 79 65 61 72 2e 20 20 42 61 73 69 63  ild year.  Basic
16950 61 6c 6c 79 2c 20 74 68 69 73 20 69 6e 64 69 63  ally, this indic
16960 61 74 65 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ates..        # 
16970 20 20 20 20 20 20 77 68 69 63 68 20 76 65 72 73        which vers
16980 69 6f 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61  ion of MSBuild a
16990 6e 64 2f 6f 72 20 56 69 73 75 61 6c 20 53 74 75  nd/or Visual Stu
169a0 64 69 6f 20 77 61 73 20 75 73 65 64 20 74 6f 0d  dio was used to.
169b0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
169c0 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 61 73 73   compile the ass
169d0 65 6d 62 6c 79 20 62 69 6e 61 72 69 65 73 20 75  embly binaries u
169e0 6e 64 65 72 20 74 65 73 74 2e 0d 0a 20 20 20 20  nder test...    
169f0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 74      #..        t
16a00 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
16a10 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
16a20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
16a30 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
16a40 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
16a50 79 65 61 72 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  year... "....   
16a60 20 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67       set year [g
16a70 65 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20  etBuildYear]..  
16a80 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
16a90 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
16aa0 62 75 69 6c 64 59 65 61 72 2e 20 24 79 65 61 72  buildYear. $year
16ab0 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  ]..        tputs
16ac0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
16ad0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20   [appendArgs \" 
16ae0 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 0d 0a 20  $year \"\n].... 
16af0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
16b00 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
16b10 74 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c  the current buil
16b20 64 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  d configuration.
16b30 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f    This should no
16b40 72 6d 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20  rmally..        
16b50 23 20 20 20 20 20 20 20 62 65 20 65 69 74 68 65  #       be eithe
16b60 72 20 22 44 65 62 75 67 22 20 6f 72 20 22 52 65  r "Debug" or "Re
16b70 6c 65 61 73 65 22 2e 0d 0a 20 20 20 20 20 20 20  lease"...       
16b80 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
16b90 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
16ba0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
16bb0 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20   "---- checking 
16bc0 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  for System.Data.
16bd0 53 51 4c 69 74 65 20 62 75 69 6c 64 20 63 6f 6e  SQLite build con
16be0 66 69 67 75 72 61 74 69 6f 6e 2e 2e 2e 20 22 0d  figuration... ".
16bf0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
16c00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65  onfiguration [ge
16c10 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74  tBuildConfigurat
16c20 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 61 64  ion]..        ad
16c30 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
16c40 65 6e 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e  endArgs buildCon
16c50 66 69 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e  figuration. $con
16c60 66 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20  figuration]..   
16c70 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
16c80 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
16c90 6e 64 41 72 67 73 20 5c 22 20 24 63 6f 6e 66 69  ndArgs \" $confi
16ca0 67 75 72 61 74 69 6f 6e 20 5c 22 5c 6e 5d 0d 0a  guration \"\n]..
16cb0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16cc0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 72 79       # NOTE: Try
16cd0 20 74 6f 20 73 65 74 75 70 20 61 6e 20 69 6e 74   to setup an int
16ce0 65 72 72 75 70 74 20 63 61 6c 6c 62 61 63 6b 20  errupt callback 
16cf0 75 73 69 6e 67 20 74 68 65 20 73 63 72 69 70 74  using the script
16d00 20 64 65 62 75 67 67 65 72 0d 0a 20 20 20 20 20   debugger..     
16d10 20 20 20 23 20 20 20 20 20 20 20 74 68 61 74 20     #       that 
16d20 77 69 6c 6c 20 63 61 6e 63 65 6c 20 61 6c 6c 20  will cancel all 
16d30 53 51 4c 20 71 75 65 72 69 65 73 20 69 6e 20 70  SQL queries in p
16d40 72 6f 67 72 65 73 73 20 66 6f 72 20 61 6c 6c 20  rogress for all 
16d50 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
16d60 20 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63    #       connec
16d70 74 69 6f 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74  tions known to t
16d80 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2e  his interpreter.
16d90 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
16da0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
16db0 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69  exists ::no(sqli
16dc0 74 65 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  teInterruptCallb
16dd0 61 63 6b 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ack)]} then {.. 
16de0 20 20 20 20 20 20 20 20 20 73 65 74 75 70 44 62           setupDb
16df0 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62 61 63  InterruptCallbac
16e00 6b 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  k $::test_channe
16e10 6c 20 24 3a 3a 74 65 73 74 5f 6c 6f 67 0d 0a 20  l $::test_log.. 
16e20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16e30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
16e40 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 66 6f 72   NOTE: Check for
16e50 20 74 68 65 20 6e 61 74 69 76 65 20 72 75 6e 74   the native runt
16e60 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 77 68 69 63  ime option, whic
16e70 68 20 77 6f 75 6c 64 20 6d 65 61 6e 20 77 65 20  h would mean we 
16e80 61 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  are..        #  
16e90 20 20 20 20 20 75 73 69 6e 67 20 74 68 65 20 6d       using the m
16ea0 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62  ixed-mode assemb
16eb0 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ly...        #..
16ec0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
16ed0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a  RuntimeOption $:
16ee0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 6e 61  :test_channel na
16ef0 74 69 76 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  tive....        
16f00 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
16f10 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  E: Check if the 
16f20 74 65 73 74 20 73 75 69 74 65 20 73 68 6f 75 6c  test suite shoul
16f30 64 20 63 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  d count the numb
16f40 65 72 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  er of connection
16f50 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
16f60 20 20 20 22 6f 70 65 6e 65 64 22 20 61 6e 64 20     "opened" and 
16f70 22 63 6c 6f 73 65 64 22 20 66 72 6f 6d 20 74 68  "closed" from th
16f80 65 20 70 6f 6f 6c 20 77 68 65 6e 20 64 65 74 65  e pool when dete
16f90 72 6d 69 6e 69 6e 67 20 69 66 20 61 20 74 65 73  rmining if a tes
16fa0 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  t..        #    
16fb0 20 20 20 70 61 73 73 65 64 2e 20 20 44 69 73 61     passed.  Disa
16fc0 62 6c 69 6e 67 20 74 68 69 73 20 62 65 68 61 76  bling this behav
16fd0 69 6f 72 20 69 73 20 73 6f 6d 65 74 69 6d 65 73  ior is sometimes
16fe0 20 6e 65 63 65 73 73 61 72 79 20 28 65 2e 67 2e   necessary (e.g.
16ff0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
17000 20 20 64 75 72 69 6e 67 20 74 68 65 20 72 65 6c    during the rel
17010 65 61 73 65 20 74 65 73 74 69 6e 67 20 70 72 6f  ease testing pro
17020 63 65 73 73 29 20 62 65 63 61 75 73 65 20 74 68  cess) because th
17030 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 0d  ere are several.
17040 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
17050 20 74 65 73 74 73 20 74 68 61 74 20 72 65 6c 79   tests that rely
17060 20 6f 6e 20 74 68 65 20 22 6f 70 65 6e 65 64 20   on the "opened 
17070 66 72 6f 6d 20 70 6f 6f 6c 22 20 63 6f 75 6e 74  from pool" count
17080 20 62 65 69 6e 67 20 67 72 65 61 74 65 72 0d 0a   being greater..
17090 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
170a0 74 68 61 6e 20 7a 65 72 6f 2e 20 20 54 68 65 73  than zero.  Thes
170b0 65 20 74 65 73 74 73 20 6d 61 79 20 66 61 69 6c  e tests may fail
170c0 20 64 75 65 20 74 6f 20 74 68 65 20 6e 6f 6e 2d   due to the non-
170d0 64 65 74 65 72 6d 69 6e 69 73 74 69 63 0d 0a 20  deterministic.. 
170e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62         #       b
170f0 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 43  ehavior of the C
17100 4c 52 20 47 43 2c 20 65 76 65 6e 20 77 68 65 6e  LR GC, even when
17110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 67   there is no bug
17120 20 69 6e 20 74 68 65 20 63 6f 64 65 0d 0a 20 20   in the code..  
17130 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
17140 69 6e 67 20 74 65 73 74 65 64 2e 0d 0a 20 20 20  ing tested...   
17150 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
17160 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d 65 4f  checkForRuntimeO
17170 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f 63 68  ption $::test_ch
17180 61 6e 6e 65 6c 20 6e 6f 50 6f 6f 6c 43 6f 75 6e  annel noPoolCoun
17190 74 73 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  ts....        #.
171a0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
171b0 20 52 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f   Report the reso
171c0 75 72 63 65 20 75 73 61 67 65 20 70 72 69 6f 72  urce usage prior
171d0 20 74 6f 20 72 75 6e 6e 69 6e 67 20 61 6e 79 20   to running any 
171e0 74 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20  tests...        
171f0 23 0d 0a 20 20 20 20 20 20 20 20 72 65 70 6f 72  #..        repor
17200 74 53 51 4c 69 74 65 52 65 73 6f 75 72 63 65 73  tSQLiteResources
17210 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
17220 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
17230 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
17240 68 6f 77 20 74 68 65 20 61 63 74 69 76 65 20 74  how the active t
17250 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  est constraints.
17260 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17270 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
17280 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
17290 6e 64 41 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e  ndArgs "---- con
172a0 73 74 72 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20  straints: " \.. 
172b0 20 20 20 20 20 20 20 20 20 20 20 5b 66 6f 72 6d             [form
172c0 61 74 4c 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67  atList [lsort [g
172d0 65 74 43 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20  etConstraints]] 
172e0 3c 6e 6f 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20  <none>] \n].... 
172f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17300 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
17310 68 65 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69  he test constrai
17320 6e 74 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  nts for use by t
17330 68 72 65 61 64 73 20 63 72 65 61 74 65 64 20 69  hreads created i
17340 6e 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20 20  n this..        
17350 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61 74  #       applicat
17360 69 6f 6e 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69  ion domain.  Thi
17370 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62  s is necessary b
17380 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 45  ecause all the E
17390 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20  agle..        # 
173a0 20 20 20 20 20 20 22 74 65 73 74 20 63 6f 6e 74        "test cont
173b0 65 78 74 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ext" information
173c0 20 69 73 20 70 65 72 2d 74 68 72 65 61 64 2e 0d   is per-thread..
173d0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
173e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
173f0 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e  xists ::test_con
17400 73 74 72 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20  straints]} then 
17410 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
17420 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72 61 69   ::test_constrai
17430 6e 74 73 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73  nts $::eagle_tes
17440 74 73 28 63 6f 6e 73 74 72 61 69 6e 74 73 29 0d  ts(constraints).
17450 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
17460 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17470 20 23 20 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68   # NOTE: Load th
17480 65 20 22 61 66 74 65 72 2d 63 6f 6e 73 74 72 61  e "after-constra
17490 69 6e 74 73 22 20 63 75 73 74 6f 6d 20 70 65 72  ints" custom per
174a0 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72  -user and/or per
174b0 2d 68 6f 73 74 0d 0a 20 20 20 20 20 20 20 20 23  -host..        #
174c0 20 20 20 20 20 20 20 74 65 73 74 20 73 65 74 74         test sett
174d0 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20  ings now...     
174e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75 70     #..        up
174f0 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f  level 1 [list lo
17500 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74  adSQLiteTestSett
17510 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  ings $::test_cha
17520 6e 6e 65 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a  nnel .after]....
17530 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
17540 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
17550 77 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61  when our tests a
17560 63 74 75 61 6c 6c 79 20 62 65 67 61 6e 20 28 6e  ctually began (n
17570 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ow)...        #.
17580 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
17590 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
175a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
175b0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
175c0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
175d0 74 65 20 74 65 73 74 73 20 62 65 67 61 6e 20 61  te tests began a
175e0 74 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  t " \..         
175f0 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74     [clock format
17600 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d   [clock seconds]
17610 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ] \n]..      }..
17620 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
17630 6f 63 20 72 75 6e 53 51 4c 69 74 65 54 65 73 74  oc runSQLiteTest
17640 45 70 69 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20  Epilogue {} {.. 
17650 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
17660 4e 4f 54 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69  NOTE: Skip runni
17670 6e 67 20 6f 75 72 20 63 75 73 74 6f 6d 20 65 70  ng our custom ep
17680 69 6c 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61  ilogue if the ma
17690 69 6e 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d  in one has been.
176a0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73  .      #       s
176b0 6b 69 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23  kipped...      #
176c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e  ..      if {![in
176d0 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65  fo exists ::no(e
176e0 70 69 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d  pilogue.eagle)]}
176f0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17700 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
17710 54 45 3a 20 53 68 6f 77 20 77 68 65 6e 20 6f 75  TE: Show when ou
17720 72 20 74 65 73 74 73 20 61 63 74 75 61 6c 6c 79  r tests actually
17730 20 65 6e 64 65 64 20 28 6e 6f 77 29 2e 0d 0a 20   ended (now)... 
17740 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
17750 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
17760 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
17770 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
17780 20 20 20 22 2d 2d 2d 2d 20 53 79 73 74 65 6d 2e     "---- System.
17790 44 61 74 61 2e 53 51 4c 69 74 65 20 74 65 73 74  Data.SQLite test
177a0 73 20 65 6e 64 65 64 20 61 74 20 22 20 5c 0d 0a  s ended at " \..
177b0 20 20 20 20 20 20 20 20 20 20 20 20 5b 63 6c 6f              [clo
177c0 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c 6f 63 6b  ck format [clock
177d0 20 73 65 63 6f 6e 64 73 5d 5d 20 5c 6e 5d 0d 0a   seconds]] \n]..
177e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
177f0 20 20 20 20 20 23 20 42 55 47 46 49 58 3a 20 42       # BUGFIX: B
17800 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67 20 74  efore checking t
17810 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75 72 63  he final resourc
17820 65 73 20 69 6e 20 75 73 65 20 62 79 20 53 51 4c  es in use by SQL
17830 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20 20 20  ite, make..     
17840 20 20 20 23 20 20 20 20 20 20 20 20 20 73 75 72     #         sur
17850 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20 50 52  e both of the PR
17860 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64 69 72  AGMA related dir
17870 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61 72 65  ectory names are
17880 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20 20 20   freed...       
17890 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63   #..        chec
178a0 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65 63 74  kForSQLiteDirect
178b0 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f 63 68  ories $::test_ch
178c0 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a 20 20  annel true....  
178d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
178e0 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20 72 65   # NOTE: Also re
178f0 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75 72 63  port the resourc
17900 65 20 75 73 61 67 65 20 61 66 74 65 72 20 72 75  e usage after ru
17910 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74 73 2e  nning the tests.
17920 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
17930 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c 69 74       reportSQLit
17940 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a 74 65  eResources $::te
17950 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
17960 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17970 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72 74 20   # NOTE: Report 
17980 74 68 65 20 63 72 69 74 69 63 61 6c 20 68 61 6e  the critical han
17990 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74 65 72  dle counts after
179a0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73   running the tes
179b0 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ts...        #..
179c0 20 20 20 20 20 20 20 20 67 65 74 53 51 4c 69 74          getSQLit
179d0 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20 24 3a  eHandleCounts $:
179e0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20  :test_channel.. 
179f0 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
17a00 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
17a10 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17a20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17a30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17a40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17a50 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
17a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17a70 23 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f  #### END Eagle O
17a80 4e 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23  NLY ############
17a90 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17aa0 23 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23  ##..    ########
17ab0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17ac0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17ad0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17ae0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
17af0 23 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d  ###..  }....  #.
17b00 0a 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20  .  # NOTE: Save 
17b10 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17b20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
17b30 6e 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d  ning this file..
17b40 0a 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e  .  #..  if {![in
17b50 66 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e  fo exists common
17b60 5f 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  _directory]} the
17b70 6e 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d  n {..    set com
17b80 6d 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66  mon_directory [f
17b90 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66  ile dirname [inf
17ba0 6f 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d  o script]]..  }.
17bb0 0a 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45  ...  #..  # NOTE
17bc0 3a 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79  : Provide the Sy
17bd0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
17be0 20 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f   test package to
17bf0 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
17c00 2e 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67  ...  #..  packag
17c10 65 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d  e provide System
17c20 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73  .Data.SQLite.Tes
17c30 74 20 31 2e 30 0d 0a 7d 0d 0a                    t 1.0..}..