System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 57166862b112ba8f3abafa1d2b4dcbc556a68a8c:


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 69  ##....    proc i
0330: 73 4e 65 74 46 78 34 30 20 7b 7d 20 7b 0d 0a 20  sNetFx40 {} {.. 
0340: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
0350: 65 78 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 70  exists ::eagle_p
0360: 6c 61 74 66 6f 72 6d 28 66 72 61 6d 65 77 6f 72  latform(framewor
0370: 6b 56 65 72 73 69 6f 6e 29 5d 7d 20 74 68 65 6e  kVersion)]} then
0380: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
0390: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
03a0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 76  }....      set v
03b0: 65 72 73 69 6f 6e 20 34 2e 30 2e 33 30 33 31 39  ersion 4.0.30319
03c0: 2e 34 32 30 30 30 3b 20 23 20 2e 4e 45 54 20 46  .42000; # .NET F
03d0: 72 61 6d 65 77 6f 72 6b 20 34 2e 30 20 52 54 4d  ramework 4.0 RTM
03e0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 70  ....      if {[p
03f0: 61 63 6b 61 67 65 20 76 63 6f 6d 70 61 72 65 20  ackage vcompare 
0400: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 3a 3a  \..          $::
0410: 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d 28 66  eagle_platform(f
0420: 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29  rameworkVersion)
0430: 20 24 76 65 72 73 69 6f 6e 5d 20 3e 3d 20 30 7d   $version] >= 0}
0440: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0450: 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
0460: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
0470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
0480: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  se..      }..   
0490: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
04a0: 67 65 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43  getSQLiteDefineC
04b0: 6f 6e 73 74 61 6e 74 50 72 65 66 69 78 20 7b 7d  onstantPrefix {}
04c0: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
04d0: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
04e0: 66 20 74 68 65 20 64 65 66 69 6e 65 20 63 6f 6e  f the define con
04f0: 73 74 61 6e 74 20 70 72 65 66 69 78 20 73 65 74  stant prefix set
0500: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0510: 65 72 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20  erridden..      
0520: 23 20 20 20 20 20 20 20 62 79 20 74 68 65 20 75  #       by the u
0530: 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65  ser (e.g. on the
0540: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d   command line)..
0550: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
0560: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
0570: 20 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73 74 61   ::define_consta
0580: 6e 74 5f 70 72 65 66 69 78 5d 20 26 26 20 5c 0d  nt_prefix] && \.
0590: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
05a0: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 64 65 66  ng length $::def
05b0: 69 6e 65 5f 63 6f 6e 73 74 61 6e 74 5f 70 72 65  ine_constant_pre
05c0: 66 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  fix] > 0} then {
05d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
05e0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
05f0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
0600: 65 66 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 70  efine constant p
0610: 72 65 66 69 78 2e 0d 0a 20 20 20 20 20 20 20 20  refix...        
0620: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
0630: 6e 20 24 3a 3a 64 65 66 69 6e 65 5f 63 6f 6e 73  n $::define_cons
0640: 74 61 6e 74 5f 70 72 65 66 69 78 0d 0a 20 20 20  tant_prefix..   
0650: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
0660: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
0670: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
0680: 64 65 66 61 75 6c 74 20 64 65 66 69 6e 65 20 63  default define c
0690: 6f 6e 73 74 61 6e 74 20 70 72 65 66 69 78 2e 0d  onstant prefix..
06a0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
06b0: 20 20 20 20 72 65 74 75 72 6e 20 64 65 66 69 6e      return defin
06c0: 65 43 6f 6e 73 74 61 6e 74 2e 53 79 73 74 65 6d  eConstant.System
06d0: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 0d 0a 20  .Data.SQLite... 
06e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
06f0: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 53 51  ..    proc getSQ
0700: 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f  LiteCompileOptio
0710: 6e 50 72 65 66 69 78 20 7b 7d 20 7b 0d 0a 20 20  nPrefix {} {..  
0720: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
0730: 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20  OTE: See if the 
0740: 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 70  compile option p
0750: 72 65 66 69 78 20 73 65 74 74 69 6e 67 20 68 61  refix setting ha
0760: 73 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65  s been overridde
0770: 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
0780: 20 62 79 20 74 68 65 20 75 73 65 72 20 28 65 2e   by the user (e.
0790: 67 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  g. on the comman
07a0: 64 20 6c 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20  d line)...      
07b0: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  #..      if {[in
07c0: 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 6d 70  fo exists ::comp
07d0: 69 6c 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69  ile_option_prefi
07e0: 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  x] && \..       
07f0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
0800: 68 20 24 3a 3a 63 6f 6d 70 69 6c 65 5f 6f 70 74  h $::compile_opt
0810: 69 6f 6e 5f 70 72 65 66 69 78 5d 20 3e 20 30 7d  ion_prefix] > 0}
0820: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
0830: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
0840: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
0850: 69 66 69 65 64 20 63 6f 6d 70 69 6c 65 20 6f 70  ified compile op
0860: 74 69 6f 6e 20 70 72 65 66 69 78 2e 0d 0a 20 20  tion prefix...  
0870: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
0880: 20 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 70 69   return $::compi
0890: 6c 65 5f 6f 70 74 69 6f 6e 5f 70 72 65 66 69 78  le_option_prefix
08a0: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
08b0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
08c0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
08d0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6d   the default com
08e0: 70 69 6c 65 20 6f 70 74 69 6f 6e 20 70 72 65 66  pile option pref
08f0: 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ix...        #..
0900: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
0910: 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 2e 53 51 4c  ompileOption.SQL
0920: 69 74 65 2e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ite...      }.. 
0930: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
0940: 63 20 68 61 76 65 53 51 4c 69 74 65 44 65 66 69  c haveSQLiteDefi
0950: 6e 65 43 6f 6e 73 74 61 6e 74 20 7b 20 6e 61 6d  neConstant { nam
0960: 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65 74  e } {..      ret
0970: 75 72 6e 20 5b 68 61 76 65 43 6f 6e 73 74 72 61  urn [haveConstra
0980: 69 6e 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  int \..         
0990: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65   [appendArgs [ge
09a0: 74 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e  tSQLiteDefineCon
09b0: 73 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61  stantPrefix] $na
09c0: 6d 65 5d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  me]]..    }.....
09d0: 20 20 20 20 70 72 6f 63 20 68 61 76 65 53 51 4c      proc haveSQL
09e0: 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  iteCompileOption
09f0: 20 7b 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20   { name } {..   
0a00: 20 20 20 72 65 74 75 72 6e 20 5b 68 61 76 65 43     return [haveC
0a10: 6f 6e 73 74 72 61 69 6e 74 20 5c 0d 0a 20 20 20  onstraint \..   
0a20: 20 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72         [appendAr
0a30: 67 73 20 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d  gs [getSQLiteCom
0a40: 70 69 6c 65 4f 70 74 69 6f 6e 50 72 65 66 69 78  pileOptionPrefix
0a50: 5d 20 24 6e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ] $name]]..    }
0a60: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
0a70: 74 42 75 69 6c 64 4e 61 74 69 76 65 20 7b 7d 20  tBuildNative {} 
0a80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
0a90: 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20    # NOTE: Check 
0aa0: 69 66 20 77 65 20 61 72 65 20 62 65 69 6e 67 20  if we are being 
0ab0: 66 6f 72 63 65 64 20 74 6f 20 74 72 65 61 74 20  forced to treat 
0ac0: 74 68 69 73 20 61 73 20 61 20 6e 61 74 69 76 65  this as a native
0ad0: 20 62 75 69 6c 64 2e 0d 0a 20 20 20 20 20 20 23   build...      #
0ae0: 20 20 20 20 20 20 20 54 68 69 73 20 69 73 20 6e         This is n
0af0: 6f 72 6d 61 6c 6c 79 20 64 6f 6e 65 20 28 61 75  ormally done (au
0b00: 74 6f 6d 61 74 69 63 61 6c 6c 79 29 20 6f 6e 6c  tomatically) onl
0b10: 79 20 77 68 65 6e 20 74 68 65 20 6d 69 78 65 64  y when the mixed
0b20: 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 23 20 20  -mode..      #  
0b30: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 69 73       assembly is
0b40: 20 69 6e 20 75 73 65 3b 20 68 6f 77 65 76 65 72   in use; however
0b50: 2c 20 69 6e 20 73 6f 6d 65 20 63 69 72 63 75 6d  , in some circum
0b60: 73 74 61 6e 63 65 73 20 69 74 20 69 73 20 75 73  stances it is us
0b70: 65 66 75 6c 0d 0a 20 20 20 20 20 20 23 20 20 20  eful..      #   
0b80: 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 69      to force thi
0b90: 73 20 62 65 68 61 76 69 6f 72 2e 0d 0a 20 20 20  s behavior...   
0ba0: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
0bb0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
0bc0: 65 73 74 5f 6e 61 74 69 76 65 5d 20 26 26 20 5c  est_native] && \
0bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
0be0: 69 6e 67 20 69 73 20 62 6f 6f 6c 65 61 6e 20 2d  ing is boolean -
0bf0: 73 74 72 69 63 74 20 24 3a 3a 74 65 73 74 5f 6e  strict $::test_n
0c00: 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ative]} then {..
0c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
0c20: 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 0d 0a 20  ::test_native.. 
0c30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
0c40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
0c50: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  lse..      }..  
0c60: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
0c70: 20 67 65 74 42 75 69 6c 64 59 65 61 72 20 7b 7d   getBuildYear {}
0c80: 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
0c90: 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69     # NOTE: See i
0ca0: 66 20 74 68 65 20 22 79 65 61 72 22 20 73 65 74  f the "year" set
0cb0: 74 69 6e 67 20 68 61 73 20 62 65 65 6e 20 6f 76  ting has been ov
0cc0: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
0cd0: 75 73 65 72 20 28 65 2e 67 2e 0d 0a 20 20 20 20  user (e.g...    
0ce0: 20 20 23 20 20 20 20 20 20 20 6f 6e 20 74 68 65    #       on the
0cf0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 20   command line). 
0d00: 20 54 68 69 73 20 68 65 6c 70 73 20 63 6f 6e 74   This helps cont
0d10: 72 6f 6c 20 65 78 61 63 74 6c 79 20 77 68 69 63  rol exactly whic
0d20: 68 20 73 65 74 20 6f 66 0d 0a 20 20 20 20 20 20  h set of..      
0d30: 23 20 20 20 20 20 20 20 62 69 6e 61 72 69 65 73  #       binaries
0d40: 20 77 65 20 61 72 65 20 74 65 73 74 69 6e 67 2c   we are testing,
0d50: 20 74 68 6f 73 65 20 70 72 6f 64 75 63 65 64 20   those produced 
0d60: 75 73 69 6e 67 20 74 68 65 20 56 69 73 75 61 6c  using the Visual
0d70: 20 53 74 75 64 69 6f 0d 0a 20 20 20 20 20 20 23   Studio..      #
0d80: 20 20 20 20 20 20 20 32 30 30 35 2c 20 32 30 30         2005, 200
0d90: 38 2c 20 32 30 31 30 2c 20 32 30 31 32 2c 20 32  8, 2010, 2012, 2
0da0: 30 31 33 2c 20 32 30 31 35 2c 20 6f 72 20 32 30  013, 2015, or 20
0db0: 31 37 20 62 75 69 6c 64 20 73 79 73 74 65 6d 73  17 build systems
0dc0: 2e 20 20 54 6f 0d 0a 20 20 20 20 20 20 23 20 20  .  To..      #  
0dd0: 20 20 20 20 20 6f 76 65 72 72 69 64 65 20 74 68       override th
0de0: 69 73 20 76 61 6c 75 65 20 76 69 61 20 74 68 65  is value via the
0df0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 65   command line, e
0e00: 6e 74 65 72 20 61 20 63 6f 6d 6d 61 6e 64 20 73  nter a command s
0e10: 69 6d 69 6c 61 72 0d 0a 20 20 20 20 20 20 23 20  imilar..      # 
0e20: 20 20 20 20 20 20 74 6f 20 6f 6e 65 20 6f 66 20        to one of 
0e30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 28 61  the following (a
0e40: 6c 6c 20 6f 6e 20 6f 6e 65 20 6c 69 6e 65 29 3a  ll on one line):
0e50: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
0e60: 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 53 68   #       EagleSh
0e70: 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74  ell.exe -anyInit
0e80: 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74  ialize "set test
0e90: 5f 79 65 61 72 20 32 30 30 35 22 0d 0a 20 20 20  _year 2005"..   
0ea0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
0eb0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
0ec0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
0ed0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 45  .      #       E
0ee0: 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61  agleShell.exe -a
0ef0: 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65  nyInitialize "se
0f00: 74 20 74 65 73 74 5f 79 65 61 72 20 32 30 30 38  t test_year 2008
0f10: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
0f20: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
0f30: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
0f40: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
0f50: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
0f60: 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69  exe -anyInitiali
0f70: 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79 65 61  ze "set test_yea
0f80: 72 20 32 30 31 30 22 0d 0a 20 20 20 20 20 20 23  r 2010"..      #
0f90: 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65 20 2e           -file .
0fa0: 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67  \path\to\all.eag
0fb0: 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  le..      #..   
0fc0: 20 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65     #       Eagle
0fd0: 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79 49 6e  Shell.exe -anyIn
0fe0: 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20 74 65  itialize "set te
0ff0: 73 74 5f 79 65 61 72 20 32 30 31 32 22 0d 0a 20  st_year 2012".. 
1000: 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 2d       #         -
1010: 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61  file .\path\to\a
1020: 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20  ll.eagle..      
1030: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
1040: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
1050: 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65 20 22  -anyInitialize "
1060: 73 65 74 20 74 65 73 74 5f 79 65 61 72 20 32 30  set test_year 20
1070: 31 33 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20  13"..      #    
1080: 20 20 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74       -file .\pat
1090: 68 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a  h\to\all.eagle..
10a0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
10b0: 20 20 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c         EagleShel
10c0: 6c 2e 65 78 65 20 2d 61 6e 79 49 6e 69 74 69 61  l.exe -anyInitia
10d0: 6c 69 7a 65 20 22 73 65 74 20 74 65 73 74 5f 79  lize "set test_y
10e0: 65 61 72 20 32 30 31 35 22 0d 0a 20 20 20 20 20  ear 2015"..     
10f0: 20 23 20 20 20 20 20 20 20 20 20 2d 66 69 6c 65   #         -file
1100: 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c 2e 65   .\path\to\all.e
1110: 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d 0a 20  agle..      #.. 
1120: 20 20 20 20 20 23 20 20 20 20 20 20 20 45 61 67       #       Eag
1130: 6c 65 53 68 65 6c 6c 2e 65 78 65 20 2d 61 6e 79  leShell.exe -any
1140: 49 6e 69 74 69 61 6c 69 7a 65 20 22 73 65 74 20  Initialize "set 
1150: 74 65 73 74 5f 79 65 61 72 20 32 30 31 37 22 0d  test_year 2017".
1160: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
1170: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
1180: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
1190: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
11a0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
11b0: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
11c0: 20 22 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c   "unset -nocompl
11d0: 61 69 6e 20 74 65 73 74 5f 79 65 61 72 22 0d 0a  ain test_year"..
11e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
11f0: 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c  -file .\path\to\
1200: 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20  all.eagle..     
1210: 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   #..      if {[i
1220: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
1230: 74 5f 79 65 61 72 5d 20 26 26 20 5b 73 74 72 69  t_year] && [stri
1240: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
1250: 74 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74 68 65  t_year] > 0} the
1260: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1270: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1280: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
1290: 64 20 74 65 73 74 20 79 65 61 72 2e 20 20 49 66  d test year.  If
12a0: 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   this variable i
12b0: 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 0d 0a  s not set, the..
12c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
12d0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69  default value wi
12e0: 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e 20 77  ll be based on w
12f0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 45 61  hether or not Ea
1300: 67 6c 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  gle has been..  
1310: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
1320: 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20 74  mpiled against t
1330: 68 65 20 43 4c 52 20 76 32 2e 30 20 6f 72 20 43  he CLR v2.0 or C
1340: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
1350: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
1360: 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65 61 72  urn $::test_year
1370: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1380: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1390: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20       # NOTE: If 
13a0: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
13b0: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
13c0: 74 68 65 20 43 4c 52 20 76 34 2e 30 2c 20 75 73  the CLR v4.0, us
13d0: 65 20 22 32 30 31 30 22 20 62 79 0d 0a 20 20 20  e "2010" by..   
13e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
13f0: 61 75 6c 74 20 28 77 65 20 63 6f 75 6c 64 20 75  ault (we could u
1400: 73 65 20 22 32 30 31 32 22 2c 20 22 32 30 31 33  se "2012", "2013
1410: 22 2c 20 22 32 30 31 35 22 2c 20 6f 72 20 22 32  ", "2015", or "2
1420: 30 31 37 22 20 69 6e 20 74 68 61 74 0d 0a 20 20  017" in that..  
1430: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
1440: 73 65 20 61 73 20 77 65 6c 6c 29 20 61 73 20 74  se as well) as t
1450: 68 65 20 74 65 73 74 20 79 65 61 72 3b 20 6f 74  he test year; ot
1460: 68 65 72 77 69 73 65 2c 20 75 73 65 20 22 32 30  herwise, use "20
1470: 30 38 22 20 62 79 20 64 65 66 61 75 6c 74 0d 0a  08" by default..
1480: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
1490: 28 77 65 20 63 6f 75 6c 64 20 75 73 65 20 22 32  (we could use "2
14a0: 30 30 35 22 20 69 6e 20 74 68 61 74 20 63 61 73  005" in that cas
14b0: 65 20 61 73 20 77 65 6c 6c 29 2e 20 20 49 66 20  e as well).  If 
14c0: 61 6e 6f 74 68 65 72 20 6d 61 6a 6f 72 0d 0a 20  another major.. 
14d0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b         #       [
14e0: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 5d 20 76 65  incompatible] ve
14f0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 43 4c 52  rsion of the CLR
1500: 20 69 73 20 72 65 6c 65 61 73 65 64 2c 20 74 68   is released, th
1510: 69 73 20 63 68 65 63 6b 20 77 69 6c 6c 0d 0a 20  is check will.. 
1520: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 68         #       h
1530: 61 76 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65  ave to be change
1540: 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  d.  The default 
1550: 74 65 73 74 20 79 65 61 72 20 74 6f 20 75 73 65  test year to use
1560: 20 66 6f 72 20 61 0d 0a 20 20 20 20 20 20 20 20   for a..        
1570: 23 20 20 20 20 20 20 20 70 61 72 74 69 63 75 6c  #       particul
1580: 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20 6d  ar CLR version m
1590: 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  ay be overridden
15a0: 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
15b0: 67 6c 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20  global..        
15c0: 23 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65  #       variable
15d0: 20 22 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f   "test_year_clr_
15e0: 76 24 58 22 2c 20 77 68 65 72 65 20 22 24 58 22  v$X", where "$X"
15f0: 20 6d 61 79 20 5b 63 75 72 72 65 6e 74 6c 79 5d   may [currently]
1600: 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
1610: 20 20 20 20 20 65 69 74 68 65 72 20 22 32 22 20       either "2" 
1620: 6f 72 20 22 34 22 2e 0d 0a 20 20 20 20 20 20 20  or "4"...       
1630: 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
1640: 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20  [haveConstraint 
1650: 69 6d 61 67 65 52 75 6e 74 69 6d 65 34 30 5d 7d  imageRuntime40]}
1660: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1670: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1680: 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 5f  sts ::test_year_
1690: 63 6c 72 5f 76 34 5d 20 26 26 20 5c 0d 0a 20 20  clr_v4] && \..  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 73 74 72              [str
16b0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
16c0: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 34 5d 20  st_year_clr_v4] 
16d0: 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
16e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
16f0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1700: 55 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65  Use the specifie
1710: 64 20 74 65 73 74 20 79 65 61 72 20 66 6f 72 20  d test year for 
1720: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20  the CLR v4.0... 
1730: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1740: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1750: 20 24 3a 3a 74 65 73 74 5f 79 65 61 72 5f 63 6c   $::test_year_cl
1760: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
1770: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
1780: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1790: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
17a0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
17b0: 74 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43  t year for the C
17c0: 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v4.0...      
17d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
17e0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 30 31 30       return 2010
17f0: 3b 20 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22  ; # TODO: Good "
1800: 66 61 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c  fallback" defaul
1810: 74 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t?..          }.
1820: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
1830: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
1840: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
1850: 74 65 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32  test_year_clr_v2
1860: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
1870: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1880: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 79 65 61  ngth $::test_yea
1890: 72 5f 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74  r_clr_v2] > 0} t
18a0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
18b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
18c0: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
18d0: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
18e0: 20 79 65 61 72 20 66 6f 72 20 74 68 65 20 43 4c   year for the CL
18f0: 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20 20  R v2.0...       
1900: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1910: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65      return $::te
1920: 73 74 5f 79 65 61 72 5f 63 6c 72 5f 76 32 0d 0a  st_year_clr_v2..
1930: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1940: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1950: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #..            #
1960: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64   NOTE: Use the d
1970: 65 66 61 75 6c 74 20 74 65 73 74 20 79 65 61 72  efault test year
1980: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e   for the CLR v2.
1990: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
19a0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
19b0: 65 74 75 72 6e 20 32 30 30 38 3b 20 23 20 54 4f  eturn 2008; # TO
19c0: 44 4f 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61  DO: Good "fallba
19d0: 63 6b 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20  ck" default?..  
19e0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
19f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20     }..      }.. 
1a00: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1a10: 63 20 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65  c getBuildNative
1a20: 59 65 61 72 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  Year {} {..     
1a30: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1a40: 73 20 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f  s ::test_native_
1a50: 79 65 61 72 5d 20 26 26 20 5c 0d 0a 20 20 20 20  year] && \..    
1a60: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
1a70: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6e 61 74  ngth $::test_nat
1a80: 69 76 65 5f 79 65 61 72 5d 20 3e 20 30 7d 20 74  ive_year] > 0} t
1a90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
1aa0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
1ab0: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
1ac0: 69 65 64 20 74 65 73 74 20 79 65 61 72 20 66 6f  ied test year fo
1ad0: 72 20 6e 61 74 69 76 65 20 62 69 6e 61 72 69 65  r native binarie
1ae0: 73 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  s.  If this..   
1af0: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 72       #       var
1b00: 69 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74  iable is not set
1b10: 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  , the value retu
1b20: 72 6e 65 64 20 62 79 20 5b 67 65 74 42 75 69 6c  rned by [getBuil
1b30: 64 59 65 61 72 5d 0d 0a 20 20 20 20 20 20 20 20  dYear]..        
1b40: 23 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20  #       will be 
1b50: 75 73 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  used...        #
1b60: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
1b70: 20 24 3a 3a 74 65 73 74 5f 6e 61 74 69 76 65 5f   $::test_native_
1b80: 79 65 61 72 0d 0a 20 20 20 20 20 20 7d 20 65 6c  year..      } el
1b90: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1ba0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1bb0: 20 46 61 6c 6c 62 61 63 6b 20 6f 6e 20 74 68 65   Fallback on the
1bc0: 20 28 6e 6f 72 6d 61 6c 29 20 62 75 69 6c 64 20   (normal) build 
1bd0: 79 65 61 72 20 66 6f 72 20 6d 61 6e 61 67 65 64  year for managed
1be0: 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20 20 20 20   binaries...    
1bf0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1c00: 65 74 75 72 6e 20 5b 67 65 74 42 75 69 6c 64 59  eturn [getBuildY
1c10: 65 61 72 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  ear]..      }.. 
1c20: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1c30: 63 20 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65  c getBuildNative
1c40: 59 65 61 72 46 6f 72 44 6f 74 4e 65 74 43 6f 72  YearForDotNetCor
1c50: 65 20 7b 20 79 65 61 72 20 7d 20 7b 0d 0a 20 20  e { year } {..  
1c60: 20 20 20 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65      if {[isDotNe
1c70: 74 43 6f 72 65 5d 20 26 26 20 5b 69 73 57 69 6e  tCore] && [isWin
1c80: 64 6f 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  dows]} then {.. 
1c90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 30         return 20
1ca0: 31 35 3b 20 23 20 48 41 43 4b 3a 20 53 70 65 63  15; # HACK: Spec
1cb0: 69 61 6c 20 63 61 73 65 2c 20 75 73 65 20 32 30  ial case, use 20
1cc0: 31 35 20 6e 61 74 69 76 65 20 62 69 6e 61 72 69  15 native binari
1cd0: 65 73 2e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  es...      } els
1ce0: 65 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e  eif {[string len
1cf0: 67 74 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20  gth $year] > 0} 
1d00: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1d10: 72 65 74 75 72 6e 20 24 79 65 61 72 0d 0a 20 20  return $year..  
1d20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
1d30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65        return [ge
1d40: 74 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72  tBuildNativeYear
1d50: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
1d60: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
1d70: 65 74 42 75 69 6c 64 59 65 61 72 73 20 7b 7d 20  etBuildYears {} 
1d80: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1d90: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
1da0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 74 65 73   the list of tes
1db0: 74 20 79 65 61 72 73 20 68 61 73 20 62 65 65 6e  t years has been
1dc0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
1dd0: 68 65 20 75 73 65 72 0d 0a 20 20 20 20 20 20 23  he user..      #
1de0: 20 20 20 20 20 20 20 28 65 2e 67 2e 20 6f 6e 20         (e.g. on 
1df0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
1e00: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
1e10: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1e20: 73 74 73 20 3a 3a 74 65 73 74 5f 79 65 61 72 73  sts ::test_years
1e30: 5d 20 26 26 20 5b 6c 6c 65 6e 67 74 68 20 24 3a  ] && [llength $:
1e40: 3a 74 65 73 74 5f 79 65 61 72 73 5d 20 3e 20 30  :test_years] > 0
1e50: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1e60: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1e70: 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65  OTE: Use the spe
1e80: 63 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74  cified list of t
1e90: 65 73 74 20 79 65 61 72 73 2e 0d 0a 20 20 20 20  est years...    
1ea0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
1eb0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 79 65  eturn $::test_ye
1ec0: 61 72 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ars..      } els
1ed0: 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f  eif {[isDotNetCo
1ee0: 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  re]} then {..   
1ef0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f00: 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20  # NOTE: Running 
1f10: 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70 72  on .NET Core, pr
1f20: 69 6f 72 69 74 69 7a 65 20 69 74 73 20 6c 69 73  ioritize its lis
1f30: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 2e  t of test years.
1f40: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f50: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
1f60: 74 20 4e 65 74 53 74 61 6e 64 61 72 64 32 30 5d  t NetStandard20]
1f70: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
1f80: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
1f90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
1fa0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73   the default lis
1fb0: 74 20 6f 66 20 74 65 73 74 20 79 65 61 72 73 20  t of test years 
1fc0: 28 69 2e 65 2e 20 61 6c 6c 29 2e 0d 0a 20 20 20  (i.e. all)...   
1fd0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1fe0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 32 30 30  return [list 200
1ff0: 35 20 32 30 30 38 20 32 30 31 30 20 32 30 31 32  5 2008 2010 2012
2000: 20 32 30 31 33 20 32 30 31 35 20 32 30 31 37 20   2013 2015 2017 
2010: 4e 65 74 53 74 61 6e 64 61 72 64 32 30 5d 0d 0a  NetStandard20]..
2020: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
2030: 0c 0d 0a 20 20 20 20 23 0d 0a 20 20 20 20 23 20  ...    #..    # 
2040: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
2050: 64 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  dure is only use
2060: 64 20 77 68 65 6e 20 61 64 64 69 6e 67 20 73 68  d when adding sh
2070: 69 6d 6d 65 64 20 74 65 73 74 20 63 6f 6e 73 74  immed test const
2080: 72 61 69 6e 74 73 2e 0d 0a 20 20 20 20 23 0d 0a  raints...    #..
2090: 20 20 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c      proc getBuil
20a0: 64 43 6c 72 56 65 72 73 69 6f 6e 20 7b 7d 20 7b  dClrVersion {} {
20b0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
20c0: 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
20d0: 63 6c 72 5d 20 26 26 20 5b 73 74 72 69 6e 67 20  clr] && [string 
20e0: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63  length $::test_c
20f0: 6c 72 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  lr] > 0} then {.
2100: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2110: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
2120: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
2130: 73 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74  st version for t
2140: 68 65 20 43 4c 52 2e 20 20 49 66 20 74 68 69 73  he CLR.  If this
2150: 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20 20 20   variable..     
2160: 20 20 20 23 20 20 20 20 20 20 20 69 73 20 6e 6f     #       is no
2170: 74 20 73 65 74 2c 20 74 68 65 20 64 65 66 61 75  t set, the defau
2180: 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  lt value will be
2190: 20 62 61 73 65 64 20 6f 6e 20 77 68 65 74 68 65   based on whethe
21a0: 72 20 6f 72 20 6e 6f 74 0d 0a 20 20 20 20 20 20  r or not..      
21b0: 20 20 23 20 20 20 20 20 20 20 45 61 67 6c 65 20    #       Eagle 
21c0: 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65  has been compile
21d0: 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 43 4c  d against the CL
21e0: 52 20 76 32 2e 30 20 6f 72 20 43 4c 52 20 76 34  R v2.0 or CLR v4
21f0: 2e 30 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  .0...        #..
2200: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
2210: 3a 3a 74 65 73 74 5f 63 6c 72 0d 0a 20 20 20 20  ::test_clr..    
2220: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
2230: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2240: 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2250: 45 61 67 6c 65 20 68 61 73 20 62 65 65 6e 20 63  Eagle has been c
2260: 6f 6d 70 69 6c 65 64 20 61 67 61 69 6e 73 74 20  ompiled against 
2270: 74 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49  the CLR v4.0.  I
2280: 66 20 73 6f 2c 0d 0a 20 20 20 20 20 20 20 20 23  f so,..        #
2290: 20 20 20 20 20 20 20 6a 75 73 74 20 75 73 65 20         just use 
22a0: 74 68 61 74 20 43 4c 52 20 76 65 72 73 69 6f 6e  that CLR version
22b0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  .  Otherwise, us
22c0: 65 20 74 68 65 20 76 65 72 73 69 6f 6e 20 66 6f  e the version fo
22d0: 72 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23  r the..        #
22e0: 20 20 20 20 20 20 20 43 4c 52 20 76 32 2e 30 2e         CLR v2.0.
22f0: 20 20 49 66 20 61 6e 6f 74 68 65 72 20 6d 61 6a    If another maj
2300: 6f 72 20 5b 69 6e 63 6f 6d 70 61 74 69 62 6c 65  or [incompatible
2310: 5d 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  ] version of the
2320: 20 43 4c 52 0d 0a 20 20 20 20 20 20 20 20 23 20   CLR..        # 
2330: 20 20 20 20 20 20 69 73 20 72 65 6c 65 61 73 65        is release
2340: 64 2c 20 74 68 69 73 20 63 68 65 63 6b 20 77 69  d, this check wi
2350: 6c 6c 20 68 61 76 65 20 74 6f 20 62 65 20 63 68  ll have to be ch
2360: 61 6e 67 65 64 2e 20 20 54 68 65 20 64 65 66 61  anged.  The defa
2370: 75 6c 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ult..        #  
2380: 20 20 20 20 20 76 65 72 73 69 6f 6e 20 76 61 6c       version val
2390: 75 65 20 66 6f 72 20 61 20 70 61 72 74 69 63 75  ue for a particu
23a0: 6c 61 72 20 43 4c 52 20 76 65 72 73 69 6f 6e 20  lar CLR version 
23b0: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
23c0: 6e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  n..        #    
23d0: 20 20 20 62 79 20 73 65 74 74 69 6e 67 20 74 68     by setting th
23e0: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
23f0: 65 20 22 74 65 73 74 5f 63 6c 72 5f 76 24 58 22  e "test_clr_v$X"
2400: 2c 20 77 68 65 72 65 20 22 24 58 22 20 6d 61 79  , where "$X" may
2410: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
2420: 20 20 5b 63 75 72 72 65 6e 74 6c 79 5d 20 62 65    [currently] be
2430: 20 65 69 74 68 65 72 20 22 32 22 20 6f 72 20 22   either "2" or "
2440: 34 22 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  4"...        #..
2450: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76          if {[hav
2460: 65 43 6f 6e 73 74 72 61 69 6e 74 20 69 6d 61 67  eConstraint imag
2470: 65 52 75 6e 74 69 6d 65 34 30 5d 7d 20 74 68 65  eRuntime40]} the
2480: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
2490: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
24a0: 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34 5d 20 26  ::test_clr_v4] &
24b0: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
24c0: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
24d0: 68 20 24 3a 3a 74 65 73 74 5f 63 6c 72 5f 76 34  h $::test_clr_v4
24e0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
24f0: 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
2500: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2510: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
2520: 69 65 64 20 74 65 73 74 20 76 65 72 73 69 6f 6e  ied test version
2530: 20 66 6f 72 20 74 68 65 20 43 4c 52 20 76 34 2e   for the CLR v4.
2540: 30 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0...            
2550: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  #..            r
2560: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6c  eturn $::test_cl
2570: 72 5f 76 34 0d 0a 20 20 20 20 20 20 20 20 20 20  r_v4..          
2580: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2590: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
25a0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65       # NOTE: Use
25b0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 74 65 73   the default tes
25c0: 74 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 74 68  t version for th
25d0: 65 20 43 4c 52 20 76 34 2e 30 2e 0d 0a 20 20 20  e CLR v4.0...   
25e0: 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
25f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 34          return 4
2600: 2e 30 2e 33 30 33 31 39 3b 20 23 20 54 4f 44 4f  .0.30319; # TODO
2610: 3a 20 47 6f 6f 64 20 22 66 61 6c 6c 62 61 63 6b  : Good "fallback
2620: 22 20 64 65 66 61 75 6c 74 3f 0d 0a 20 20 20 20  " default?..    
2630: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2640: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
2650: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
2660: 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6c 72  xists ::test_clr
2670: 5f 76 32 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  _v2] && \..     
2680: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2690: 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f   length $::test_
26a0: 63 6c 72 5f 76 32 5d 20 3e 20 30 7d 20 74 68 65  clr_v2] > 0} the
26b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
26c0: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
26d0: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
26e0: 73 70 65 63 69 66 69 65 64 20 74 65 73 74 20 76  specified test v
26f0: 65 72 73 69 6f 6e 20 66 6f 72 20 74 68 65 20 43  ersion for the C
2700: 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20 20 20  LR v2.0...      
2710: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2720: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
2730: 65 73 74 5f 63 6c 72 5f 76 32 0d 0a 20 20 20 20  est_clr_v2..    
2740: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
2750: 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2760: 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
2770: 45 3a 20 55 73 65 20 74 68 65 20 64 65 66 61 75  E: Use the defau
2780: 6c 74 20 74 65 73 74 20 76 65 72 73 69 6f 6e 20  lt test version 
2790: 66 6f 72 20 74 68 65 20 43 4c 52 20 76 32 2e 30  for the CLR v2.0
27a0: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
27b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
27c0: 74 75 72 6e 20 32 2e 30 2e 35 30 37 32 37 3b 20  turn 2.0.50727; 
27d0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
27e0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
27f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2800: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2810: 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
2820: 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 65   proc getBuildNe
2830: 74 46 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  tFx {} {..      
2840: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
2850: 20 53 65 65 20 69 66 20 74 68 65 20 74 65 73 74   See if the test
2860: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
2870: 73 65 74 74 69 6e 67 20 68 61 73 20 62 65 65 6e  setting has been
2880: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a   overridden by..
2890: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
28a0: 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20  e user (e.g. on 
28b0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
28c0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
28d0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
28e0: 73 74 73 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66  sts ::test_net_f
28f0: 78 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  x] && \..       
2900: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2910: 68 20 24 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78  h $::test_net_fx
2920: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2930: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2940: 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68    # NOTE: Use th
2950: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 73 74  e specified test
2960: 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 2e   .NET Framework.
2970: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2980: 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74       return $::t
2990: 65 73 74 5f 6e 65 74 5f 66 78 0d 0a 20 20 20 20  est_net_fx..    
29a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
29b0: 20 20 20 20 73 65 74 20 79 65 61 72 20 5b 67 65      set year [ge
29c0: 74 42 75 69 6c 64 59 65 61 72 5d 0d 0a 20 20 20  tBuildYear]..   
29d0: 20 20 20 20 20 73 65 74 20 79 65 61 72 56 61 72       set yearVar
29e0: 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41 72 67 73  Name [appendArgs
29f0: 20 3a 3a 74 65 73 74 5f 6e 65 74 5f 66 78 5f 20   ::test_net_fx_ 
2a00: 24 79 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  $year]....      
2a10: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
2a20: 74 73 20 24 79 65 61 72 56 61 72 4e 61 6d 65 5d  ts $yearVarName]
2a30: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
2a40: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2a50: 68 20 5b 73 65 74 20 24 79 65 61 72 56 61 72 4e  h [set $yearVarN
2a60: 61 6d 65 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20  ame]] > 0} then 
2a70: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
2a80: 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2a90: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
2aa0: 69 65 64 20 74 65 73 74 20 2e 4e 45 54 20 46 72  ied test .NET Fr
2ab0: 61 6d 65 77 6f 72 6b 2c 20 62 61 73 65 64 20 6f  amework, based o
2ac0: 6e 20 74 68 65 20 62 75 69 6c 64 0d 0a 20 20 20  n the build..   
2ad0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 79         #       y
2ae0: 65 61 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ear...          
2af0: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  #..          ret
2b00: 75 72 6e 20 5b 73 65 74 20 24 79 65 61 72 56 61  urn [set $yearVa
2b10: 72 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20  rName]..        
2b20: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2b30: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2b40: 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63   # NOTE: Fallbac
2b50: 6b 20 74 6f 20 74 68 65 20 22 77 65 6c 6c 20 6b  k to the "well k
2b60: 6e 6f 77 6e 22 20 2e 4e 45 54 20 46 72 61 6d 65  nown" .NET Frame
2b70: 77 6f 72 6b 20 76 65 72 73 69 6f 6e 20 74 68 61  work version tha
2b80: 74 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  t..          #  
2b90: 20 20 20 20 20 69 73 20 6d 6f 73 74 20 63 6c 6f       is most clo
2ba0: 73 65 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20  sely associated 
2bb0: 77 69 74 68 20 61 20 70 61 72 74 69 63 75 6c 61  with a particula
2bc0: 72 20 76 65 72 73 69 6f 6e 20 6f 66 0d 0a 20 20  r version of..  
2bd0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2be0: 56 69 73 75 61 6c 20 53 74 75 64 69 6f 2e 0d 0a  Visual Studio...
2bf0: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2c00: 20 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65         switch -e
2c10: 78 61 63 74 20 2d 2d 20 24 79 65 61 72 20 7b 0d  xact -- $year {.
2c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30 30  .            200
2c30: 35 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  5 {..           
2c40: 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78 32     return netFx2
2c50: 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0..            }
2c60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32 30  ..            20
2c70: 30 38 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  08 {..          
2c80: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46 78      return netFx
2c90: 33 35 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  35..            
2ca0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 32  }..            2
2cb0: 30 31 30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  010 {..         
2cc0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74 46       return netF
2cd0: 78 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x40..           
2ce0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2cf0: 32 30 31 32 20 7b 0d 0a 20 20 20 20 20 20 20 20  2012 {..        
2d00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2d10: 46 78 34 35 0d 0a 20 20 20 20 20 20 20 20 20 20  Fx45..          
2d20: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2d30: 20 32 30 31 33 20 7b 0d 0a 20 20 20 20 20 20 20   2013 {..       
2d40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
2d50: 74 46 78 34 35 31 3b 20 23 20 54 4f 44 4f 3a 20  tFx451; # TODO: 
2d60: 4f 72 20 22 6e 65 74 46 78 34 35 32 22 3f 0d 0a  Or "netFx452"?..
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2d80: 20 20 20 20 20 20 20 20 20 20 20 32 30 31 35 20             2015 
2d90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2da0: 20 72 65 74 75 72 6e 20 6e 65 74 46 78 34 36 3b   return netFx46;
2db0: 20 23 20 54 4f 44 4f 3a 20 4f 72 20 22 6e 65 74   # TODO: Or "net
2dc0: 46 78 34 36 31 22 20 2f 20 22 6e 65 74 46 78 34  Fx461" / "netFx4
2dd0: 36 32 22 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  62"?..          
2de0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2df0: 20 32 30 31 37 20 7b 0d 0a 20 20 20 20 20 20 20   2017 {..       
2e00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
2e10: 74 46 78 34 37 3b 20 23 20 54 4f 44 4f 3a 20 4f  tFx47; # TODO: O
2e20: 72 20 22 6e 65 74 46 78 34 37 31 22 20 2f 20 22  r "netFx471" / "
2e30: 6e 65 74 46 78 34 37 32 22 3f 0d 0a 20 20 20 20  netFx472"?..    
2e40: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2e50: 20 20 20 20 20 20 20 4e 65 74 53 74 61 6e 64 61         NetStanda
2e60: 72 64 32 30 20 7b 0d 0a 20 20 20 20 20 20 20 20  rd20 {..        
2e70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 74        return net
2e80: 53 74 61 6e 64 61 72 64 32 30 0d 0a 20 20 20 20  Standard20..    
2e90: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2ea0: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20 7b         default {
2eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ec0: 72 65 74 75 72 6e 20 6e 65 74 46 78 33 35 3b 20  return netFx35; 
2ed0: 23 20 54 4f 44 4f 3a 20 47 6f 6f 64 20 22 66 61  # TODO: Good "fa
2ee0: 6c 6c 62 61 63 6b 22 20 64 65 66 61 75 6c 74 3f  llback" default?
2ef0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
2f00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
2f10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
2f20: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
2f30: 23 0d 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  #..    # NOTE: T
2f40: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 68  his procedure sh
2f50: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  ould return non-
2f60: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 6f 6e 66  zero if the conf
2f70: 69 67 75 72 65 64 20 74 65 73 74 0d 0a 20 20 20  igured test..   
2f80: 20 23 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72   #       platfor
2f90: 6d 20 69 73 20 6d 6f 73 74 20 6c 69 6b 65 6c 79  m is most likely
2fa0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72   the default for
2fb0: 20 74 68 69 73 20 6d 61 63 68 69 6e 65 2e 0d 0a   this machine...
2fc0: 20 20 20 20 23 0d 0a 20 20 20 20 70 72 6f 63 20      #..    proc 
2fd0: 69 73 44 65 66 61 75 6c 74 42 75 69 6c 64 50 6c  isDefaultBuildPl
2fe0: 61 74 66 6f 72 6d 20 7b 20 7b 76 65 72 62 6f 73  atform { {verbos
2ff0: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
3000: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
3010: 54 45 3a 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 57  TE: Running on W
3020: 6f 57 36 34 20 69 73 20 6e 65 76 65 72 20 74 68  oW64 is never th
3030: 65 20 64 65 66 61 75 6c 74 20 70 6c 61 74 66 6f  e default platfo
3040: 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  rm...      #..  
3050: 20 20 20 20 69 66 20 7b 5b 69 73 52 75 6e 6e 69      if {[isRunni
3060: 6e 67 57 6f 57 36 34 5d 7d 20 74 68 65 6e 20 7b  ngWoW64]} then {
3070: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 76  ..        if {$v
3080: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
3090: 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
30a0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
30b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
30c0: 20 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20   "---- detected 
30d0: 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 70 6c 61 74  non-default plat
30e0: 66 6f 72 6d 20 28 57 6f 57 36 34 29 5c 6e 22 0d  form (WoW64)\n".
30f0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
3100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
3110: 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  se..      }.... 
3120: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
3130: 4e 4f 54 45 3a 20 54 68 69 73 20 68 61 73 20 61  NOTE: This has a
3140: 20 67 6f 6f 64 20 63 68 61 6e 63 65 20 6f 66 20   good chance of 
3150: 62 65 69 6e 67 20 74 68 65 20 64 65 66 61 75 6c  being the defaul
3160: 74 20 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20  t platform...   
3170: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
3180: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
3190: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
31a0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
31b0: 22 2d 2d 2d 2d 20 64 65 74 65 63 74 65 64 20 64  "---- detected d
31c0: 65 66 61 75 6c 74 20 70 6c 61 74 66 6f 72 6d 5c  efault platform\
31d0: 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
31e0: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
31f0: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
3200: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 50 6c 61  proc getBuildPla
3210: 74 66 6f 72 6d 20 7b 20 6e 61 74 69 76 65 20 7d  tform { native }
3220: 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69   {..      if {[i
3230: 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73  nfo exists ::tes
3240: 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 26 26 20 5c  t_platform] && \
3250: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
3260: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65  ing length $::te
3270: 73 74 5f 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  st_platform] > 0
3280: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
3290: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
32a0: 4f 54 45 3a 20 50 6f 73 73 69 62 6c 79 20 75 73  OTE: Possibly us
32b0: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
32c0: 74 65 73 74 20 70 6c 61 74 66 6f 72 6d 2e 20 20  test platform.  
32d0: 49 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  If this variable
32e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
32f0: 20 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68    is not set, th
3300: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
3310: 77 69 6c 6c 20 62 65 20 62 61 73 65 64 20 6f 6e  will be based on
3320: 20 74 68 65 20 6d 61 63 68 69 6e 65 0d 0a 20 20   the machine..  
3330: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 72        #       ar
3340: 63 68 69 74 65 63 74 75 72 65 2e 20 20 4e 6f 72  chitecture.  Nor
3350: 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 64  mally, this is d
3360: 6f 6e 65 20 66 6f 72 20 62 75 69 6c 64 73 20 74  one for builds t
3370: 68 61 74 20 69 6e 76 6f 6c 76 65 0d 0a 20 20 20  hat involve..   
3380: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
3390: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
33a0: 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20 23  mbly...        #
33b0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
33c0: 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
33d0: 3f 20 24 3a 3a 74 65 73 74 5f 70 6c 61 74 66 6f  ? $::test_platfo
33e0: 72 6d 20 3a 20 22 22 7d 5d 0d 0a 20 20 20 20 20  rm : ""}]..     
33f0: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f   } elseif {[info
3400: 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6d   exists ::test_m
3410: 61 63 68 69 6e 65 5d 20 26 26 20 5c 0d 0a 20 20  achine] && \..  
3420: 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
3430: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 6d  length $::test_m
3440: 61 63 68 69 6e 65 5d 20 3e 20 30 7d 20 74 68 65  achine] > 0} the
3450: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
3460: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
3470: 46 6f 72 20 6e 61 74 69 76 65 20 62 75 69 6c 64  For native build
3480: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 6c  s, return the pl
3490: 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f 72 72  atform name corr
34a0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d 0a 20 20  esponding to..  
34b0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
34c0: 65 20 74 65 73 74 20 6d 61 63 68 69 6e 65 20 61  e test machine a
34d0: 72 63 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68  rchitecture; oth
34e0: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
34f0: 6e 20 65 6d 70 74 79 0d 0a 20 20 20 20 20 20 20  n empty..       
3500: 20 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2e   #       string.
3510: 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73    Normally, this
3520: 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 62 75 69   is done for bui
3530: 6c 64 73 20 74 68 61 74 20 69 6e 76 6f 6c 76 65  lds that involve
3540: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20   the..        # 
3550: 20 20 20 20 20 20 6d 69 78 65 64 2d 6d 6f 64 65        mixed-mode
3560: 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20   assembly...    
3570: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
3580: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
3590: 20 20 20 20 20 20 20 20 20 24 6e 61 74 69 76 65           $native
35a0: 20 3f 20 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61   ? [machineToPla
35b0: 74 66 6f 72 6d 20 24 3a 3a 74 65 73 74 5f 6d 61  tform $::test_ma
35c0: 63 68 69 6e 65 5d 20 3a 20 22 22 0d 0a 20 20 20  chine] : ""..   
35d0: 20 20 20 20 20 7d 5d 0d 0a 20 20 20 20 20 20 7d       }]..      }
35e0: 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65   elseif {[info e
35f0: 78 69 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74  xists ::tcl_plat
3600: 66 6f 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20  form(machine)]} 
3610: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
3620: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
3630: 45 3a 20 46 6f 72 20 6e 61 74 69 76 65 20 62 75  E: For native bu
3640: 69 6c 64 73 2c 20 72 65 74 75 72 6e 20 74 68 65  ilds, return the
3650: 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63   platform name c
3660: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 0d  orresponding to.
3670: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3680: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 61 72 63   the machine arc
3690: 68 69 74 65 63 74 75 72 65 3b 20 6f 74 68 65 72  hitecture; other
36a0: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
36b0: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20  empty string... 
36c0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e         #       N
36d0: 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
36e0: 20 64 6f 6e 65 20 66 6f 72 20 62 75 69 6c 64 73   done for builds
36f0: 20 74 68 61 74 20 69 6e 76 6f 6c 76 65 20 74 68   that involve th
3700: 65 20 6d 69 78 65 64 2d 6d 6f 64 65 0d 0a 20 20  e mixed-mode..  
3710: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73        #       as
3720: 73 65 6d 62 6c 79 2e 0d 0a 20 20 20 20 20 20 20  sembly...       
3730: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
3740: 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20  rn [expr {..    
3750: 20 20 20 20 20 20 24 6e 61 74 69 76 65 20 3f 20        $native ? 
3760: 5b 6d 61 63 68 69 6e 65 54 6f 50 6c 61 74 66 6f  [machineToPlatfo
3770: 72 6d 20 24 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  rm $::tcl_platfo
3780: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 20 3a 20 22  rm(machine)] : "
3790: 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 20  "..        }].. 
37a0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
37b0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
37c0: 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 6d 61 63    # NOTE: No mac
37d0: 68 69 6e 65 20 61 72 63 68 69 74 65 63 74 75 72  hine architectur
37e0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
37f0: 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20  return an empty 
3800: 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  string...       
3810: 20 23 20 20 20 20 20 20 20 49 74 20 69 73 20 69   #       It is i
3820: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 65 74 75  mportant to retu
3830: 72 6e 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  rn an empty stri
3840: 6e 67 20 68 65 72 65 20 62 65 63 61 75 73 65 20  ng here because 
3850: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  the..        #  
3860: 20 20 20 20 20 72 65 73 75 6c 74 20 6f 66 20 74       result of t
3870: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 61  his procedure ma
3880: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 5b  y be used with [
3890: 66 69 6c 65 20 6a 6f 69 6e 5d 2e 0d 0a 20 20 20  file join]...   
38a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
38b0: 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20  return ""..     
38c0: 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
38d0: 20 20 70 72 6f 63 20 67 65 74 42 75 69 6c 64 43    proc getBuildC
38e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 7b 7d 20  onfiguration {} 
38f0: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
3900: 20 20 23 20 4e 4f 54 45 3a 20 53 65 65 20 69 66    # NOTE: See if
3910: 20 74 68 65 20 22 63 6f 6e 66 69 67 75 72 61 74   the "configurat
3920: 69 6f 6e 22 20 73 65 74 74 69 6e 67 20 68 61 73  ion" setting has
3930: 20 62 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e   been overridden
3940: 20 62 79 20 74 68 65 0d 0a 20 20 20 20 20 20 23   by the..      #
3950: 20 20 20 20 20 20 20 75 73 65 72 20 28 65 2e 67         user (e.g
3960: 2e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  . on the command
3970: 20 6c 69 6e 65 29 2e 20 20 54 68 69 73 20 68 65   line).  This he
3980: 6c 70 73 20 63 6f 6e 74 72 6f 6c 20 65 78 61 63  lps control exac
3990: 74 6c 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20  tly..      #    
39a0: 20 20 20 77 68 69 63 68 20 73 65 74 20 6f 66 20     which set of 
39b0: 62 69 6e 61 72 69 65 73 20 77 65 20 61 72 65 20  binaries we are 
39c0: 74 65 73 74 69 6e 67 20 28 69 2e 65 2e 20 74 68  testing (i.e. th
39d0: 6f 73 65 20 62 75 69 6c 74 20 69 6e 20 74 68 65  ose built in the
39e0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
39f0: 22 44 65 62 75 67 22 20 6f 72 20 22 52 65 6c 65  "Debug" or "Rele
3a00: 61 73 65 22 20 62 75 69 6c 64 20 63 6f 6e 66 69  ase" build confi
3a10: 67 75 72 61 74 69 6f 6e 73 29 2e 20 20 54 6f 20  gurations).  To 
3a20: 6f 76 65 72 72 69 64 65 20 74 68 69 73 0d 0a 20  override this.. 
3a30: 20 20 20 20 20 23 20 20 20 20 20 20 20 76 61 6c       #       val
3a40: 75 65 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61  ue via the comma
3a50: 6e 64 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61  nd line, enter a
3a60: 20 63 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72   command similar
3a70: 20 74 6f 20 6f 6e 65 20 6f 66 0d 0a 20 20 20 20   to one of..    
3a80: 20 20 23 20 20 20 20 20 20 20 74 68 65 20 66 6f    #       the fo
3a90: 6c 6c 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20  llowing (all on 
3aa0: 6f 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20  one line):..    
3ab0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
3ac0: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
3ad0: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
3ae0: 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69   "set test_confi
3af0: 67 75 72 61 74 69 6f 6e 20 44 65 62 75 67 22 0d  guration Debug".
3b00: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20  .      #        
3b10: 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c 74 6f   -file .\path\to
3b20: 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20 20 20  \all.eagle..    
3b30: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20    #..      #    
3b40: 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78     EagleShell.ex
3b50: 65 20 2d 61 6e 79 49 6e 69 74 69 61 6c 69 7a 65  e -anyInitialize
3b60: 20 22 73 65 74 20 74 65 73 74 5f 63 6f 6e 66 69   "set test_confi
3b70: 67 75 72 61 74 69 6f 6e 20 52 65 6c 65 61 73 65  guration Release
3b80: 22 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  "..      #      
3b90: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
3ba0: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
3bb0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
3bc0: 20 20 20 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e       EagleShell.
3bd0: 65 78 65 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68  exe -file .\path
3be0: 5c 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 20 2d 70  \to\all.eagle -p
3bf0: 72 65 54 65 73 74 0d 0a 20 20 20 20 20 20 23 20  reTest..      # 
3c00: 20 20 20 20 20 20 20 20 22 75 6e 73 65 74 20 2d          "unset -
3c10: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 74 65 73 74 5f  nocomplain test_
3c20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 0d 0a  configuration"..
3c30: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
3c40: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
3c50: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
3c60: 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20 20 20 20  tion] && \..    
3c70: 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
3c80: 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  ngth $::test_con
3c90: 66 69 67 75 72 61 74 69 6f 6e 5d 20 3e 20 30 7d  figuration] > 0}
3ca0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
3cb0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
3cc0: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
3cd0: 69 66 69 65 64 20 74 65 73 74 20 63 6f 6e 66 69  ified test confi
3ce0: 67 75 72 61 74 69 6f 6e 2e 20 20 54 68 65 20 64  guration.  The d
3cf0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 75 73 65  efault value use
3d00: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
3d10: 20 20 20 66 6f 72 20 74 68 69 73 20 76 61 72 69     for this vari
3d20: 61 62 6c 65 20 69 73 20 74 79 70 69 63 61 6c 6c  able is typicall
3d30: 79 20 22 52 65 6c 65 61 73 65 22 2c 20 61 73 20  y "Release", as 
3d40: 73 65 74 20 62 79 20 74 68 65 20 74 65 73 74 0d  set by the test.
3d50: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
3d60: 20 73 75 69 74 65 20 69 74 73 65 6c 66 2e 0d 0a   suite itself...
3d70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
3d80: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73     return $::tes
3d90: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  t_configuration.
3da0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
3db0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
3dc0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 72 6d      # NOTE: Norm
3dd0: 61 6c 6c 79 2c 20 77 65 20 77 69 6c 6c 20 6e 65  ally, we will ne
3de0: 76 65 72 20 68 69 74 20 74 68 69 73 20 63 61 73  ver hit this cas
3df0: 65 20 62 65 63 61 75 73 65 20 74 68 65 20 76 61  e because the va
3e00: 6c 75 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20  lue of the..    
3e10: 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
3e20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76   configuration v
3e30: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
3e40: 73 20 73 65 74 20 62 79 20 74 68 65 20 74 65 73  s set by the tes
3e50: 74 20 73 75 69 74 65 0d 0a 20 20 20 20 20 20 20  t suite..       
3e60: 20 23 20 20 20 20 20 20 20 69 74 73 65 6c 66 3b   #       itself;
3e70: 20 68 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   however, it can
3e80: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
3e90: 73 69 6e 67 20 74 68 65 20 75 6e 73 65 74 20 63  sing the unset c
3ea0: 6f 6d 6d 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  ommand..        
3eb0: 23 20 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  #       from the
3ec0: 20 2d 70 72 65 54 65 73 74 20 6f 70 74 69 6f 6e   -preTest option
3ed0: 20 74 6f 20 74 68 65 20 74 65 73 74 20 73 75 69   to the test sui
3ee0: 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
3ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
3f00: 3a 3a 65 61 67 6c 65 5f 70 6c 61 74 66 6f 72 6d  ::eagle_platform
3f10: 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 29 0d  (configuration).
3f20: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
3f30: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
3f40: 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  BuildConfigurati
3f50: 6f 6e 73 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ons {} {..      
3f60: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
3f70: 20 53 65 65 20 69 66 20 74 68 65 20 6c 69 73 74   See if the list
3f80: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
3f90: 72 61 74 69 6f 6e 73 20 68 61 73 20 62 65 65 6e  rations has been
3fa0: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d 0a   overridden by..
3fb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
3fc0: 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20  e user (e.g. on 
3fd0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
3fe0: 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  )...      #..   
3ff0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
4000: 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69  sts ::test_confi
4010: 67 75 72 61 74 69 6f 6e 73 5d 20 26 26 20 5c 0d  gurations] && \.
4020: 0a 20 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e  .          [llen
4030: 67 74 68 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66  gth $::test_conf
4040: 69 67 75 72 61 74 69 6f 6e 73 5d 20 3e 20 30 7d  igurations] > 0}
4050: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
4060: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
4070: 54 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63  TE: Use the spec
4080: 69 66 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65  ified list of te
4090: 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  st configuration
40a0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
40b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
40c0: 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
40d0: 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ions..      } el
40e0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
40f0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4100: 20 55 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   Use the default
4110: 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63 6f   list of test co
4120: 6e 66 69 67 75 72 61 74 69 6f 6e 73 2e 0d 0a 20  nfigurations... 
4130: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4140: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 44    return [list D
4150: 65 62 75 67 20 52 65 6c 65 61 73 65 5d 0d 0a 20  ebug Release].. 
4160: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4170: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
4180: 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ildConfiguration
4190: 53 75 66 66 69 78 20 7b 7d 20 7b 0d 0a 20 20 20  Suffix {} {..   
41a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
41b0: 54 45 3a 20 53 65 65 20 69 66 20 74 68 65 20 74  TE: See if the t
41c0: 65 73 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  est configuratio
41d0: 6e 20 73 75 66 66 69 78 20 68 61 73 20 62 65 65  n suffix has bee
41e0: 6e 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 0d  n overridden by.
41f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74  .      #       t
4200: 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e  he user (e.g. on
4210: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
4220: 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  e)...      #..  
4230: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
4240: 69 73 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66  ists ::test_conf
4250: 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78  iguration_suffix
4260: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
4270: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
4280: 20 24 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75   $::test_configu
4290: 72 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d 20 3e  ration_suffix] >
42a0: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
42b0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
42c0: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
42d0: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 63 6f  pecified test co
42e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66  nfiguration suff
42f0: 69 78 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ix...        #..
4300: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
4310: 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61  ::test_configura
4320: 74 69 6f 6e 5f 73 75 66 66 69 78 0d 0a 20 20 20  tion_suffix..   
4330: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
4340: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4350: 23 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20  # NOTE: Use the 
4360: 64 65 66 61 75 6c 74 20 74 65 73 74 20 63 6f 6e  default test con
4370: 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66 66 69  figuration suffi
4380: 78 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  x, which should 
4390: 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  be..        #   
43a0: 20 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72      an empty str
43b0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ing...        #.
43c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
43d0: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
43e0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
43f0: 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 43 6f  getBuildNativeCo
4400: 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69  nfigurationSuffi
4410: 78 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  x {} {..      #.
4420: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
4430: 65 65 20 69 66 20 74 68 65 20 74 65 73 74 20 6e  ee if the test n
4440: 61 74 69 76 65 20 63 6f 6e 66 69 67 75 72 61 74  ative configurat
4450: 69 6f 6e 20 73 75 66 66 69 78 20 68 61 73 20 62  ion suffix has b
4460: 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  een..      #    
4470: 20 20 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79     overridden by
4480: 20 74 68 65 20 75 73 65 72 20 28 65 2e 67 2e 20   the user (e.g. 
4490: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
44a0: 69 6e 65 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ine)...      #..
44b0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
44c0: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6e 61  exists ::test_na
44d0: 74 69 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69  tive_configurati
44e0: 6f 6e 5f 73 75 66 66 69 78 5d 20 26 26 20 5c 0d  on_suffix] && \.
44f0: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
4500: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73  ng length $::tes
4510: 74 5f 6e 61 74 69 76 65 5f 63 6f 6e 66 69 67 75  t_native_configu
4520: 72 61 74 69 6f 6e 5f 73 75 66 66 69 78 5d 20 3e  ration_suffix] >
4530: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
4540: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
4550: 20 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 73   NOTE: Use the s
4560: 70 65 63 69 66 69 65 64 20 74 65 73 74 20 6e 61  pecified test na
4570: 74 69 76 65 20 63 6f 6e 66 69 67 75 72 61 74 69  tive configurati
4580: 6f 6e 20 73 75 66 66 69 78 2e 0d 0a 20 20 20 20  on suffix...    
4590: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
45a0: 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 6e 61  eturn $::test_na
45b0: 74 69 76 65 5f 63 6f 6e 66 69 67 75 72 61 74 69  tive_configurati
45c0: 6f 6e 5f 73 75 66 66 69 78 0d 0a 20 20 20 20 20  on_suffix..     
45d0: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
45e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
45f0: 4e 4f 54 45 3a 20 55 73 65 20 74 68 65 20 64 65  NOTE: Use the de
4600: 66 61 75 6c 74 20 74 65 73 74 20 6e 61 74 69 76  fault test nativ
4610: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
4620: 73 75 66 66 69 78 2c 20 77 68 69 63 68 0d 0a 20  suffix, which.. 
4630: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73         #       s
4640: 68 6f 75 6c 64 20 62 65 20 61 6e 20 65 6d 70 74  hould be an empt
4650: 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  y string...     
4660: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
4670: 74 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d  turn ""..      }
4680: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
4690: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 4e 61 74  proc getBuildNat
46a0: 69 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  iveConfiguration
46b0: 53 75 66 66 69 78 46 6f 72 44 6f 74 4e 65 74 43  SuffixForDotNetC
46c0: 6f 72 65 20 7b 20 73 75 66 66 69 78 20 7d 20 7b  ore { suffix } {
46d0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 73 44  ..      if {[isD
46e0: 6f 74 4e 65 74 43 6f 72 65 5d 20 26 26 20 5b 69  otNetCore] && [i
46f0: 73 57 69 6e 64 6f 77 73 5d 7d 20 74 68 65 6e 20  sWindows]} then 
4700: 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  {..        retur
4710: 6e 20 4e 61 74 69 76 65 4f 6e 6c 79 3b 20 23 20  n NativeOnly; # 
4720: 48 41 43 4b 3a 20 53 70 65 63 69 61 6c 20 63 61  HACK: Special ca
4730: 73 65 2c 20 75 73 65 20 32 30 31 35 20 6e 61 74  se, use 2015 nat
4740: 69 76 65 20 62 69 6e 61 72 69 65 73 2e 0d 0a 20  ive binaries... 
4750: 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
4760: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73  string length $s
4770: 75 66 66 69 78 5d 20 3e 20 30 7d 20 74 68 65 6e  uffix] > 0} then
4780: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
4790: 72 6e 20 24 73 75 66 66 69 78 0d 0a 20 20 20 20  rn $suffix..    
47a0: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
47b0: 20 20 20 20 72 65 74 75 72 6e 20 5b 67 65 74 42      return [getB
47c0: 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67  uildNativeConfig
47d0: 75 72 61 74 69 6f 6e 53 75 66 66 69 78 5d 0d 0a  urationSuffix]..
47e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
47f0: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
4800: 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
4810: 6e 53 75 66 66 69 78 65 73 20 7b 7d 20 7b 0d 0a  nSuffixes {} {..
4820: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4830: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
4840: 65 20 6c 69 73 74 20 6f 66 20 74 65 73 74 20 63  e list of test c
4850: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75 66  onfiguration suf
4860: 66 69 78 65 73 20 68 61 73 20 62 65 65 6e 0d 0a  fixes has been..
4870: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 76        #       ov
4880: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
4890: 75 73 65 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68  user (e.g. on th
48a0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e  e command line).
48b0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
48c0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
48d0: 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75  s ::test_configu
48e0: 72 61 74 69 6f 6e 5f 73 75 66 66 69 78 65 73 5d  ration_suffixes]
48f0: 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
4900: 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73   [llength $::tes
4910: 74 5f 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5f  t_configuration_
4920: 73 75 66 66 69 78 65 73 5d 20 3e 20 30 7d 20 74  suffixes] > 0} t
4930: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
4940: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
4950: 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69 66  : Use the specif
4960: 69 65 64 20 6c 69 73 74 20 6f 66 20 74 65 73 74  ied list of test
4970: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
4980: 73 75 66 66 69 78 65 73 2e 0d 0a 20 20 20 20 20  suffixes...     
4990: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
49a0: 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f 63 6f 6e  turn $::test_con
49b0: 66 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69  figuration_suffi
49c0: 78 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  xes..      } els
49d0: 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f  eif {[isDotNetCo
49e0: 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  re]} then {..   
49f0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
4a00: 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e 67 20  # NOTE: Running 
4a10: 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20 70 72  on .NET Core, pr
4a20: 69 6f 72 69 74 69 7a 65 20 69 74 73 20 74 65 73  ioritize its tes
4a30: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0d  t configuration.
4a40: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
4a50: 20 73 75 66 66 69 78 65 73 20 66 6f 72 20 6c 69   suffixes for li
4a60: 62 72 61 72 79 20 66 69 6c 65 73 2e 0d 0a 20 20  brary files...  
4a70: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4a80: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 4e 65   return [list Ne
4a90: 74 53 74 61 6e 64 61 72 64 32 30 20 22 22 5d 0d  tStandard20 ""].
4aa0: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
4ab0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4ac0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
4ad0: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 69 73 74  the default list
4ae0: 20 6f 66 20 74 65 73 74 20 63 6f 6e 66 69 67 75   of test configu
4af0: 72 61 74 69 6f 6e 73 20 73 75 66 66 69 78 65 73  rations suffixes
4b00: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
4b10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
4b20: 73 74 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d 0d  st ""]..      }.
4b30: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
4b40: 72 6f 63 20 67 65 74 42 75 69 6c 64 45 78 74 72  roc getBuildExtr
4b50: 61 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  a {} {..      if
4b60: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4b70: 3a 74 65 73 74 5f 65 78 74 72 61 5d 20 26 26 20  :test_extra] && 
4b80: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
4b90: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74  ring length $::t
4ba0: 65 73 74 5f 65 78 74 72 61 5d 20 3e 20 30 7d 20  est_extra] > 0} 
4bb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
4bc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
4bd0: 45 3a 20 55 73 65 20 74 68 65 20 73 70 65 63 69  E: Use the speci
4be0: 66 69 65 64 20 65 78 74 72 61 20 6f 75 74 70 75  fied extra outpu
4bf0: 74 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  t directory...  
4c00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4c10: 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 73 74 5f   return $::test_
4c20: 65 78 74 72 61 0d 0a 20 20 20 20 20 20 7d 20 65  extra..      } e
4c30: 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74  lseif {[isDotNet
4c40: 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Core]} then {.. 
4c50: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
4c60: 20 20 23 20 4e 4f 54 45 3a 20 52 75 6e 6e 69 6e    # NOTE: Runnin
4c70: 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65 2c 20  g on .NET Core, 
4c80: 75 73 65 20 74 68 65 20 65 78 74 72 61 20 6f 75  use the extra ou
4c90: 74 70 75 74 20 64 69 72 65 63 74 6f 72 79 20 66  tput directory f
4ca0: 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  or..        #   
4cb0: 20 20 20 20 6c 69 62 72 61 72 79 20 66 69 6c 65      library file
4cc0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
4cd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
4ce0: 74 73 74 61 6e 64 61 72 64 32 2e 30 0d 0a 20 20  tstandard2.0..  
4cf0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
4d00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
4d10: 20 23 20 4e 4f 54 45 3a 20 4e 6f 20 65 78 74 72   # NOTE: No extr
4d20: 61 20 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f  a output directo
4d30: 72 79 20 69 73 20 72 65 71 75 69 72 65 64 2e 0d  ry is required..
4d40: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
4d50: 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20      return "".. 
4d60: 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
4d70: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42 75  ..    proc getBu
4d80: 69 6c 64 45 78 74 72 61 73 20 7b 7d 20 7b 0d 0a  ildExtras {} {..
4d90: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
4da0: 20 4e 4f 54 45 3a 20 53 65 65 20 69 66 20 74 68   NOTE: See if th
4db0: 65 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61 20  e list of extra 
4dc0: 6f 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 69  output directori
4dd0: 65 73 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  es has been over
4de0: 72 69 64 64 65 6e 0d 0a 20 20 20 20 20 20 23 20  ridden..      # 
4df0: 20 20 20 20 20 20 62 79 20 74 68 65 20 75 73 65        by the use
4e00: 72 20 28 65 2e 67 2e 20 6f 6e 20 74 68 65 20 63  r (e.g. on the c
4e10: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 29 2e 0d 0a 20  ommand line)... 
4e20: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
4e30: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
4e40: 3a 74 65 73 74 5f 65 78 74 72 61 73 5d 20 26 26  :test_extras] &&
4e50: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 6c   \..          [l
4e60: 6c 65 6e 67 74 68 20 24 3a 3a 74 65 73 74 5f 65  length $::test_e
4e70: 78 74 72 61 73 5d 20 3e 20 30 7d 20 74 68 65 6e  xtras] > 0} then
4e80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
4e90: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 55         # NOTE: U
4ea0: 73 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  se the specified
4eb0: 20 6c 69 73 74 20 6f 66 20 65 78 74 72 61 20 6f   list of extra o
4ec0: 75 74 70 75 74 20 64 69 72 65 63 74 6f 72 69 65  utput directorie
4ed0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
4ee0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
4ef0: 3a 74 65 73 74 5f 65 78 74 72 61 73 0d 0a 20 20  :test_extras..  
4f00: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
4f10: 73 44 6f 74 4e 65 74 43 6f 72 65 5d 7d 20 74 68  sDotNetCore]} th
4f20: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
4f30: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
4f40: 20 52 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45 54   Running on .NET
4f50: 20 43 6f 72 65 2c 20 70 72 69 6f 72 69 74 69 7a   Core, prioritiz
4f60: 65 20 69 74 73 20 65 78 74 72 61 20 6f 75 74 70  e its extra outp
4f70: 75 74 20 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  ut directory..  
4f80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66 6f        #       fo
4f90: 72 20 6c 69 62 72 61 72 79 20 66 69 6c 65 73 2e  r library files.
4fa0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
4fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
4fc0: 74 20 6e 65 74 73 74 61 6e 64 61 72 64 32 2e 30  t netstandard2.0
4fd0: 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c   ""]..      } el
4fe0: 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
4ff0: 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
5000: 20 55 73 65 20 64 65 66 61 75 6c 74 20 6c 69 73   Use default lis
5010: 74 20 6f 66 20 65 78 74 72 61 20 6f 75 74 70 75  t of extra outpu
5020: 74 20 64 69 72 65 63 74 6f 72 69 65 73 2c 20 77  t directories, w
5030: 68 69 63 68 20 69 73 20 6f 6e 65 0d 0a 20 20 20  hich is one..   
5040: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 6d 70       #       emp
5050: 74 79 20 73 74 72 69 6e 67 20 28 6e 6f 2d 6f 70  ty string (no-op
5060: 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  )...        #.. 
5070: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
5080: 69 73 74 20 22 22 5d 0d 0a 20 20 20 20 20 20 7d  ist ""]..      }
5090: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
50a0: 70 72 6f 63 20 67 65 74 42 75 69 6c 64 42 61 73  proc getBuildBas
50b0: 65 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d  eDirectory {} {.
50c0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
50d0: 23 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f  # NOTE: Figure o
50e0: 75 74 20 74 68 65 20 62 61 73 65 20 64 69 72 65  ut the base dire
50f0: 63 74 6f 72 79 20 77 68 65 72 65 20 61 6c 6c 20  ctory where all 
5100: 74 68 65 20 62 75 69 6c 64 73 20 73 68 6f 75 6c  the builds shoul
5110: 64 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20  d be..      #   
5120: 20 20 20 20 6c 6f 63 61 74 65 64 2e 20 20 54 68      located.  Th
5130: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64  is will be the d
5140: 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
5150: 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 75 61  ntains the actua
5160: 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
5170: 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69   build output di
5180: 72 65 63 74 6f 72 79 20 28 65 2e 67 2e 20 70 61  rectory (e.g. pa
5190: 72 65 6e 74 20 6f 66 20 22 62 69 6e 22 29 2e 0d  rent of "bin")..
51a0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
51b0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
51c0: 20 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69   ::build_base_di
51d0: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
51e0: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
51f0: 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69 6c 64   length $::build
5200: 5f 62 61 73 65 5f 64 69 72 65 63 74 6f 72 79 5d  _base_directory]
5210: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
5220: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5230: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
5240: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69  ation of the bui
5250: 6c 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72  ld base director
5260: 79 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 72  y has been overr
5270: 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20 20 20 20  idden;..        
5280: 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f 72  #       therefor
5290: 65 2c 20 75 73 65 20 69 74 20 76 65 72 62 61 74  e, use it verbat
52a0: 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  im...        #..
52b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24          return $
52c0: 3a 3a 62 75 69 6c 64 5f 62 61 73 65 5f 64 69 72  ::build_base_dir
52d0: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20  ectory..      } 
52e0: 65 6c 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78  elseif {[info ex
52f0: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
5300: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
5310: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
5320: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
5330: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
5340: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5350: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
5360: 4f 54 45 3a 20 4e 65 78 74 2c 20 66 61 6c 6c 62  OTE: Next, fallb
5370: 61 63 6b 20 74 6f 20 74 68 65 20 67 72 61 6e 64  ack to the grand
5380: 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  parent directory
5390: 20 6f 66 20 74 68 65 20 6f 6e 65 0d 0a 20 20 20   of the one..   
53a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
53b0: 74 61 69 6e 69 6e 67 20 74 68 69 73 20 66 69 6c  taining this fil
53c0: 65 20 28 69 2e 65 2e 20 22 63 6f 6d 6d 6f 6e 2e  e (i.e. "common.
53d0: 65 61 67 6c 65 22 29 2c 20 69 66 20 61 76 61 69  eagle"), if avai
53e0: 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
53f0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
5400: 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  n [file dirname 
5410: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a  [file dirname $:
5420: 3a 63 6f 6d 6d 6f 6e 5f 64 69 72 65 63 74 6f 72  :common_director
5430: 79 5d 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  y]]..      } els
5440: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
5450: 73 20 3a 3a 70 61 74 68 5d 20 26 26 20 5c 0d 0a  s ::path] && \..
5460: 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
5470: 67 20 6c 65 6e 67 74 68 20 24 3a 3a 70 61 74 68  g length $::path
5480: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
5490: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
54a0: 20 20 23 20 4e 4f 54 45 3a 20 46 69 6e 61 6c 6c    # NOTE: Finall
54b0: 79 2c 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 74  y, fallback to t
54c0: 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74  he parent direct
54d0: 6f 72 79 20 6f 66 20 74 68 65 20 45 61 67 6c 65  ory of the Eagle
54e0: 54 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20  Test..        # 
54f0: 20 20 20 20 20 20 70 61 74 68 2e 20 20 54 68 65        path.  The
5500: 20 45 61 67 6c 65 54 65 73 74 20 70 61 63 6b 61   EagleTest packa
5510: 67 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ge guarantees th
5520: 61 74 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  at this variable
5530: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
5540: 20 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f    will be set to
5550: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
5560: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
5570: 72 73 74 20 66 69 6c 65 20 74 6f 0d 0a 20 20 20  rst file to..   
5580: 20 20 20 20 20 23 20 20 20 20 20 20 20 65 78 65       #       exe
5590: 63 75 74 65 20 74 68 65 20 5b 72 75 6e 54 65 73  cute the [runTes
55a0: 74 50 72 6f 6c 6f 67 75 65 5d 20 73 63 72 69 70  tPrologue] scrip
55b0: 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63 65 64  t library proced
55c0: 75 72 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ure...        #.
55d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
55e0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 3a  [file dirname $:
55f0: 3a 70 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 20  :path]..      } 
5600: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
5610: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
5620: 45 3a 20 4e 6f 20 70 61 74 68 20 69 73 20 61 76  E: No path is av
5630: 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20  ailable, return 
5640: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
5650: 20 20 54 68 69 73 20 70 6f 69 6e 74 0d 0a 20 20    This point..  
5660: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 68        #       sh
5670: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 61 63  ould not be reac
5680: 68 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  hed...        #.
5690: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
56a0: 22 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  ""..      }..   
56b0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
56c0: 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74  getSQLiteTestDat
56d0: 61 50 61 74 68 20 7b 7d 20 7b 0d 0a 20 20 20 20  aPath {} {..    
56e0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
56f0: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  E: Figure out th
5700: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
5710: 65 20 61 6c 6c 20 74 68 65 20 74 65 73 74 20 64  e all the test d
5720: 61 74 61 20 66 69 6c 65 73 20 73 68 6f 75 6c 64  ata files should
5730: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
5740: 62 65 20 6c 6f 63 61 74 65 64 2e 20 20 54 68 69  be located.  Thi
5750: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
5760: 22 64 61 74 61 22 20 64 69 72 65 63 74 6f 72 79  "data" directory
5770: 20 62 65 6e 65 61 74 68 20 74 68 65 0d 0a 20 20   beneath the..  
5780: 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72 65      #       dire
5790: 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
57a0: 20 74 68 65 20 61 63 74 75 61 6c 20 74 65 73 74   the actual test
57b0: 20 73 63 72 69 70 74 73 2e 0d 0a 20 20 20 20 20   scripts...     
57c0: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
57d0: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 3a 3a 70   [file join $::p
57e0: 61 74 68 20 64 61 74 61 5d 0d 0a 20 20 20 20 7d  ath data]..    }
57f0: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
5800: 52 75 6e 6e 69 6e 67 57 6f 57 36 34 20 7b 7d 20  RunningWoW64 {} 
5810: 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
5820: 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f    # NOTE: For no
5830: 77 2c 20 6a 75 73 74 20 75 73 65 20 74 68 65 20  w, just use the 
5840: 65 78 69 73 74 69 6e 67 20 74 65 73 74 20 63 6f  existing test co
5850: 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 64 65 74  nstraint for det
5860: 65 63 74 69 6e 67 0d 0a 20 20 20 20 20 20 23 20  ecting..      # 
5870: 20 20 20 20 20 20 61 20 57 6f 57 36 34 20 70 72        a WoW64 pr
5880: 6f 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 23 0d  ocess...      #.
5890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 68  .      return [h
58a0: 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 77 6f  aveConstraint wo
58b0: 77 36 34 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  w64]..    }.....
58c0: 20 20 20 20 70 72 6f 63 20 69 73 4d 69 78 65 64      proc isMixed
58d0: 4d 6f 64 65 41 73 73 65 6d 62 6c 79 20 7b 20 66  ModeAssembly { f
58e0: 69 6c 65 4e 61 6d 65 20 7b 76 61 72 4e 61 6d 65  ileName {varName
58f0: 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20   ""} } {..      
5900: 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
5910: 20 46 69 72 73 74 2c 20 6d 61 6b 65 20 73 75 72   First, make sur
5920: 65 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  e the test suite
5930: 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
5940: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0d 0a 20  is allowed to.. 
5950: 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73 65       #       use
5960: 20 74 68 65 20 5b 65 78 65 63 5d 20 63 6f 6d 6d   the [exec] comm
5970: 61 6e 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  and...      #.. 
5980: 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
5990: 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 78 65 63  exists ::no(exec
59a0: 29 5d 20 26 26 20 21 5b 69 6e 66 6f 20 65 78 69  )] && ![info exi
59b0: 73 74 73 20 3a 3a 6e 6f 28 63 6f 72 46 6c 61 67  sts ::no(corFlag
59c0: 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
59d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
59e0: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 6c  # NOTE: If the l
59f0: 6f 63 61 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c  ocation of CorFl
5a00: 61 67 73 20 69 73 20 70 72 65 73 65 6e 74 20 69  ags is present i
5a10: 6e 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  n the environmen
5a20: 74 2c 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  t,..        #   
5a30: 20 20 20 20 75 73 65 20 69 74 3b 20 6f 74 68 65      use it; othe
5a40: 72 77 69 73 65 20 61 73 73 75 6d 65 20 69 74 20  rwise assume it 
5a50: 69 73 20 69 6e 20 74 68 65 20 50 41 54 48 2e 0d  is in the PATH..
5a60: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5a70: 20 20 20 20 73 65 74 20 63 6f 72 46 6c 61 67 73      set corFlags
5a80: 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20 20   [expr {..      
5a90: 20 20 20 20 5b 69 6e 66 6f 20 65 78 69 73 74 73      [info exists
5aa0: 20 3a 3a 65 6e 76 28 43 6f 72 46 6c 61 67 73 29   ::env(CorFlags)
5ab0: 5d 20 3f 20 24 3a 3a 65 6e 76 28 43 6f 72 46 6c  ] ? $::env(CorFl
5ac0: 61 67 73 29 20 3a 20 22 43 6f 72 46 6c 61 67 73  ags) : "CorFlags
5ad0: 22 0d 0a 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d  "..        }]...
5ae0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
5af0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65      # NOTE: Atte
5b00: 6d 70 74 20 74 6f 20 65 78 65 63 75 74 65 20 43  mpt to execute C
5b10: 6f 72 46 6c 61 67 73 20 6f 6e 20 74 68 65 20 73  orFlags on the s
5b20: 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 0d 0a  pecified file...
5b30: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
5b40: 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d     if {[catch {.
5b50: 0a 20 20 20 20 20 20 20 20 20 20 65 78 65 63 20  .          exec 
5b60: 2d 2d 20 24 63 6f 72 46 6c 61 67 73 20 5b 66 69  -- $corFlags [fi
5b70: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 24 66  le nativename $f
5b80: 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  ileName]..      
5b90: 20 20 7d 20 65 78 65 63 5d 20 3d 3d 20 30 7d 20    } exec] == 0} 
5ba0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5bb0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
5bc0: 20 4e 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73   NOTE: If reques
5bd0: 74 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ted by our calle
5be0: 72 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  r, attempt to de
5bf0: 74 65 72 6d 69 6e 65 20 74 68 65 0d 0a 20 20 20  termine the..   
5c00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70         #       p
5c10: 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 65 20  latform for the 
5c20: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 61  specified file a
5c30: 73 20 77 65 6c 6c 2e 0d 0a 20 20 20 20 20 20 20  s well...       
5c40: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
5c50: 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
5c60: 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
5c70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
5c80: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5c90: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 74 6f       # NOTE: Sto
5ca0: 72 65 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  re the platform 
5cb0: 69 6e 20 74 68 65 20 6e 61 6d 65 64 20 76 61 72  in the named var
5cc0: 69 61 62 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20  iable in the..  
5cd0: 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
5ce0: 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72    context of our
5cf0: 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20   caller...      
5d00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5d10: 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
5d20: 72 4e 61 6d 65 20 70 6c 61 74 66 6f 72 6d 0d 0a  rName platform..
5d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
5d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
5d50: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
5d60: 65 78 74 72 61 63 74 20 74 68 65 20 50 45 20 6c  extract the PE l
5d70: 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 63 61 70  ine from the cap
5d80: 74 75 72 65 64 0d 0a 20 20 20 20 20 20 20 20 20  tured..         
5d90: 20 20 20 23 20 20 20 20 20 20 20 6f 75 74 70 75     #       outpu
5da0: 74 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  t.  If this valu
5db0: 65 20 69 73 20 22 50 45 33 32 22 20 6f 72 20 22  e is "PE32" or "
5dc0: 50 45 33 32 2b 22 2c 20 74 68 65 0d 0a 20 20 20  PE32+", the..   
5dd0: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
5de0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 69   assembly file i
5df0: 73 20 33 32 2d 62 69 74 20 6f 72 20 36 34 2d 62  s 32-bit or 64-b
5e00: 69 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  it, respectively
5e10: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ;..            #
5e20: 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
5e30: 2c 20 69 74 73 20 74 79 70 65 20 69 73 20 75 6e  , its type is un
5e40: 6b 6e 6f 77 6e 2e 0d 0a 20 20 20 20 20 20 20 20  known...        
5e50: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
5e60: 20 20 20 73 65 74 20 70 61 74 74 65 72 6e 20 7b     set pattern {
5e70: 5e 50 45 20 20 20 20 20 20 20 20 3a 20 28 50 45  ^PE        : (PE
5e80: 33 32 7c 50 45 33 32 5c 2b 29 5c 73 2b 24 7d 0d  32|PE32\+)\s+$}.
5e90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
5ea0: 66 20 7b 5b 72 65 67 65 78 70 20 2d 6c 69 6e 65  f {[regexp -line
5eb0: 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65 78   -- $pattern $ex
5ec0: 65 63 20 64 75 6d 6d 79 20 70 65 33 32 5d 7d 20  ec dummy pe32]} 
5ed0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
5ee0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
5ef0: 20 20 20 20 20 20 20 23 20 48 41 43 4b 3a 20 54         # HACK: T
5f00: 68 69 73 20 5b 73 77 69 74 63 68 5d 20 61 73 73  his [switch] ass
5f10: 75 6d 65 73 20 74 68 61 74 20 33 32 2d 62 69 74  umes that 32-bit
5f20: 20 65 78 65 63 75 74 61 62 6c 65 73 20 61 72 65   executables are
5f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5f40: 23 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 78  #       always x
5f50: 38 36 20 61 6e 64 20 74 68 61 74 20 36 34 2d 62  86 and that 64-b
5f60: 69 74 20 65 78 65 63 75 74 61 62 6c 65 73 20 61  it executables a
5f70: 72 65 20 61 6c 77 61 79 73 0d 0a 20 20 20 20 20  re always..     
5f80: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
5f90: 20 78 36 34 2e 0d 0a 20 20 20 20 20 20 20 20 20   x64...         
5fa0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
5fb0: 20 20 20 20 20 20 73 77 69 74 63 68 20 2d 65 78        switch -ex
5fc0: 61 63 74 20 2d 2d 20 24 70 65 33 32 20 7b 0d 0a  act -- $pe32 {..
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 50 45 33 32 20 7b 0d 0a 20 20 20 20 20 20 20 20  PE32 {..        
5ff0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6c            set pl
6000: 61 74 66 6f 72 6d 20 57 69 6e 33 32 0d 0a 20 20  atform Win32..  
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
6020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6030: 20 50 45 33 32 2b 20 7b 0d 0a 20 20 20 20 20 20   PE32+ {..      
6040: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
6050: 70 6c 61 74 66 6f 72 6d 20 78 36 34 0d 0a 20 20  platform x64..  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
6070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6080: 20 64 65 66 61 75 6c 74 20 7b 0d 0a 20 20 20 20   default {..    
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
60a0: 74 20 70 6c 61 74 66 6f 72 6d 20 22 22 0d 0a 20  t platform "".. 
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
60c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
60d0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
60e0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
60f0: 20 20 20 20 20 20 20 73 65 74 20 70 6c 61 74 66         set platf
6100: 6f 72 6d 20 22 22 0d 0a 20 20 20 20 20 20 20 20  orm ""..        
6110: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
6120: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
6130: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e  #..          # N
6140: 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20  OTE: Attempt to 
6150: 65 78 74 72 61 63 74 20 74 68 65 20 49 4c 4f 4e  extract the ILON
6160: 4c 59 20 6c 69 6e 65 20 66 72 6f 6d 20 74 68 65  LY line from the
6170: 20 63 61 70 74 75 72 65 64 0d 0a 20 20 20 20 20   captured..     
6180: 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 75 74       #       out
6190: 70 75 74 2e 20 20 49 66 20 74 68 69 73 20 76 61  put.  If this va
61a0: 6c 75 65 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lue is zero, the
61b0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
61c0: 6d 75 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20  must..          
61d0: 23 20 20 20 20 20 20 20 62 65 20 61 20 6d 69 78  #       be a mix
61e0: 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79  ed-mode assembly
61f0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 69 74 20  ; otherwise, it 
6200: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 0d 0a 20  contains only.. 
6210: 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
6220: 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f 6e 65   managed compone
6230: 6e 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  nts...          
6240: 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
6250: 20 70 61 74 74 65 72 6e 20 7b 5e 49 4c 4f 4e 4c   pattern {^ILONL
6260: 59 20 20 20 20 3a 20 28 30 7c 31 29 5c 73 2b 24  Y    : (0|1)\s+$
6270: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
6280: 66 20 7b 21 5b 72 65 67 65 78 70 20 2d 6c 69 6e  f {![regexp -lin
6290: 65 20 2d 2d 20 24 70 61 74 74 65 72 6e 20 24 65  e -- $pattern $e
62a0: 78 65 63 20 64 75 6d 6d 79 20 69 6c 4f 6e 6c 79  xec dummy ilOnly
62b0: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
62c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
62d0: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  lse..          }
62e0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
62f0: 20 7b 21 24 69 6c 4f 6e 6c 79 7d 20 74 68 65 6e   {!$ilOnly} then
6300: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6310: 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20  return true..   
6320: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6330: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
6340: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
6350: 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 74 65   NOTE: If the te
6360: 73 74 20 73 75 69 74 65 20 63 61 6e 6e 6f 74 20  st suite cannot 
6370: 75 73 65 20 5b 65 78 65 63 5d 20 6f 72 20 65 78  use [exec] or ex
6380: 65 63 75 74 69 6f 6e 20 6f 66 20 43 6f 72 46 6c  ecution of CorFl
6390: 61 67 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ags..      #    
63a0: 20 20 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72     failed, retur
63b0: 6e 20 66 61 6c 73 65 2e 0d 0a 20 20 20 20 20 20  n false...      
63c0: 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  #..      return 
63d0: 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  false..    }....
63e0: 0a 20 20 20 20 70 72 6f 63 20 69 73 44 61 72 77  .    proc isDarw
63f0: 69 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 72  in {} {..      r
6400: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 0d 0a 20  eturn [expr {.. 
6410: 20 20 20 20 20 20 20 5b 69 6e 66 6f 20 65 78 69         [info exi
6420: 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
6430: 72 6d 28 6f 73 29 5d 20 26 26 20 24 3a 3a 74 63  rm(os)] && $::tc
6440: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29 20 65  l_platform(os) e
6450: 71 20 22 44 61 72 77 69 6e 22 0d 0a 20 20 20 20  q "Darwin"..    
6460: 20 20 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a    }]..    }.....
6470: 20 20 20 20 70 72 6f 63 20 67 65 74 4e 61 74 69      proc getNati
6480: 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d  veLibraryFileNam
6490: 65 73 4f 6e 6c 79 20 7b 7d 20 7b 0d 0a 20 20 20  esOnly {} {..   
64a0: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
64b0: 54 45 3a 20 46 69 72 73 74 2c 20 63 68 65 63 6b  TE: First, check
64c0: 20 69 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   if the list of 
64d0: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 66  native library f
64e0: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
64f0: 65 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  en..      #     
6500: 20 20 6d 61 6e 75 61 6c 6c 79 20 6f 76 65 72 72    manually overr
6510: 69 64 64 65 6e 2e 0d 0a 20 20 20 20 20 20 23 0d  idden...      #.
6520: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
6530: 20 65 78 69 73 74 73 20 3a 3a 6e 61 74 69 76 65   exists ::native
6540: 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61  _library_file_na
6550: 6d 65 73 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  mes] && \..     
6560: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a       [llength $:
6570: 3a 6e 61 74 69 76 65 5f 6c 69 62 72 61 72 79 5f  :native_library_
6580: 66 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d  file_names] > 0}
6590: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
65a0: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
65b0: 54 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  TE: The list of 
65c0: 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79 20 66  native library f
65d0: 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62 65  ile names has be
65e0: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
65f0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
6600: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
6610: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
6620: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6630: 72 65 74 75 72 6e 20 24 3a 3a 6e 61 74 69 76 65  return $::native
6640: 5f 6c 69 62 72 61 72 79 5f 66 69 6c 65 5f 6e 61  _library_file_na
6650: 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  mes..      } els
6660: 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d  eif {[isWindows]
6670: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
6680: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
6690: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
66a0: 6f 6e 20 57 69 6e 33 32 2c 20 61 6c 77 61 79 73  on Win32, always
66b0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
66c0: 64 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  d native library
66d0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
66e0: 20 20 66 69 6c 65 20 6e 61 6d 65 20 22 73 71 6c    file name "sql
66f0: 69 74 65 33 2e 64 6c 6c 22 2e 0d 0a 20 20 20 20  ite3.dll"...    
6700: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
6710: 65 74 75 72 6e 20 5b 6c 69 73 74 20 73 71 6c 69  eturn [list sqli
6720: 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20 20 20  te3.dll]..      
6730: 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44 6f 74  } elseif {[isDot
6740: 4e 65 74 43 6f 72 65 5d 7d 20 74 68 65 6e 20 7b  NetCore]} then {
6750: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6760: 20 20 20 20 20 23 20 20 20 20 20 20 20 57 68 65       #       Whe
6770: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 2e 4e 45  n running on .NE
6780: 54 20 43 6f 72 65 2c 20 72 65 74 75 72 6e 20 74  T Core, return t
6790: 68 65 20 73 61 6d 65 20 6e 61 74 69 76 65 20 6c  he same native l
67a0: 69 62 72 61 72 79 0d 0a 20 20 20 20 20 20 20 20  ibrary..        
67b0: 23 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d  #       file nam
67c0: 65 20 74 68 61 74 20 69 73 20 75 73 65 64 20 6f  e that is used o
67d0: 6e 20 57 69 6e 64 6f 77 73 20 28 69 2e 65 2e 20  n Windows (i.e. 
67e0: 6f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  otherwise, assum
67f0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
6800: 20 20 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e     we are runnin
6810: 67 20 6f 6e 20 4d 6f 6e 6f 20 61 6e 64 20 75 73  g on Mono and us
6820: 65 20 69 74 73 20 50 2f 49 6e 76 6f 6b 65 20 63  e its P/Invoke c
6830: 6f 6e 76 65 6e 74 69 6f 6e 73 29 2e 0d 0a 20 20  onventions)...  
6840: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6850: 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 73 71   return [list sq
6860: 6c 69 74 65 33 2e 64 6c 6c 5d 0d 0a 20 20 20 20  lite3.dll]..    
6870: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 73 44    } elseif {[isD
6880: 61 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a  arwin]} then {..
6890: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
68a0: 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20     # NOTE: When 
68b0: 72 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72 77 69  running on Darwi
68c0: 6e 20 28 69 2e 65 2e 20 74 68 65 20 6b 65 72 6e  n (i.e. the kern
68d0: 65 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61 63 20  el of iOS / Mac 
68e0: 4f 53 20 58 29 2c 0d 0a 20 20 20 20 20 20 20 20  OS X),..        
68f0: 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  #       return t
6900: 68 65 20 4d 61 63 20 4f 53 20 58 20 6e 61 74 69  he Mac OS X nati
6910: 76 65 20 6c 69 62 72 61 72 79 20 66 69 6c 65 20  ve library file 
6920: 6e 61 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65  name.  This file
6930: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
6940: 20 20 6e 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c    name is normal
6950: 6c 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ly required for 
6960: 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23  Mono...        #
6970: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
6980: 20 5b 6c 69 73 74 20 6c 69 62 73 71 6c 69 74 65   [list libsqlite
6990: 33 2e 64 79 6c 69 62 5d 0d 0a 20 20 20 20 20 20  3.dylib]..      
69a0: 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
69b0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
69c0: 4f 54 45 3a 20 4f 74 68 65 72 77 69 73 65 2c 20  OTE: Otherwise, 
69d0: 72 65 74 75 72 6e 20 74 68 65 20 67 65 6e 65 72  return the gener
69e0: 69 63 20 50 4f 53 49 58 20 6e 61 74 69 76 65 20  ic POSIX native 
69f0: 6c 69 62 72 61 72 79 20 66 69 6c 65 0d 0a 20 20  library file..  
6a00: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 61        #       na
6a10: 6d 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 6e  me.  This file n
6a20: 61 6d 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  ame is normally 
6a30: 72 65 71 75 69 72 65 64 20 66 6f 72 20 4d 6f 6e  required for Mon
6a40: 6f 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o...        #.. 
6a50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c         return [l
6a60: 69 73 74 20 6c 69 62 73 71 6c 69 74 65 33 2e 73  ist libsqlite3.s
6a70: 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  o]..      }..   
6a80: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
6a90: 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62  getInteropAssemb
6aa0: 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20  lyFileNamesOnly 
6ab0: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
6ac0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 72       # NOTE: Fir
6ad0: 73 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  st, check if the
6ae0: 20 6c 69 73 74 20 6f 66 20 69 6e 74 65 72 6f 70   list of interop
6af0: 20 61 73 73 65 6d 62 6c 79 20 66 69 6c 65 20 6e   assembly file n
6b00: 61 6d 65 73 20 68 61 73 20 62 65 65 6e 0d 0a 20  ames has been.. 
6b10: 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 61 6e       #       man
6b20: 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65 6e  ually overridden
6b30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
6b40: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
6b50: 74 73 20 3a 3a 69 6e 74 65 72 6f 70 5f 61 73 73  ts ::interop_ass
6b60: 65 6d 62 6c 79 5f 66 69 6c 65 5f 6e 61 6d 65 73  embly_file_names
6b70: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
6b80: 20 20 5b 6c 6c 65 6e 67 74 68 20 24 3a 3a 69 6e    [llength $::in
6b90: 74 65 72 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66  terop_assembly_f
6ba0: 69 6c 65 5f 6e 61 6d 65 73 5d 20 3e 20 30 7d 20  ile_names] > 0} 
6bb0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
6bc0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
6bd0: 45 3a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 69  E: The list of i
6be0: 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20  nterop assembly 
6bf0: 66 69 6c 65 20 6e 61 6d 65 73 20 68 61 73 20 62  file names has b
6c00: 65 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d  een overridden;.
6c10: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
6c20: 20 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   therefore, use 
6c30: 69 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20  it verbatim...  
6c40: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
6c50: 20 72 65 74 75 72 6e 20 24 3a 3a 69 6e 74 65 72   return $::inter
6c60: 6f 70 5f 61 73 73 65 6d 62 6c 79 5f 66 69 6c 65  op_assembly_file
6c70: 5f 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 20  _names..      } 
6c80: 65 6c 73 65 69 66 20 7b 5b 69 73 57 69 6e 64 6f  elseif {[isWindo
6c90: 77 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ws]} then {..   
6ca0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
6cb0: 23 20 4e 4f 54 45 3a 20 4f 74 68 65 72 77 69 73  # NOTE: Otherwis
6cc0: 65 2c 20 6f 6e 20 57 69 6e 33 32 2c 20 61 6c 77  e, on Win32, alw
6cd0: 61 79 73 20 75 73 65 20 74 68 65 20 69 6e 74 65  ays use the inte
6ce0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
6cf0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
6d00: 20 20 20 6e 61 6d 65 20 22 53 51 4c 69 74 65 2e     name "SQLite.
6d10: 49 6e 74 65 72 6f 70 2e 64 6c 6c 22 2e 0d 0a 20  Interop.dll"... 
6d20: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
6d30: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 53    return [list S
6d40: 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 6c  QLite.Interop.dl
6d50: 6c 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  l]..      } else
6d60: 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f 72  if {[isDotNetCor
6d70: 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
6d80: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
6d90: 20 20 20 20 20 20 20 57 68 65 6e 20 72 75 6e 6e         When runn
6da0: 69 6e 67 20 6f 6e 20 2e 4e 45 54 20 43 6f 72 65  ing on .NET Core
6db0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  , return the sam
6dc0: 65 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62 6c  e interp assembl
6dd0: 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  y..        #    
6de0: 20 20 20 66 69 6c 65 20 6e 61 6d 65 20 74 68 61     file name tha
6df0: 74 20 69 73 20 75 73 65 64 20 6f 6e 20 57 69 6e  t is used on Win
6e00: 64 6f 77 73 20 28 69 2e 65 2e 20 6f 74 68 65 72  dows (i.e. other
6e10: 77 69 73 65 2c 20 61 73 73 75 6d 65 0d 0a 20 20  wise, assume..  
6e20: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77 65        #       we
6e30: 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20   are running on 
6e40: 4d 6f 6e 6f 20 61 6e 64 20 75 73 65 20 69 74 73  Mono and use its
6e50: 20 50 2f 49 6e 76 6f 6b 65 20 63 6f 6e 76 65 6e   P/Invoke conven
6e60: 74 69 6f 6e 73 29 2e 0d 0a 20 20 20 20 20 20 20  tions)...       
6e70: 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   #..        retu
6e80: 72 6e 20 5b 6c 69 73 74 20 53 51 4c 69 74 65 2e  rn [list SQLite.
6e90: 49 6e 74 65 72 6f 70 2e 64 6c 6c 5d 0d 0a 20 20  Interop.dll]..  
6ea0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69      } elseif {[i
6eb0: 73 44 61 72 77 69 6e 5d 7d 20 74 68 65 6e 20 7b  sDarwin]} then {
6ec0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
6ed0: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 65       # NOTE: Whe
6ee0: 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 44 61 72  n running on Dar
6ef0: 77 69 6e 20 28 69 2e 65 2e 20 74 68 65 20 6b 65  win (i.e. the ke
6f00: 72 6e 65 6c 20 6f 66 20 69 4f 53 20 2f 20 4d 61  rnel of iOS / Ma
6f10: 63 20 4f 53 20 58 29 2c 0d 0a 20 20 20 20 20 20  c OS X),..      
6f20: 20 20 23 20 20 20 20 20 20 20 72 65 74 75 72 6e    #       return
6f30: 20 74 68 65 20 4d 61 63 20 4f 53 20 58 20 69 6e   the Mac OS X in
6f40: 74 65 72 70 20 61 73 73 65 6d 62 6c 79 20 66 69  terp assembly fi
6f50: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 69 73 20 66  le name.  This f
6f60: 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ile..        #  
6f70: 20 20 20 20 20 6e 61 6d 65 20 69 73 20 6e 6f 72       name is nor
6f80: 6d 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 66  mally required f
6f90: 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20 20 20 20 20 20  or Mono...      
6fa0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
6fb0: 75 72 6e 20 5b 6c 69 73 74 20 6c 69 62 53 51 4c  urn [list libSQL
6fc0: 69 74 65 2e 49 6e 74 65 72 6f 70 2e 64 79 6c 69  ite.Interop.dyli
6fd0: 62 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  b]..      } else
6fe0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
6ff0: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f         # NOTE: O
7000: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
7010: 20 74 68 65 20 67 65 6e 65 72 69 63 20 50 4f 53   the generic POS
7020: 49 58 20 69 6e 74 65 72 70 20 61 73 73 65 6d 62  IX interp assemb
7030: 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20 20 20 20  ly file..       
7040: 20 23 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20   #       name.  
7050: 54 68 69 73 20 66 69 6c 65 20 6e 61 6d 65 20 69  This file name i
7060: 73 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 71 75 69  s normally requi
7070: 72 65 64 20 66 6f 72 20 4d 6f 6e 6f 2e 0d 0a 20  red for Mono... 
7080: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
7090: 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 6c    return [list l
70a0: 69 62 53 51 4c 69 74 65 2e 49 6e 74 65 72 6f 70  ibSQLite.Interop
70b0: 2e 73 6f 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  .so]..      }.. 
70c0: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
70d0: 63 20 67 65 74 43 6f 72 65 45 78 74 65 6e 73 69  c getCoreExtensi
70e0: 6f 6e 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65  onBinaryFileName
70f0: 20 7b 20 7b 64 65 66 61 75 6c 74 20 22 22 7d 20   { {default ""} 
7100: 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 66  } {..      set f
7110: 69 6c 65 4e 61 6d 65 20 5b 67 65 74 43 6f 72 65  ileName [getCore
7120: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 5d 0d  BinaryFileName].
7130: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 66 69  ...      if {[fi
7140: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
7150: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
7160: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
7170: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  leName..      }.
7180: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
7190: 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 7d 0d  $default..    }.
71a0: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 42  ....    proc isB
71b0: 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20 7b 20  uildAvailable { 
71c0: 6e 61 74 69 76 65 20 73 6b 69 70 4e 61 74 69 76  native skipNativ
71d0: 65 20 64 69 72 65 63 74 6f 72 79 20 7b 76 61 72  e directory {var
71e0: 4e 61 6d 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  Name ""} } {..  
71f0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
7200: 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66  OTE: Build the f
7210: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 66  ully qualified f
7220: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile name for the
7230: 20 70 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c   primary assembl
7240: 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
7250: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7260: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
7270: 74 65 20 6d 61 6e 61 67 65 64 20 63 6f 6d 70 6f  te managed compo
7280: 6e 65 6e 74 73 2e 20 20 49 74 0d 0a 20 20 20 20  nents.  It..    
7290: 20 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64    #       should
72a0: 20 62 65 20 6e 6f 74 65 64 20 74 68 61 74 20 74   be noted that t
72b0: 68 69 73 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  his assembly fil
72c0: 65 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  e may also conta
72d0: 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20  in the..      # 
72e0: 20 20 20 20 20 20 6e 61 74 69 76 65 20 63 6f 6d        native com
72f0: 70 6f 6e 65 6e 74 73 2c 20 69 66 20 61 20 6e 61  ponents, if a na
7300: 74 69 76 65 20 62 75 69 6c 64 20 69 73 20 69 6e  tive build is in
7310: 20 75 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   use...      #..
7320: 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61        set fileNa
7330: 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  me [file nativen
7340: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  ame [file join $
7350: 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20  directory \..   
7360: 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
7370: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 5d 5d 0d  ta.SQLite.dll]].
7380: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b 66  ...      if {![f
7390: 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65  ile exists $file
73a0: 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  Name]} then {.. 
73b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
73c0: 6c 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  lse..      }....
73d0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
73e0: 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 61 72 65   NOTE: If we are
73f0: 20 73 6b 69 70 70 69 6e 67 20 6c 6f 6f 6b 69 6e   skipping lookin
7400: 67 20 66 6f 72 20 74 68 65 20 6e 61 74 69 76 65  g for the native
7410: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 73 74 6f   components, sto
7420: 70 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  p..      #      
7430: 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   now...      #..
7440: 20 20 20 20 20 20 69 66 20 7b 24 73 6b 69 70 4e        if {$skipN
7450: 61 74 69 76 65 7d 20 74 68 65 6e 20 7b 0d 0a 20  ative} then {.. 
7460: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
7470: 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ue..      }.... 
7480: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
7490: 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f  NOTE: Attempt to
74a0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
74b0: 65 74 65 63 74 20 69 66 20 74 68 65 20 70 72 69  etect if the pri
74c0: 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20  mary assembly.. 
74d0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e       #       con
74e0: 74 61 69 6e 73 20 61 6e 79 20 6e 61 74 69 76 65  tains any native
74f0: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2c 20 69 66 20   components, if 
7500: 6e 65 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20  necessary...    
7510: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
7520: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e  string length $n
7530: 61 74 69 76 65 5d 20 3d 3d 20 30 7d 20 74 68 65  ative] == 0} the
7540: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
7550: 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
7560: 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74  $varName] > 0} t
7570: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
7580: 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
7590: 65 20 24 76 61 72 4e 61 6d 65 0d 0a 20 20 20 20  e $varName..    
75a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
75b0: 20 73 65 74 20 6e 61 74 69 76 65 20 5b 69 73 4d   set native [isM
75c0: 69 78 65 64 4d 6f 64 65 41 73 73 65 6d 62 6c 79  ixedModeAssembly
75d0: 20 24 66 69 6c 65 4e 61 6d 65 20 24 76 61 72 4e   $fileName $varN
75e0: 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ame]..      }...
75f0: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7600: 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 70  # NOTE: If the p
7610: 72 69 6d 61 72 79 20 61 73 73 65 6d 62 6c 79 20  rimary assembly 
7620: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 74 68  also contains th
7630: 65 20 6e 61 74 69 76 65 20 63 6f 6d 70 6f 6e 65  e native compone
7640: 6e 74 73 2c 0d 0a 20 20 20 20 20 20 23 20 20 20  nts,..      #   
7650: 20 20 20 20 77 65 20 68 61 76 65 20 65 76 65 72      we have ever
7660: 79 74 68 69 6e 67 20 77 65 20 6e 65 65 64 2e 0d  ything we need..
7670: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7680: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
7690: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
76a0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
76b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
76c0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
76d0: 68 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d 65 20  he machine name 
76e0: 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2c 20  is unavailable, 
76f0: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
7700: 20 65 6c 73 65 20 77 65 0d 0a 20 20 20 20 20 20   else we..      
7710: 23 20 20 20 20 20 20 20 63 61 6e 20 64 6f 2e 0d  #       can do..
7720: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
7730: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
7740: 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d  s ::tcl_platform
7750: 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e  (machine)]} then
7760: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
7770: 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20  rn false..      
7780: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
7790: 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 68 61 74      # NOTE: What
77a0: 20 69 73 20 74 68 65 20 61 72 63 68 69 74 65 63   is the architec
77b0: 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 6d 61  ture for this ma
77c0: 63 68 69 6e 65 3f 0d 0a 20 20 20 20 20 20 23 0d  chine?..      #.
77d0: 0a 20 20 20 20 20 20 73 65 74 20 61 72 63 68 69  .      set archi
77e0: 74 65 63 74 75 72 65 20 5b 6d 61 63 68 69 6e 65  tecture [machine
77f0: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
7800: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
7810: 6e 65 29 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20  ne) true]....   
7820: 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
7830: 54 45 3a 20 57 68 61 74 20 69 73 20 74 68 65 20  TE: What is the 
7840: 70 6c 61 74 66 6f 72 6d 20 66 6f 72 20 74 68 69  platform for thi
7850: 73 20 6d 61 63 68 69 6e 65 3f 0d 0a 20 20 20 20  s machine?..    
7860: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70    #..      set p
7870: 6c 61 74 66 6f 72 6d 20 5b 6d 61 63 68 69 6e 65  latform [machine
7880: 54 6f 50 6c 61 74 66 6f 72 6d 20 24 3a 3a 74 63  ToPlatform $::tc
7890: 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d 61 63 68 69  l_platform(machi
78a0: 6e 65 29 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  ne)]....      #.
78b0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42  .      # NOTE: B
78c0: 75 69 6c 64 20 74 68 65 20 66 75 6c 6c 79 20 71  uild the fully q
78d0: 75 61 6c 69 66 69 65 64 20 66 69 6c 65 20 6e 61  ualified file na
78e0: 6d 65 20 66 6f 72 20 74 68 65 20 69 6e 74 65 72  me for the inter
78f0: 6f 70 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20  op assembly..   
7900: 20 20 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61     #       conta
7910: 69 6e 69 6e 67 20 74 68 65 20 53 79 73 74 65 6d  ining the System
7920: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
7930: 69 76 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20  ive components. 
7940: 20 49 66 20 74 68 69 73 0d 0a 20 20 20 20 20 20   If this..      
7950: 23 20 20 20 20 20 20 20 66 69 6c 65 20 65 78 69  #       file exi
7960: 73 74 73 2c 20 77 65 20 73 68 6f 75 6c 64 20 68  sts, we should h
7970: 61 76 65 20 65 76 65 72 79 74 68 69 6e 67 20 77  ave everything w
7980: 65 20 6e 65 65 64 2e 0d 0a 20 20 20 20 20 20 23  e need...      #
7990: 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
79a0: 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5b 67 65  fileNameOnly [ge
79b0: 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
79c0: 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 7b  FileNamesOnly] {
79d0: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69  ..        set fi
79e0: 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74  leName [file nat
79f0: 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
7a00: 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20 5c 0d  in $directory \.
7a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72  .            $ar
7a20: 63 68 69 74 65 63 74 75 72 65 20 24 66 69 6c 65  chitecture $file
7a30: 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20  NameOnly]]....  
7a40: 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20        if {[file 
7a50: 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65  exists $fileName
7a60: 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
7a70: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
7a80: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
7a90: 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
7aa0: 61 6d 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ame [file native
7ab0: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
7ac0: 24 64 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20  $directory \..  
7ad0: 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
7ae0: 6f 72 6d 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c  orm $fileNameOnl
7af0: 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69  y]]....        i
7b00: 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20  f {[file exists 
7b10: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
7b20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65   {..          re
7b30: 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
7b40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7b50: 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69  set fileName [fi
7b60: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
7b70: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
7b80: 6f 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ory \..         
7b90: 20 20 20 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79     $fileNameOnly
7ba0: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  ]]....        if
7bb0: 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
7bc0: 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
7bd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
7be0: 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
7bf0: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
7c00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
7c10: 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
7c20: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
7c30: 20 66 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 74   file name for t
7c40: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 0d 0a  he SQLite core..
7c50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 69        #       li
7c60: 62 72 61 72 79 2e 20 20 49 66 20 74 68 69 73 20  brary.  If this 
7c70: 66 69 6c 65 20 65 78 69 73 74 73 2c 20 77 65 20  file exists, we 
7c80: 73 68 6f 75 6c 64 20 68 61 76 65 20 65 76 65 72  should have ever
7c90: 79 74 68 69 6e 67 20 77 65 0d 0a 20 20 20 20 20  ything we..     
7ca0: 20 23 20 20 20 20 20 20 20 6e 65 65 64 2e 0d 0a   #       need...
7cb0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
7cc0: 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
7cd0: 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65 4c 69  nly [getNativeLi
7ce0: 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73 4f 6e  braryFileNamesOn
7cf0: 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 73  ly] {..        s
7d00: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
7d10: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
7d20: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
7d30: 72 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ry \..          
7d40: 20 20 24 61 72 63 68 69 74 65 63 74 75 72 65 20    $architecture 
7d50: 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d  $fileNameOnly]].
7d60: 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ...        if {[
7d70: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c  file exists $fil
7d80: 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  eName]} then {..
7d90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7da0: 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d   true..        }
7db0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
7dc0: 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e  fileName [file n
7dd0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
7de0: 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72 79 20  join $directory 
7df0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24  \..            $
7e00: 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61  platform $fileNa
7e10: 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20  meOnly]]....    
7e20: 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78      if {[file ex
7e30: 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d  ists $fileName]}
7e40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
7e50: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a     return true..
7e60: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
7e70: 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d       set fileNam
7e80: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
7e90: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64  me [file join $d
7ea0: 69 72 65 63 74 6f 72 79 20 5c 0d 0a 20 20 20 20  irectory \..    
7eb0: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
7ec0: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
7ed0: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
7ee0: 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20  sts $fileName]} 
7ef0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
7f00: 20 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20    return true.. 
7f10: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7f20: 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
7f30: 20 20 20 20 23 20 4e 4f 54 45 3a 20 4f 6e 65 20      # NOTE: One 
7f40: 6f 72 20 6d 6f 72 65 20 6e 61 74 69 76 65 20 63  or more native c
7f50: 6f 6d 70 6f 6e 65 6e 74 73 20 6e 65 65 64 65 64  omponents needed
7f60: 20 62 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e   by System.Data.
7f70: 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 23 20  SQLite..      # 
7f80: 20 20 20 20 20 20 61 72 65 20 6d 69 73 73 69 6e        are missin
7f90: 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
7fa0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
7fb0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
7fc0: 72 6f 63 20 69 73 52 65 6c 65 61 73 65 41 76 61  roc isReleaseAva
7fd0: 69 6c 61 62 6c 65 20 7b 20 64 69 72 65 63 74 6f  ilable { directo
7fe0: 72 79 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d 20  ry {varName ""} 
7ff0: 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
8000: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76  string length $v
8010: 61 72 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65  arName] > 0} the
8020: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
8030: 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 24 76  ar 1 $varName $v
8040: 61 72 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d  arName..      }.
8050: 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
8060: 5b 69 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c  [isBuildAvailabl
8070: 65 20 22 22 20 66 61 6c 73 65 20 24 64 69 72 65  e "" false $dire
8080: 63 74 6f 72 79 20 24 76 61 72 4e 61 6d 65 5d 0d  ctory $varName].
8090: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
80a0: 72 6f 63 20 6a 6f 69 6e 42 75 69 6c 64 44 69 72  roc joinBuildDir
80b0: 65 63 74 6f 72 79 20 7b 20 6e 61 74 69 76 65 20  ectory { native 
80c0: 70 61 74 68 20 79 65 61 72 20 70 6c 61 74 66 6f  path year platfo
80d0: 72 6d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  rm configuration
80e0: 20 65 78 74 72 61 20 7d 20 7b 0d 0a 20 20 20 20   extra } {..    
80f0: 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
8100: 45 3a 20 46 69 67 75 72 65 20 6f 75 74 20 61 6e  E: Figure out an
8110: 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  d then return th
8120: 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
8130: 64 20 70 61 74 68 20 74 6f 20 74 68 65 20 62 75  d path to the bu
8140: 69 6c 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ild..      #    
8150: 20 20 20 64 69 72 65 63 74 6f 72 79 20 62 61 73     directory bas
8160: 65 64 20 6f 6e 20 61 6c 6c 20 74 68 65 20 61 72  ed on all the ar
8170: 67 75 6d 65 6e 74 73 20 70 72 6f 76 69 64 65 64  guments provided
8180: 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   by our caller..
8190: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
81a0: 69 66 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65  if {$native} the
81b0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
81c0: 75 72 6e 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24  urn [file join $
81d0: 70 61 74 68 20 62 69 6e 20 24 79 65 61 72 20 24  path bin $year $
81e0: 70 6c 61 74 66 6f 72 6d 20 24 63 6f 6e 66 69 67  platform $config
81f0: 75 72 61 74 69 6f 6e 20 24 65 78 74 72 61 5d 0d  uration $extra].
8200: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
8210: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8220: 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
8230: 20 62 69 6e 20 24 79 65 61 72 20 24 63 6f 6e 66   bin $year $conf
8240: 69 67 75 72 61 74 69 6f 6e 20 62 69 6e 20 24 65  iguration bin $e
8250: 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  xtra]..      }..
8260: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
8270: 6f 63 20 67 65 74 42 75 69 6c 64 44 69 72 65 63  oc getBuildDirec
8280: 74 6f 72 79 20 7b 20 6d 61 6e 61 67 65 64 4f 6e  tory { managedOn
8290: 6c 79 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  ly } {..      #.
82a0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53  .      # NOTE: S
82b0: 65 65 20 69 66 20 74 68 65 20 22 6e 61 74 69 76  ee if the "nativ
82c0: 65 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  e" runtime optio
82d0: 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  n has been set. 
82e0: 20 49 66 20 73 6f 2c 20 75 73 65 20 74 68 65 0d   If so, use the.
82f0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
8300: 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65  irectory for the
8310: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
8320: 6d 62 6c 79 20 28 61 2e 6b 2e 61 2e 20 74 68 65  mbly (a.k.a. the
8330: 20 6e 61 74 69 76 65 20 69 6e 74 65 72 6f 70 0d   native interop.
8340: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61  .      #       a
8350: 73 73 65 6d 62 6c 79 29 2e 20 20 54 6f 20 65 6e  ssembly).  To en
8360: 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  able this option
8370: 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e 64   via the command
8380: 20 6c 69 6e 65 2c 20 65 6e 74 65 72 20 61 0d 0a   line, enter a..
8390: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
83a0: 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74 6f  mmand similar to
83b0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
83c0: 6f 77 69 6e 67 20 28 61 6c 6c 20 6f 6e 20 6f 6e  owing (all on on
83d0: 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20 20  e line):..      
83e0: 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  #..      #      
83f0: 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 20   EagleShell.exe 
8400: 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 72 75 6e  -initialize -run
8410: 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
8420: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
8430: 20 20 20 2d 66 69 6c 65 20 2e 5c 70 61 74 68 5c     -file .\path\
8440: 74 6f 5c 61 6c 6c 2e 65 61 67 6c 65 0d 0a 20 20  to\all.eagle..  
8450: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 20      #..      #  
8460: 20 20 20 20 20 54 6f 20 65 6e 61 62 6c 65 20 74       To enable t
8470: 68 69 73 20 6f 70 74 69 6f 6e 20 76 69 61 20 74  his option via t
8480: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
8490: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 22 62 65  prior to the "be
84a0: 74 61 20 31 36 22 0d 0a 20 20 20 20 20 20 23 20  ta 16"..      # 
84b0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 6f 66        release of
84c0: 20 45 61 67 6c 65 2c 20 74 68 65 20 66 6f 6c 6c   Eagle, the foll
84d0: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6d 75  owing command mu
84e0: 73 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  st be used inste
84f0: 61 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ad..      #     
8500: 20 20 28 61 6c 73 6f 20 61 6c 6c 20 6f 6e 20 6f    (also all on o
8510: 6e 65 20 6c 69 6e 65 29 3a 0d 0a 20 20 20 20 20  ne line):..     
8520: 20 23 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20   #..      #     
8530: 20 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65    EagleShell.exe
8540: 20 2d 69 6e 69 74 69 61 6c 69 7a 65 20 2d 70 6f   -initialize -po
8550: 73 74 49 6e 69 74 69 61 6c 69 7a 65 0d 0a 20 20  stInitialize..  
8560: 20 20 20 20 23 20 20 20 20 20 20 20 20 20 22 6f      #         "o
8570: 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 49 6e 74  bject invoke Int
8580: 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
8590: 76 65 20 41 64 64 52 75 6e 74 69 6d 65 4f 70 74  ve AddRuntimeOpt
85a0: 69 6f 6e 20 6e 61 74 69 76 65 22 0d 0a 20 20 20  ion native"..   
85b0: 20 20 20 23 20 20 20 20 20 20 20 20 20 2d 66 69     #         -fi
85c0: 6c 65 20 2e 5c 70 61 74 68 5c 74 6f 5c 61 6c 6c  le .\path\to\all
85d0: 2e 65 61 67 6c 65 0d 0a 20 20 20 20 20 20 23 0d  .eagle..      #.
85e0: 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  .      if {[info
85f0: 20 65 78 69 73 74 73 20 3a 3a 62 75 69 6c 64 5f   exists ::build_
8600: 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d  directory] && \.
8610: 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69  .          [stri
8620: 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 62 75 69  ng length $::bui
8630: 6c 64 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20  ld_directory] > 
8640: 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
8650: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8660: 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69  NOTE: The locati
8670: 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 64 20  on of the build 
8680: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
8690: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
86a0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
86b0: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
86c0: 74 20 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20  t verbatim...   
86d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
86e0: 72 65 74 75 72 6e 20 24 3a 3a 62 75 69 6c 64 5f  return $::build_
86f0: 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  directory..     
8700: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
8710: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8720: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
8730: 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
8740: 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 74 68 65  tion is set, the
8750: 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73 65   mixed-mode asse
8760: 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20 23 20  mbly..        # 
8770: 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20 74        is being t
8780: 65 73 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20  ested.  In that 
8790: 63 61 73 65 2c 20 74 68 65 20 70 61 74 68 20 74  case, the path t
87a0: 6f 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65  o the build dire
87b0: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 23  ctory..        #
87c0: 20 20 20 20 20 20 20 77 69 6c 6c 20 63 6f 6e 74         will cont
87d0: 61 69 6e 20 74 68 65 20 70 6c 61 74 66 6f 72 6d  ain the platform
87e0: 20 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 74 68   name and all th
87f0: 65 20 62 69 6e 61 72 69 65 73 20 75 6e 64 65 72  e binaries under
8800: 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20 20 23   test..        #
8810: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
8820: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 61 74   present in that
8830: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 49 66 20   directory.  If 
8840: 74 68 65 20 22 6e 61 74 69 76 65 22 20 72 75 6e  the "native" run
8850: 74 69 6d 65 0d 0a 20 20 20 20 20 20 20 20 23 20  time..        # 
8860: 20 20 20 20 20 20 6f 70 74 69 6f 6e 20 69 73 20        option is 
8870: 6e 6f 74 20 73 65 74 2c 20 74 68 65 20 62 75 69  not set, the bui
8880: 6c 64 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  ld directory wil
8890: 6c 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  l be considered 
88a0: 74 6f 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23  to be..        #
88b0: 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d         "platform
88c0: 2d 6e 65 75 74 72 61 6c 22 2c 20 77 69 74 68 20  -neutral", with 
88d0: 74 68 65 20 6e 6f 74 61 62 6c 65 20 65 78 63 65  the notable exce
88e0: 70 74 69 6f 6e 20 6f 66 20 61 6e 79 20 6e 61 74  ption of any nat
88f0: 69 76 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ive..        #  
8900: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 20 28 65       assembly (e
8910: 2e 67 2e 20 22 53 51 4c 69 74 65 2e 49 6e 74 65  .g. "SQLite.Inte
8920: 72 6f 70 2e 64 6c 6c 22 29 20 63 6f 70 69 65 64  rop.dll") copied
8930: 20 74 68 65 72 65 20 64 75 72 69 6e 67 20 74 68   there during th
8940: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
8950: 20 20 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73     build process
8960: 20 69 74 73 65 6c 66 2e 20 20 49 66 20 74 68 65   itself.  If the
8970: 20 62 75 69 6c 64 20 70 72 6f 63 65 73 73 20 73   build process s
8980: 6f 6d 65 68 6f 77 20 64 6f 65 73 20 6e 6f 74 0d  omehow does not.
8990: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
89a0: 20 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65   copy the native
89b0: 20 61 73 73 65 6d 62 6c 79 20 66 6f 72 20 74 68   assembly for th
89c0: 69 73 20 70 6c 61 74 66 6f 72 6d 2c 20 6d 6f 73  is platform, mos
89d0: 74 20 6f 66 20 74 68 65 20 74 65 73 74 73 0d 0a  t of the tests..
89e0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
89f0: 69 6e 20 74 68 65 20 73 75 69 74 65 20 77 69 6c  in the suite wil
8a00: 6c 20 73 69 6d 70 6c 79 20 62 65 20 73 6b 69 70  l simply be skip
8a10: 70 65 64 2e 20 20 47 65 6e 65 72 61 6c 6c 79 20  ped.  Generally 
8a20: 73 70 65 61 6b 69 6e 67 2c 20 74 68 65 72 65 0d  speaking, there.
8a30: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8a40: 20 61 72 65 20 74 77 6f 20 77 61 79 73 20 74 6f   are two ways to
8a50: 20 62 75 69 6c 64 20 74 68 65 20 62 69 6e 61 72   build the binar
8a60: 69 65 73 20 77 68 65 6e 20 70 72 65 70 61 72 69  ies when prepari
8a70: 6e 67 20 74 6f 20 72 75 6e 20 74 68 65 0d 0a 20  ng to run the.. 
8a80: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
8a90: 65 73 74 20 73 75 69 74 65 3a 0d 0a 20 20 20 20  est suite:..    
8aa0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
8ab0: 20 20 20 20 20 20 20 31 2e 20 42 75 69 6c 64 20         1. Build 
8ac0: 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 61 6e  the separate man
8ad0: 61 67 65 64 20 61 6e 64 20 6e 61 74 69 76 65 20  aged and native 
8ae0: 61 73 73 65 6d 62 6c 69 65 73 20 75 73 69 6e 67  assemblies using
8af0: 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   some..        #
8b00: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
8b10: 64 73 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0d 0a  ds similar to:..
8b20: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
8b30: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 62 75     #          bu
8b40: 69 6c 64 2e 62 61 74 20 24 7b 43 6f 6e 66 69 67  ild.bat ${Config
8b50: 75 72 61 74 69 6f 6e 7d 4d 61 6e 61 67 65 64 4f  uration}ManagedO
8b60: 6e 6c 79 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 0d  nly ${Platform}.
8b70: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8b80: 20 20 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b      build.bat ${
8b90: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 4e 61  Configuration}Na
8ba0: 74 69 76 65 4f 6e 6c 79 20 24 7b 50 6c 61 74 66  tiveOnly ${Platf
8bb0: 6f 72 6d 7d 0d 0a 20 20 20 20 20 20 20 20 23 0d  orm}..        #.
8bc0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8bd0: 20 20 20 20 57 68 65 72 65 20 24 7b 43 6f 6e 66      Where ${Conf
8be0: 69 67 75 72 61 74 69 6f 6e 7d 20 69 73 20 65 69  iguration} is ei
8bf0: 74 68 65 72 20 22 44 65 62 75 67 22 20 6f 72 20  ther "Debug" or 
8c00: 22 52 65 6c 65 61 73 65 22 20 61 6e 64 0d 0a 20  "Release" and.. 
8c10: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
8c20: 20 20 24 7b 50 6c 61 74 66 6f 72 6d 7d 20 69 73    ${Platform} is
8c30: 20 65 69 74 68 65 72 20 22 57 69 6e 33 32 22 20   either "Win32" 
8c40: 6f 72 20 22 78 36 34 22 2e 0d 0a 20 20 20 20 20  or "x64"...     
8c50: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
8c60: 20 20 20 20 20 20 32 2e 20 42 75 69 6c 64 20 74        2. Build t
8c70: 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
8c80: 73 65 6d 62 6c 79 20 75 73 69 6e 67 20 61 20 63  sembly using a c
8c90: 6f 6d 6d 61 6e 64 20 73 69 6d 69 6c 61 72 20 74  ommand similar t
8ca0: 6f 3a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  o:..        #.. 
8cb0: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
8cc0: 20 20 62 75 69 6c 64 2e 62 61 74 20 24 7b 43 6f    build.bat ${Co
8cd0: 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 24 7b 50  nfiguration} ${P
8ce0: 6c 61 74 66 6f 72 6d 7d 0d 0a 20 20 20 20 20 20  latform}..      
8cf0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 20    #..        #  
8d00: 20 20 20 20 20 20 20 20 57 68 65 72 65 20 24 7b          Where ${
8d10: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 7d 20 69  Configuration} i
8d20: 73 20 65 69 74 68 65 72 20 22 44 65 62 75 67 22  s either "Debug"
8d30: 20 6f 72 20 22 52 65 6c 65 61 73 65 22 20 61 6e   or "Release" an
8d40: 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
8d50: 20 20 20 20 20 20 24 7b 50 6c 61 74 66 6f 72 6d        ${Platform
8d60: 7d 20 69 73 20 65 69 74 68 65 72 20 22 57 69 6e  } is either "Win
8d70: 33 32 22 20 6f 72 20 22 78 36 34 22 2e 20 20 49  32" or "x64".  I
8d80: 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  f this command i
8d90: 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  s..        #    
8da0: 20 20 20 20 20 20 75 73 65 64 2c 20 76 61 72 69        used, vari
8db0: 6f 75 73 20 74 65 73 74 73 20 74 68 61 74 20 72  ous tests that r
8dc0: 65 71 75 69 72 65 20 73 75 70 70 6c 65 6d 65 6e  equire supplemen
8dd0: 74 61 72 79 20 6d 61 6e 61 67 65 64 0d 0a 20 20  tary managed..  
8de0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
8df0: 20 61 73 73 65 6d 62 6c 69 65 73 20 28 65 2e 67   assemblies (e.g
8e00: 2e 20 4c 49 4e 51 29 20 6d 61 79 20 62 65 20 73  . LINQ) may be s
8e10: 6b 69 70 70 65 64 20 75 6e 6c 65 73 73 20 74 68  kipped unless th
8e20: 6f 73 65 20 62 69 6e 61 72 69 65 73 0d 0a 20 20  ose binaries..  
8e30: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
8e40: 20 61 72 65 20 73 75 62 73 65 71 75 65 6e 74 6c   are subsequentl
8e50: 79 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  y copied into th
8e60: 65 20 63 6f 72 72 65 63 74 20 64 69 72 65 63 74  e correct direct
8e70: 6f 72 79 20 28 69 2e 65 2e 20 62 79 0d 0a 20 20  ory (i.e. by..  
8e80: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20        #         
8e90: 20 22 74 65 73 74 5f 61 6c 6c 2e 62 61 74 22 29   "test_all.bat")
8ea0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
8eb0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 4e 6f        #       No
8ec0: 74 65 20 74 68 61 74 20 61 6c 6c 20 6f 66 20 74  te that all of t
8ed0: 68 65 20 62 75 69 6c 64 20 63 6f 6d 6d 61 6e 64  he build command
8ee0: 73 20 61 62 6f 76 65 20 77 69 6c 6c 20 64 65 66  s above will def
8ef0: 61 75 6c 74 20 74 6f 20 75 73 69 6e 67 0d 0a 20  ault to using.. 
8f00: 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
8f10: 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
8f20: 6e 20 6f 66 20 4d 53 42 75 69 6c 64 20 61 76 61  n of MSBuild ava
8f30: 69 6c 61 62 6c 65 20 61 6e 64 20 74 68 65 20 22  ilable and the "
8f40: 74 65 73 74 5f 79 65 61 72 22 20 6d 61 79 0d 0a  test_year" may..
8f50: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
8f60: 6e 65 65 64 20 74 6f 20 62 65 20 61 64 6a 75 73  need to be adjus
8f70: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ted accordingly 
8f80: 74 6f 20 61 63 74 75 61 6c 6c 79 20 72 75 6e 20  to actually run 
8f90: 74 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d  the test suite..
8fa0: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
8fb0: 20 52 65 66 65 72 20 74 6f 20 74 68 65 20 63 6f   Refer to the co
8fc0: 6d 6d 65 6e 74 73 20 69 6e 20 5b 67 65 74 42 75  mments in [getBu
8fd0: 69 6c 64 59 65 61 72 5d 20 66 6f 72 20 6d 6f 72  ildYear] for mor
8fe0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
8ff0: 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
9000: 20 20 68 6f 77 20 74 6f 20 73 65 74 20 74 68 69    how to set thi
9010: 73 20 76 61 72 69 61 62 6c 65 2e 0d 0a 20 20 20  s variable...   
9020: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
9030: 73 65 74 20 6e 61 74 69 76 65 20 5b 65 78 70 72  set native [expr
9040: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 21 24   {..          !$
9050: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 26 26 20 28  managedOnly && (
9060: 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 5d  [getBuildNative]
9070: 20 7c 7c 20 5b 68 61 73 52 75 6e 74 69 6d 65 4f   || [hasRuntimeO
9080: 70 74 69 6f 6e 20 6e 61 74 69 76 65 5d 29 0d 0a  ption native])..
9090: 20 20 20 20 20 20 20 20 7d 5d 0d 0a 0d 0a 20 20          }]....  
90a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6a 6f        return [jo
90b0: 69 6e 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79  inBuildDirectory
90c0: 20 24 6e 61 74 69 76 65 20 5b 67 65 74 42 75 69   $native [getBui
90d0: 6c 64 42 61 73 65 44 69 72 65 63 74 6f 72 79 5d  ldBaseDirectory]
90e0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
90f0: 5b 65 78 70 72 20 7b 24 6d 61 6e 61 67 65 64 4f  [expr {$managedO
9100: 6e 6c 79 20 3f 20 5b 67 65 74 42 75 69 6c 64 59  nly ? [getBuildY
9110: 65 61 72 5d 20 3a 20 5b 67 65 74 42 75 69 6c 64  ear] : [getBuild
9120: 4e 61 74 69 76 65 59 65 61 72 5d 7d 5d 20 5c 0d  NativeYear]}] \.
9130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65  .            [ge
9140: 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20 24  tBuildPlatform $
9150: 6e 61 74 69 76 65 5d 20 5b 61 70 70 65 6e 64 41  native] [appendA
9160: 72 67 73 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e  rgs [getBuildCon
9170: 66 69 67 75 72 61 74 69 6f 6e 5d 20 5c 0d 0a 20  figuration] \.. 
9180: 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
9190: 20 7b 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 3f   {$managedOnly ?
91a0: 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69 67   [getBuildConfig
91b0: 75 72 61 74 69 6f 6e 53 75 66 66 69 78 5d 20 3a  urationSuffix] :
91c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
91d0: 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 43  [getBuildNativeC
91e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66  onfigurationSuff
91f0: 69 78 5d 7d 5d 5d 20 5b 65 78 70 72 20 7b 24 6d  ix]}]] [expr {$m
9200: 61 6e 61 67 65 64 4f 6e 6c 79 20 3f 20 5c 0d 0a  anagedOnly ? \..
9210: 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
9220: 42 75 69 6c 64 45 78 74 72 61 5d 20 3a 20 22 22  BuildExtra] : ""
9230: 7d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  }]]..      }..  
9240: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9250: 20 67 65 74 52 65 6c 65 61 73 65 56 65 72 73 69   getReleaseVersi
9260: 6f 6e 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23  on {} {..      #
9270: 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
9280: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
9290: 65 6c 65 61 73 65 20 76 65 72 73 69 6f 6e 20 66  elease version f
92a0: 6f 72 20 75 73 65 20 77 69 74 68 20 74 68 65 20  or use with the 
92b0: 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d  build directory.
92c0: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
92d0: 68 65 6e 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  hen checking for
92e0: 20 61 76 61 69 6c 61 62 6c 65 20 72 65 6c 65 61   available relea
92f0: 73 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ses...      #.. 
9300: 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
9310: 78 69 73 74 73 20 3a 3a 72 65 6c 65 61 73 65 5f  xists ::release_
9320: 76 65 72 73 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  version] && \.. 
9330: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
9340: 20 6c 65 6e 67 74 68 20 24 3a 3a 72 65 6c 65 61   length $::relea
9350: 73 65 5f 76 65 72 73 69 6f 6e 5d 20 3e 20 30 7d  se_version] > 0}
9360: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
9370: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9380: 54 45 3a 20 54 68 65 20 72 65 6c 65 61 73 65 20  TE: The release 
9390: 76 65 72 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  version has been
93a0: 20 6f 76 65 72 72 69 64 64 65 6e 3b 20 74 68 65   overridden; the
93b0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 0d 0a  refore, use it..
93c0: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
93d0: 76 65 72 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20  verbatim...     
93e0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
93f0: 74 75 72 6e 20 24 3a 3a 72 65 6c 65 61 73 65 5f  turn $::release_
9400: 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 7d  version..      }
9410: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
9420: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
9430: 54 45 3a 20 4e 6f 20 72 65 6c 65 61 73 65 20 76  TE: No release v
9440: 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
9450: 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ble, return an e
9460: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20  mpty string...  
9470: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 49 74        #       It
9480: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
9490: 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74 79   return an empty
94a0: 20 73 74 72 69 6e 67 20 68 65 72 65 20 62 65 63   string here bec
94b0: 61 75 73 65 20 74 68 65 0d 0a 20 20 20 20 20 20  ause the..      
94c0: 20 20 23 20 20 20 20 20 20 20 72 65 73 75 6c 74    #       result
94d0: 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
94e0: 72 65 20 6d 61 79 20 62 65 20 75 73 65 64 20 77  re may be used w
94f0: 69 74 68 20 5b 66 69 6c 65 20 6a 6f 69 6e 5d 2e  ith [file join].
9500: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
9510: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d 0a       return ""..
9520: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
9530: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 42  ...    proc getB
9540: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 7b 20 66  uildFileName { f
9550: 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f  ileName managedO
9560: 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22  nly {platform ""
9570: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
9580: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
9590: 74 75 72 6e 73 20 74 68 65 20 73 70 65 63 69 66  turns the specif
95a0: 69 65 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ied file name as
95b0: 20 69 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61   if it were loca
95c0: 74 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20  ted in the..    
95d0: 20 20 23 20 20 20 20 20 20 20 62 75 69 6c 64 20    #       build 
95e0: 64 69 72 65 63 74 6f 72 79 2c 20 64 69 73 63 61  directory, disca
95f0: 72 64 69 6e 67 20 61 6e 79 20 64 69 72 65 63 74  rding any direct
9600: 6f 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ory information 
9610: 70 72 65 73 65 6e 74 0d 0a 20 20 20 20 20 20 23  present..      #
9620: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 66 69         in the fi
9630: 6c 65 20 6e 61 6d 65 20 61 73 20 70 72 6f 76 69  le name as provi
9640: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
9650: 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  r...      #..   
9660: 20 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 66     set result [f
9670: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c  ile nativename \
9680: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
9690: 65 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64  e join [getBuild
96a0: 44 69 72 65 63 74 6f 72 79 20 24 6d 61 6e 61 67  Directory $manag
96b0: 65 64 4f 6e 6c 79 5d 20 24 70 6c 61 74 66 6f 72  edOnly] $platfor
96c0: 6d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  m \..          [
96d0: 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65 4e  file tail $fileN
96e0: 61 6d 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ame]]]....      
96f0: 23 0d 0a 20 20 20 20 20 20 23 20 48 41 43 4b 3a  #..      # HACK:
9700: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 6f 6e   When running on
9710: 20 57 6f 57 36 34 2c 20 61 73 73 75 6d 65 20 74   WoW64, assume t
9720: 68 65 20 74 65 73 74 20 65 78 65 63 75 74 61 62  he test executab
9730: 6c 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 0d  les are present.
9740: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77  .      #       w
9750: 69 74 68 20 74 68 65 20 22 33 32 22 20 73 75 66  ith the "32" suf
9760: 66 69 78 20 6f 6e 20 74 68 65 6d 2e 0d 0a 20 20  fix on them...  
9770: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
9780: 7b 5b 69 73 52 75 6e 6e 69 6e 67 57 6f 57 36 34  {[isRunningWoW64
9790: 5d 20 26 26 20 5b 66 69 6c 65 20 65 78 74 65 6e  ] && [file exten
97a0: 73 69 6f 6e 20 24 72 65 73 75 6c 74 5d 20 65 71  sion $result] eq
97b0: 20 22 2e 65 78 65 22 7d 20 74 68 65 6e 20 7b 0d   ".exe"} then {.
97c0: 0a 20 20 20 20 20 20 20 20 73 65 74 20 72 65 73  .        set res
97d0: 75 6c 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  ult [appendArgs 
97e0: 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 24  [file rootname $
97f0: 72 65 73 75 6c 74 5d 20 33 32 2e 65 78 65 5d 0d  result] 32.exe].
9800: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
9810: 20 20 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74    return $result
9820: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
9830: 70 72 6f 63 20 67 65 74 45 78 74 65 72 6e 61 6c  proc getExternal
9840: 44 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a  Directory {} {..
9850: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
9860: 20 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63   NOTE: This proc
9870: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
9880: 65 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72  e directory wher
9890: 65 20 74 68 65 20 65 78 74 65 72 6e 61 6c 20 62  e the external b
98a0: 69 6e 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20  inary..      #  
98b0: 20 20 20 20 20 66 69 6c 65 73 20 61 72 65 20 6c       files are l
98c0: 6f 63 61 74 65 64 2e 0d 0a 20 20 20 20 20 20 23  ocated...      #
98d0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b  ..      return [
98e0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
98f0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
9900: 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65  le dirname [file
9910: 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65 20 64   dirname [file d
9920: 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 62 69 6e  irname [info bin
9930: 61 72 79 5d 5d 5d 5d 5d 0d 0a 20 20 20 20 7d 0d  ary]]]]]..    }.
9940: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
9950: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 20  BinaryDirectory 
9960: 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20  {} {..      #.. 
9970: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69       # NOTE: Thi
9980: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
9990: 72 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  rns the director
99a0: 79 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74  y where the test
99b0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20   application..  
99c0: 20 20 20 20 23 20 20 20 20 20 20 20 69 74 73 65      #       itse
99d0: 6c 66 20 28 69 2e 65 2e 20 74 68 65 20 45 61 67  lf (i.e. the Eag
99e0: 6c 65 20 73 68 65 6c 6c 29 20 69 73 20 6c 6f 63  le shell) is loc
99f0: 61 74 65 64 2e 20 20 54 68 69 73 20 77 69 6c 6c  ated.  This will
9a00: 20 62 65 20 75 73 65 64 20 61 73 0d 0a 20 20 20   be used as..   
9a10: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 64     #       the d
9a20: 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 74  estination for t
9a30: 68 65 20 63 6f 70 69 65 64 20 53 79 73 74 65 6d  he copied System
9a40: 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6e 61 74  .Data.SQLite nat
9a50: 69 76 65 20 61 6e 64 0d 0a 20 20 20 20 20 20 23  ive and..      #
9a60: 20 20 20 20 20 20 20 6d 61 6e 61 67 65 64 20 61         managed a
9a70: 73 73 65 6d 62 6c 69 65 73 20 28 69 2e 65 2e 20  ssemblies (i.e. 
9a80: 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20  because this is 
9a90: 6f 6e 65 20 6f 66 20 74 68 65 20 66 65 77 20 70  one of the few p
9aa0: 6c 61 63 65 73 0d 0a 20 20 20 20 20 20 23 20 20  laces..      #  
9ab0: 20 20 20 20 20 77 68 65 72 65 20 74 68 65 20 43       where the C
9ac0: 4c 52 20 77 69 6c 6c 20 61 63 74 75 61 6c 6c 79  LR will actually
9ad0: 20 66 69 6e 64 20 61 6e 64 20 6c 6f 61 64 20 74   find and load t
9ae0: 68 65 6d 20 70 72 6f 70 65 72 6c 79 29 2e 0d 0a  hem properly)...
9af0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
9b00: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
9b10: 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65 63 74 6f  ::binary_directo
9b20: 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  ry] && \..      
9b30: 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
9b40: 74 68 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72  th $::binary_dir
9b50: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
9b60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
9b70: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
9b80: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
9b90: 74 68 65 20 62 69 6e 61 72 79 20 64 69 72 65 63  the binary direc
9ba0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
9bb0: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
9bc0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
9bd0: 66 6f 72 65 2c 20 75 73 65 20 69 74 20 76 65 72  fore, use it ver
9be0: 62 61 74 69 6d 2e 0d 0a 20 20 20 20 20 20 20 20  batim...        
9bf0: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
9c00: 6e 20 24 3a 3a 62 69 6e 61 72 79 5f 64 69 72 65  n $::binary_dire
9c10: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  ctory..      } e
9c20: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  lse {..        r
9c30: 65 74 75 72 6e 20 5b 69 6e 66 6f 20 62 69 6e 61  eturn [info bina
9c40: 72 79 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  ry]..      }..  
9c50: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
9c60: 20 67 65 74 45 78 74 65 72 6e 61 6c 46 69 6c 65   getExternalFile
9c70: 4e 61 6d 65 20 7b 20 66 69 6c 65 4e 61 6d 65 20  Name { fileName 
9c80: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
9c90: 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75      # NOTE: Retu
9ca0: 72 6e 73 20 74 68 65 20 73 70 65 63 69 66 69 65  rns the specifie
9cb0: 64 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 69  d file name as i
9cc0: 66 20 69 74 20 77 65 72 65 20 6c 6f 63 61 74 65  f it were locate
9cd0: 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20 20  d in the..      
9ce0: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
9cf0: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
9d00: 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
9d10: 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  es...      #..  
9d20: 20 20 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65      return [file
9d30: 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
9d40: 65 20 6a 6f 69 6e 20 5b 67 65 74 45 78 74 65 72  e join [getExter
9d50: 6e 61 6c 44 69 72 65 63 74 6f 72 79 5d 20 24 66  nalDirectory] $f
9d60: 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 7d  ileName]]..    }
9d70: 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
9d80: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
9d90: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
9da0: 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  form ""} } {..  
9db0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
9dc0: 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68 65  OTE: Returns the
9dd0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
9de0: 6e 61 6d 65 20 61 73 20 69 66 20 69 74 20 77 65  name as if it we
9df0: 72 65 20 6c 6f 63 61 74 65 64 20 69 6e 20 74 68  re located in th
9e00: 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
9e10: 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72   binary director
9e20: 79 2c 20 64 69 73 63 61 72 64 69 6e 67 20 61 6e  y, discarding an
9e30: 79 20 64 69 72 65 63 74 6f 72 79 20 69 6e 66 6f  y directory info
9e40: 72 6d 61 74 69 6f 6e 20 70 72 65 73 65 6e 74 0d  rmation present.
9e50: 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69  .      #       i
9e60: 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  n the file name 
9e70: 61 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 6f  as provided by o
9e80: 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20  ur caller...    
9e90: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
9ea0: 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  n [file nativena
9eb0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
9ec0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42  [file join [getB
9ed0: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20  inaryDirectory] 
9ee0: 24 70 6c 61 74 66 6f 72 6d 20 5b 66 69 6c 65 20  $platform [file 
9ef0: 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d  tail $fileName]]
9f00: 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  ]..    }.....   
9f10: 20 70 72 6f 63 20 67 65 74 43 6f 72 65 42 69 6e   proc getCoreBin
9f20: 61 72 79 46 69 6c 65 4e 61 6d 65 20 7b 20 7b 70  aryFileName { {p
9f30: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 73 74 61  latform ""} {sta
9f40: 6e 64 61 72 64 20 22 22 7d 20 7d 20 7b 0d 0a 20  ndard ""} } {.. 
9f50: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
9f60: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 73 20 74 68  NOTE: Returns th
9f70: 65 20 66 75 6c 6c 20 70 61 74 68 20 66 6f 72 20  e full path for 
9f80: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
9f90: 69 6e 67 20 74 68 65 20 53 51 4c 69 74 65 20 63  ing the SQLite c
9fa0: 6f 72 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ore..      #    
9fb0: 20 20 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72     native librar
9fc0: 79 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  y code for this 
9fd0: 70 6c 61 74 66 6f 72 6d 2e 20 20 46 69 72 73 74  platform.  First
9fe0: 2c 20 63 68 65 63 6b 20 61 6e 64 20 73 65 65 20  , check and see 
9ff0: 69 66 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  if..      #     
a000: 20 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72    the SQLite cor
a010: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
a020: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a030: 6e 20 6c 6f 61 64 65 64 2e 20 20 4e 65 78 74 2c  n loaded.  Next,
a040: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
a050: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 77 68 61 74  fallback to what
a060: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20 73   the full path s
a070: 68 6f 75 6c 64 20 62 65 2c 20 62 61 73 65 64 20  hould be, based 
a080: 6f 6e 20 77 68 65 74 68 65 72 20 74 68 65 0d 0a  on whether the..
a090: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
a0a0: 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
a0b0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  y is being used 
a0c0: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
a0d0: 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20 20  the current..   
a0e0: 20 20 20 23 20 20 20 20 20 20 20 70 6c 61 74 66     #       platf
a0f0: 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  orm...      #.. 
a100: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
a110: 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63  {..        objec
a120: 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
a130: 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20  +NonPublic \..  
a140: 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
a150: 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e 73  .Data.SQLite.Uns
a160: 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64 73  afeNativeMethods
a170: 20 5f 53 51 4c 69 74 65 4e 61 74 69 76 65 4d 6f   _SQLiteNativeMo
a180: 64 75 6c 65 46 69 6c 65 4e 61 6d 65 0d 0a 20 20  duleFileName..  
a190: 20 20 20 20 7d 20 66 69 6c 65 4e 61 6d 65 5d 20      } fileName] 
a1a0: 3d 3d 20 30 20 26 26 20 5b 73 74 72 69 6e 67 20  == 0 && [string 
a1b0: 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65  length $fileName
a1c0: 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
a1d0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
a1e0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 53 51    # NOTE: The SQ
a1f0: 4c 69 74 65 20 63 6f 72 65 20 6e 61 74 69 76 65  Lite core native
a200: 20 6c 69 62 72 61 72 79 20 68 61 73 20 61 6c 72   library has alr
a210: 65 61 64 79 20 62 65 65 6e 20 6c 6f 61 64 65 64  eady been loaded
a220: 20 76 69 61 0d 0a 20 20 20 20 20 20 20 20 23 20   via..        # 
a230: 20 20 20 20 20 20 74 68 65 20 6e 61 74 69 76 65        the native
a240: 20 6c 69 62 72 61 72 79 20 70 72 65 2d 6c 6f 61   library pre-loa
a250: 64 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 61  der.  Return tha
a260: 74 20 66 69 6c 65 20 6e 61 6d 65 20 6e 6f 77 2e  t file name now.
a270: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
a280: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
a290: 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  eName..      }..
a2a0: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
a2b0: 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
a2c0: 22 6e 61 74 69 76 65 22 20 72 75 6e 74 69 6d 65  "native" runtime
a2d0: 20 6f 70 74 69 6f 6e 20 68 61 73 20 62 65 65 6e   option has been
a2e0: 20 73 65 74 2c 20 61 6c 77 61 79 73 20 72 65 74   set, always ret
a2f0: 75 72 6e 20 74 68 65 0d 0a 20 20 20 20 20 20 23  urn the..      #
a300: 20 20 20 20 20 20 20 66 69 6c 65 20 6e 61 6d 65         file name
a310: 20 66 6f 72 20 74 68 65 20 6d 69 78 65 64 2d 6d   for the mixed-m
a320: 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
a330: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
a340: 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74   {[hasRuntimeOpt
a350: 69 6f 6e 20 6e 61 74 69 76 65 5d 7d 20 74 68 65  ion native]} the
a360: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
a370: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a380: 52 65 74 75 72 6e 20 74 68 65 20 6d 69 78 65 64  Return the mixed
a390: 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c 79 20 66  -mode assembly f
a3a0: 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
a3b0: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
a3c0: 74 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76  turn [file nativ
a3d0: 65 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  ename \..       
a3e0: 20 20 20 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20       [file join 
a3f0: 5b 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74  [getBinaryDirect
a400: 6f 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 53  ory] $platform S
a410: 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
a420: 65 2e 64 6c 6c 5d 5d 0d 0a 20 20 20 20 20 20 7d  e.dll]]..      }
a430: 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
a440: 20 20 20 23 20 4e 4f 54 45 3a 20 41 72 65 20 77     # NOTE: Are w
a450: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
a460: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
a470: 74 65 63 74 20 77 68 65 74 68 65 72 20 6f 72 20  tect whether or 
a480: 6e 6f 74 20 74 68 65 0d 0a 20 20 20 20 20 20 23  not the..      #
a490: 20 20 20 20 20 20 20 69 6e 74 65 72 6f 70 20 61         interop a
a4a0: 73 73 65 6d 62 6c 79 20 73 68 6f 75 6c 64 20 62  ssembly should b
a4b0: 65 20 75 73 65 64 3f 0d 0a 20 20 20 20 20 20 23  e used?..      #
a4c0: 0d 0a 20 20 20 20 20 20 73 65 74 20 61 75 74 6f  ..      set auto
a4d0: 6d 61 74 69 63 20 5b 65 78 70 72 20 7b 5b 73 74  matic [expr {[st
a4e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 61  ring length $sta
a4f0: 6e 64 61 72 64 5d 20 3d 3d 20 30 7d 5d 0d 0a 0d  ndard] == 0}]...
a500: 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
a510: 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c 20 69  # NOTE: First, i
a520: 6e 20 65 69 74 68 65 72 20 22 61 75 74 6f 6d 61  n either "automa
a530: 74 69 63 22 20 6f 72 20 22 6e 6f 6e 2d 73 74 61  tic" or "non-sta
a540: 6e 64 61 72 64 22 20 6d 6f 64 65 73 2c 20 61 74  ndard" modes, at
a550: 74 65 6d 70 74 0d 0a 20 20 20 20 20 20 23 20 20  tempt..      #  
a560: 20 20 20 20 20 74 6f 20 66 69 6e 64 20 74 68 65       to find the
a570: 20 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74   native-only int
a580: 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  erop assembly...
a590: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
a5a0: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
a5b0: 20 21 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65   !$standard} the
a5c0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
a5d0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
a5e0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72  Attempt to deter
a5f0: 6d 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d  mine the native-
a600: 6f 6e 6c 79 20 69 6e 74 65 72 6f 70 20 61 73 73  only interop ass
a610: 65 6d 62 6c 79 20 66 69 6c 65 0d 0a 20 20 20 20  embly file..    
a620: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
a630: 20 66 6f 72 20 74 68 69 73 20 70 6c 61 74 66 6f   for this platfo
a640: 72 6d 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75  rm and then retu
a650: 72 6e 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20  rn it...        
a660: 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  #..        forea
a670: 63 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20  ch fileNameOnly 
a680: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
a690: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
a6a0: 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ] {..          s
a6b0: 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b 66 69 6c  et fileName [fil
a6c0: 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5c 0d 0a  e nativename \..
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
a6e0: 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 42 69 6e  ile join [getBin
a6f0: 61 72 79 44 69 72 65 63 74 6f 72 79 5d 20 24 70  aryDirectory] $p
a700: 6c 61 74 66 6f 72 6d 20 24 66 69 6c 65 4e 61 6d  latform $fileNam
a710: 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20 20 20 20 20  eOnly]]....     
a720: 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
a730: 78 69 73 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d  xists $fileName]
a740: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
a750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69        return $fi
a760: 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
a770: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
a780: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
a790: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
a7a0: 3a 20 54 68 65 6e 2c 20 69 6e 20 65 69 74 68 65  : Then, in eithe
a7b0: 72 20 22 61 75 74 6f 6d 61 74 69 63 22 20 6f 72  r "automatic" or
a7c0: 20 22 73 74 61 6e 64 61 72 64 22 20 6d 6f 64 65   "standard" mode
a7d0: 73 2c 20 61 74 74 65 6d 70 74 20 74 6f 0d 0a 20  s, attempt to.. 
a7e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6e       #       fin
a7f0: 64 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53  d the standard S
a800: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0d 0a  QLite library...
a810: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
a820: 66 20 7b 24 61 75 74 6f 6d 61 74 69 63 20 7c 7c  f {$automatic ||
a830: 20 24 73 74 61 6e 64 61 72 64 7d 20 74 68 65 6e   $standard} then
a840: 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
a850: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
a860: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
a870: 69 6e 65 20 74 68 65 20 6e 61 74 69 76 65 2d 6f  ine the native-o
a880: 6e 6c 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c  nly standard SQL
a890: 69 74 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20  ite library..   
a8a0: 20 20 20 20 20 23 20 20 20 20 20 20 20 66 69 6c       #       fil
a8b0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20  e name for this 
a8c0: 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 74 68 65  platform and the
a8d0: 6e 20 72 65 74 75 72 6e 20 69 74 2e 0d 0a 20 20  n return it...  
a8e0: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
a8f0: 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
a900: 65 4f 6e 6c 79 20 5b 67 65 74 4e 61 74 69 76 65  eOnly [getNative
a910: 4c 69 62 72 61 72 79 46 69 6c 65 4e 61 6d 65 73  LibraryFileNames
a920: 4f 6e 6c 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  Only] {..       
a930: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
a940: 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
a950: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
a960: 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65    [file join [ge
a970: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
a980: 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 66 69 6c  ] $platform $fil
a990: 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 0d 0a 0d 0a 20  eNameOnly]].... 
a9a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
a9b0: 6c 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e  le exists $fileN
a9c0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
a9d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a9e0: 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20   $fileName..    
a9f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
aa00: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
aa10: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
aa20: 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 20 6d 61  NOTE: Was the ma
aa30: 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20 63  naged assembly c
aa40: 6f 6d 70 69 6c 65 64 20 65 78 70 65 63 74 69 6e  ompiled expectin
aa50: 67 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  g to deal with t
aa60: 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
aa70: 20 20 73 74 61 6e 64 61 72 64 20 63 6f 72 65 20    standard core 
aa80: 6c 69 62 72 61 72 79 3f 0d 0a 20 20 20 20 20 20  library?..      
aa90: 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61  #..      if {[ha
aaa0: 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f  veSQLiteDefineCo
aab0: 6e 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 53 54  nstant SQLITE_ST
aac0: 41 4e 44 41 52 44 5d 7d 20 74 68 65 6e 20 7b 0d  ANDARD]} then {.
aad0: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
aae0: 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 6c 6c      # NOTE: Fall
aaf0: 62 61 63 6b 20 74 6f 20 72 65 74 75 72 6e 69 6e  back to returnin
ab00: 67 20 74 68 65 20 6e 61 74 69 76 65 2d 6f 6e 6c  g the native-onl
ab10: 79 20 73 74 61 6e 64 61 72 64 20 53 51 4c 69 74  y standard SQLit
ab20: 65 20 6c 69 62 72 61 72 79 0d 0a 20 20 20 20 20  e library..     
ab30: 20 20 20 23 20 20 20 20 20 20 20 66 69 6c 65 20     #       file 
ab40: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 70 6c 61  name for the pla
ab50: 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20 20 20 20  tform...        
ab60: 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 66  #..        set f
ab70: 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20 5b 67 65  ileNamesOnly [ge
ab80: 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79 46 69  tNativeLibraryFi
ab90: 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 0d 0a  leNamesOnly]....
aba0: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65          if {[lle
abb0: 6e 67 74 68 20 24 66 69 6c 65 4e 61 6d 65 73 4f  ngth $fileNamesO
abc0: 6e 6c 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  nly] == 0} then 
abd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  {..          ret
abe0: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 20 20  urn ""..        
abf0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74  }....        ret
ac00: 75 72 6e 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  urn [file native
ac10: 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
ac20: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
ac30: 67 65 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f  getBinaryDirecto
ac40: 72 79 5d 20 24 70 6c 61 74 66 6f 72 6d 20 5b 6c  ry] $platform [l
ac50: 69 6e 64 65 78 20 24 66 69 6c 65 4e 61 6d 65 73  index $fileNames
ac60: 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a 20 20 20 20 20  Only 0]]]..     
ac70: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
ac80: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
ac90: 4e 4f 54 45 3a 20 46 61 6c 6c 62 61 63 6b 20 74  NOTE: Fallback t
aca0: 6f 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65 20  o returning the 
acb0: 6e 61 74 69 76 65 2d 6f 6e 6c 79 20 69 6e 74 65  native-only inte
acc0: 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  rop assembly fil
acd0: 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
ace0: 20 20 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20     name for the 
acf0: 70 6c 61 74 66 6f 72 6d 2e 0d 0a 20 20 20 20 20  platform...     
ad00: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65     #..        se
ad10: 74 20 66 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 20  t fileNamesOnly 
ad20: 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
ad30: 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
ad40: 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ]....        if 
ad50: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 69 6c 65 4e  {[llength $fileN
ad60: 61 6d 65 73 4f 6e 6c 79 5d 20 3d 3d 20 30 7d 20  amesOnly] == 0} 
ad70: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
ad80: 20 20 72 65 74 75 72 6e 20 22 22 0d 0a 20 20 20    return ""..   
ad90: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
ada0: 20 20 72 65 74 75 72 6e 20 5b 66 69 6c 65 20 6e    return [file n
adb0: 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
adc0: 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
add0: 20 20 20 20 5b 67 65 74 42 69 6e 61 72 79 44 69      [getBinaryDi
ade0: 72 65 63 74 6f 72 79 5d 20 24 70 6c 61 74 66 6f  rectory] $platfo
adf0: 72 6d 20 5b 6c 69 6e 64 65 78 20 24 66 69 6c 65  rm [lindex $file
ae00: 4e 61 6d 65 73 4f 6e 6c 79 20 30 5d 5d 5d 0d 0a  NamesOnly 0]]]..
ae10: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ae20: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 43  ...    proc getC
ae30: 6f 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 20 7b  ommonDirectory {
ae40: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
ae50: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
ae60: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
ae70: 6e 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ns the directory
ae80: 20 77 68 65 72 65 20 74 68 65 20 74 65 73 74 20   where the test 
ae90: 73 63 72 69 70 74 73 0d 0a 20 20 20 20 20 20 23  scripts..      #
aea0: 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
aeb0: 20 6c 6f 63 61 74 65 64 2e 20 20 42 79 20 64 65   located.  By de
aec0: 66 61 75 6c 74 2c 20 74 68 69 73 20 6a 75 73 74  fault, this just
aed0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 45 61 67   returns the Eag
aee0: 6c 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  le..      #     
aef0: 20 20 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f    binary directo
af00: 72 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ry...      #..  
af10: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
af20: 69 73 74 73 20 3a 3a 63 6f 6d 6d 6f 6e 5f 64 69  ists ::common_di
af30: 72 65 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20  rectory] && \.. 
af40: 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
af50: 20 6c 65 6e 67 74 68 20 24 3a 3a 63 6f 6d 6d 6f   length $::commo
af60: 6e 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30  n_directory] > 0
af70: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
af80: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
af90: 4f 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f  OTE: The locatio
afa0: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  n of the common 
afb0: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
afc0: 65 6e 20 73 65 74 3b 0d 0a 20 20 20 20 20 20 20  en set;..       
afd0: 20 23 20 20 20 20 20 20 20 74 68 65 72 65 66 6f   #       therefo
afe0: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
aff0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b000: 72 65 74 75 72 6e 20 24 3a 3a 63 6f 6d 6d 6f 6e  return $::common
b010: 5f 64 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  _directory..    
b020: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 69 6e 66    } elseif {[inf
b030: 6f 20 65 78 69 73 74 73 20 3a 3a 76 65 6e 64 6f  o exists ::vendo
b040: 72 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26 20  r_directory] && 
b050: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74  \..          [st
b060: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 76  ring length $::v
b070: 65 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 5d  endor_directory]
b080: 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
b090: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
b0a0: 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 6c 6f 63   # NOTE: The loc
b0b0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 65 6e  ation of the ven
b0c0: 64 6f 72 20 64 69 72 65 63 74 6f 72 79 20 68 61  dor directory ha
b0d0: 73 20 62 65 65 6e 20 73 65 74 3b 0d 0a 20 20 20  s been set;..   
b0e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
b0f0: 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d  refore, use it..
b100: 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
b110: 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 76 65      return $::ve
b120: 6e 64 6f 72 5f 64 69 72 65 63 74 6f 72 79 0d 0a  ndor_directory..
b130: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
b140: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
b150: 63 6c 5f 6c 69 62 72 61 72 79 5d 20 26 26 20 5c  cl_library] && \
b160: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73 74 72  ..          [str
b170: 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a 74 63  ing length $::tc
b180: 6c 5f 6c 69 62 72 61 72 79 5d 20 3e 20 30 20 26  l_library] > 0 &
b190: 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
b1a0: 66 69 6c 65 20 69 73 64 69 72 65 63 74 6f 72 79  file isdirectory
b1b0: 20 24 3a 3a 74 63 6c 5f 6c 69 62 72 61 72 79 5d   $::tcl_library]
b1c0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
b1d0: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
b1e0: 4f 54 45 3a 20 54 68 65 20 76 61 72 69 61 62 6c  OTE: The variabl
b1f0: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 61 74  e with the locat
b200: 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 69 70  ion of the scrip
b210: 74 20 6c 69 62 72 61 72 79 20 69 73 0d 0a 20 20  t library is..  
b220: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
b230: 74 20 61 6e 64 20 61 70 70 65 61 72 73 20 74 6f  t and appears to
b240: 20 62 65 20 61 20 72 65 61 6c 20 64 69 72 65 63   be a real direc
b250: 74 6f 72 79 20 28 69 2e 65 2e 20 6e 6f 74 20 65  tory (i.e. not e
b260: 6d 62 65 64 64 65 64 0d 0a 20 20 20 20 20 20 20  mbedded..       
b270: 20 23 20 20 20 20 20 20 20 77 69 74 68 69 6e 20   #       within 
b280: 61 20 66 69 6c 65 29 3b 20 74 68 65 72 65 66 6f  a file); therefo
b290: 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20 20 20  re, use it...   
b2a0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
b2b0: 72 65 74 75 72 6e 20 24 3a 3a 74 63 6c 5f 6c 69  return $::tcl_li
b2c0: 62 72 61 72 79 0d 0a 20 20 20 20 20 20 7d 20 65  brary..      } e
b2d0: 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  lse {..        #
b2e0: 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
b2f0: 3a 20 46 61 6c 6c 62 61 63 6b 20 74 6f 20 74 68  : Fallback to th
b300: 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
b310: 61 69 6e 69 6e 67 20 74 68 65 20 65 78 65 63 75  aining the execu
b320: 74 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  table...        
b330: 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  #..        retur
b340: 6e 20 5b 69 6e 66 6f 20 62 69 6e 61 72 79 5d 0d  n [info binary].
b350: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
b360: 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
b370: 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
b380: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
b390: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
b3a0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
b3b0: 74 75 72 6e 73 20 74 68 65 20 64 69 72 65 63 74  turns the direct
b3c0: 6f 72 79 20 77 68 65 72 65 20 74 68 65 20 74 65  ory where the te
b3d0: 73 74 20 64 61 74 61 62 61 73 65 73 0d 0a 20 20  st databases..  
b3e0: 20 20 20 20 23 20 20 20 20 20 20 20 73 68 6f 75      #       shou
b3f0: 6c 64 20 62 65 20 6c 6f 63 61 74 65 64 2e 20 20  ld be located.  
b400: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
b410: 20 6a 75 73 74 20 75 73 65 73 20 74 68 65 20 74   just uses the t
b420: 65 6d 70 6f 72 61 72 79 0d 0a 20 20 20 20 20 20  emporary..      
b430: 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  #       director
b440: 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  y configured for
b450: 20 74 68 69 73 20 73 79 73 74 65 6d 2e 0d 0a 20   this system... 
b460: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
b470: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
b480: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
b490: 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  ory] && \..     
b4a0: 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
b4b0: 67 74 68 20 24 3a 3a 64 61 74 61 62 61 73 65 5f  gth $::database_
b4c0: 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20  directory] > 0} 
b4d0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
b4e0: 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
b4f0: 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  E: The location 
b500: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
b510: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
b520: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
b530: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b540: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
b550: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
b560: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
b570: 3a 64 61 74 61 62 61 73 65 5f 64 69 72 65 63 74  :database_direct
b580: 6f 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  ory..      } els
b590: 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74  eif {[info exist
b5a0: 73 20 3a 3a 73 63 72 61 74 63 68 5f 64 69 72 65  s ::scratch_dire
b5b0: 63 74 6f 72 79 5d 20 26 26 20 5c 0d 0a 20 20 20  ctory] && \..   
b5c0: 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
b5d0: 65 6e 67 74 68 20 24 3a 3a 73 63 72 61 74 63 68  ength $::scratch
b5e0: 5f 64 69 72 65 63 74 6f 72 79 5d 20 3e 20 30 7d  _directory] > 0}
b5f0: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
b600: 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
b610: 54 45 3a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e  TE: The location
b620: 20 6f 66 20 74 68 65 20 73 63 72 61 74 63 68 20   of the scratch 
b630: 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
b640: 65 6e 20 6f 76 65 72 72 69 64 64 65 6e 3b 0d 0a  en overridden;..
b650: 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
b660: 74 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  therefore, use i
b670: 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  t...        #.. 
b680: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a         return $:
b690: 3a 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f  :scratch_directo
b6a0: 72 79 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  ry..      } else
b6b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
b6c0: 72 6e 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79  rn [getTemporary
b6d0: 50 61 74 68 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  Path]..      }..
b6e0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
b6f0: 6f 63 20 67 65 74 54 65 6d 70 6f 72 61 72 79 44  oc getTemporaryD
b700: 69 72 65 63 74 6f 72 79 20 7b 7d 20 7b 0d 0a 20  irectory {} {.. 
b710: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
b720: 4e 4f 54 45 3a 20 54 68 69 73 20 70 72 6f 63 65  NOTE: This proce
b730: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
b740: 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 72 65   directory where
b750: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
b760: 69 6c 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20  iles..      #   
b770: 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f      should be lo
b780: 63 61 74 65 64 2e 20 20 42 79 20 64 65 66 61 75  cated.  By defau
b790: 6c 74 2c 20 74 68 69 73 20 6a 75 73 74 20 75 73  lt, this just us
b7a0: 65 73 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  es the temporary
b7b0: 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
b7c0: 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 66 69 67  directory config
b7d0: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 73 79  ured for this sy
b7e0: 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  stem...      #..
b7f0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
b800: 65 78 69 73 74 73 20 3a 3a 74 65 6d 70 6f 72 61  exists ::tempora
b810: 72 79 5f 64 69 72 65 63 74 6f 72 79 5d 20 26 26  ry_directory] &&
b820: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 73   \..          [s
b830: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 3a 3a  tring length $::
b840: 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
b850: 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ory] > 0} then {
b860: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
b870: 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 65       # NOTE: The
b880: 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65   location of the
b890: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
b8a0: 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f 76  tory has been ov
b8b0: 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20 20  erridden;..     
b8c0: 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72 65     #       there
b8d0: 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a 20  fore, use it... 
b8e0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
b8f0: 20 20 72 65 74 75 72 6e 20 24 3a 3a 74 65 6d 70    return $::temp
b900: 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 0d  orary_directory.
b910: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20  .      } elseif 
b920: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
b930: 73 63 72 61 74 63 68 5f 64 69 72 65 63 74 6f 72  scratch_director
b940: 79 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20  y] && \..       
b950: 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
b960: 68 20 24 3a 3a 73 63 72 61 74 63 68 5f 64 69 72  h $::scratch_dir
b970: 65 63 74 6f 72 79 5d 20 3e 20 30 7d 20 74 68 65  ectory] > 0} the
b980: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
b990: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
b9a0: 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  The location of 
b9b0: 74 68 65 20 73 63 72 61 74 63 68 20 64 69 72 65  the scratch dire
b9c0: 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 6f  ctory has been o
b9d0: 76 65 72 72 69 64 64 65 6e 3b 0d 0a 20 20 20 20  verridden;..    
b9e0: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 72      #       ther
b9f0: 65 66 6f 72 65 2c 20 75 73 65 20 69 74 2e 0d 0a  efore, use it...
ba00: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
ba10: 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 73 63 72     return $::scr
ba20: 61 74 63 68 5f 64 69 72 65 63 74 6f 72 79 0d 0a  atch_directory..
ba30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
ba40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
ba50: 67 65 74 54 65 6d 70 6f 72 61 72 79 50 61 74 68  getTemporaryPath
ba60: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
ba70: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
ba80: 65 74 45 78 65 63 75 74 65 4f 6e 53 65 74 75 70  etExecuteOnSetup
ba90: 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20   {} {..      if 
baa0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  {[info exists ::
bab0: 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65 74 75 70  execute_on_setup
bac0: 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
bad0: 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68    [string length
bae0: 20 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73   $::execute_on_s
baf0: 65 74 75 70 5d 20 3e 20 30 7d 20 74 68 65 6e 20  etup] > 0} then 
bb00: 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
bb10: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65        # NOTE: Re
bb20: 74 75 72 6e 20 74 68 65 20 63 6f 6e 66 69 67 75  turn the configu
bb30: 72 65 64 20 53 51 4c 20 74 6f 20 65 78 65 63 75  red SQL to execu
bb40: 74 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  te during the co
bb50: 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
bb60: 20 20 23 20 20 20 20 20 20 20 73 65 74 75 70 20    #       setup 
bb70: 70 72 6f 63 65 64 75 72 65 20 28 69 2e 65 2e 20  procedure (i.e. 
bb80: 66 6f 72 20 65 76 65 72 79 20 74 65 73 74 20 64  for every test d
bb90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
bba0: 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  on)...        #.
bbb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bbc0: 24 3a 3a 65 78 65 63 75 74 65 5f 6f 6e 5f 73 65  $::execute_on_se
bbd0: 74 75 70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  tup..      } els
bbe0: 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
bbf0: 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
bc00: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  By default, ther
bc10: 65 20 69 73 20 6e 6f 20 53 51 4c 20 74 6f 20 65  e is no SQL to e
bc20: 78 65 63 75 74 65 20 64 75 72 69 6e 67 20 74 68  xecute during th
bc30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
bc40: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65        #       se
bc50: 74 75 70 20 70 72 6f 63 65 64 75 72 65 20 28 69  tup procedure (i
bc60: 2e 65 2e 20 66 6f 72 20 65 76 65 72 79 20 74 65  .e. for every te
bc70: 73 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  st database conn
bc80: 65 63 74 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20  ection)...      
bc90: 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
bca0: 75 72 6e 20 22 22 0d 0a 20 20 20 20 20 20 7d 0d  urn ""..      }.
bcb0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
bcc0: 72 6f 63 20 67 65 74 53 74 72 69 6e 67 4d 61 70  roc getStringMap
bcd0: 46 6f 72 54 63 6c 45 73 63 61 70 65 20 7b 7d 20  ForTclEscape {} 
bce0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
bcf0: 5b 6c 69 73 74 20 5c 5c 20 5c 5c 5c 5c 20 5c 5b  [list \\ \\\\ \[
bd00: 20 5c 5c 5c 5b 20 5c 5d 20 5c 5c 5c 5d 20 5c 24   \\\[ \] \\\] \$
bd10: 20 5c 5c 5c 24 5d 0d 0a 20 20 20 20 7d 0d 0a 0c   \\\$]..    }...
bd20: 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 54 65  ..    proc getTe
bd30: 73 74 4f 76 65 72 72 69 64 65 73 50 72 65 61 6d  stOverridesPream
bd40: 62 6c 65 20 7b 20 7b 65 78 74 72 61 56 61 72 4e  ble { {extraVarN
bd50: 61 6d 65 73 20 22 22 7d 20 7d 20 7b 0d 0a 20 20  ames ""} } {..  
bd60: 20 20 20 20 73 65 74 20 76 61 72 4e 61 6d 65 73      set varNames
bd70: 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
bd80: 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
bd90: 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
bda0: 73 74 61 72 74 20 77 69 74 68 20 74 68 65 20 6d  start with the m
bdb0: 61 73 74 65 72 20 6c 69 73 74 20 6f 66 20 74 65  aster list of te
bdc0: 73 74 20 6f 76 65 72 72 69 64 65 0d 0a 20 20 20  st override..   
bdd0: 20 20 20 23 20 20 20 20 20 20 20 76 61 72 69 61     #       varia
bde0: 62 6c 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  bles...      #..
bdf0: 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
be00: 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f 6f 76  exists ::test_ov
be10: 65 72 72 69 64 65 73 5d 20 26 26 20 5c 0d 0a 20  errides] && \.. 
be20: 20 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74           [llengt
be30: 68 20 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69  h $::test_overri
be40: 64 65 73 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  des] > 0} then {
be50: 0d 0a 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c  ..        eval l
be60: 61 70 70 65 6e 64 20 76 61 72 4e 61 6d 65 73 20  append varNames 
be70: 24 3a 3a 74 65 73 74 5f 6f 76 65 72 72 69 64 65  $::test_override
be80: 73 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  s..      }....  
be90: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
bea0: 4f 54 45 3a 20 49 66 20 72 65 71 75 65 73 74 65  OTE: If requeste
beb0: 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c  d by our caller,
bec0: 20 61 64 64 20 61 6e 79 20 61 64 64 69 74 69 6f   add any additio
bed0: 6e 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20  nal variable..  
bee0: 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
bef0: 73 20 74 6f 20 63 6f 70 79 20 6e 6f 77 2e 0d 0a  s to copy now...
bf00: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
bf10: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 65 78 74  f {[llength $ext
bf20: 72 61 56 61 72 4e 61 6d 65 73 5d 20 3e 20 30 7d  raVarNames] > 0}
bf30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
bf40: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 76 61   eval lappend va
bf50: 72 4e 61 6d 65 73 20 24 65 78 74 72 61 56 61 72  rNames $extraVar
bf60: 4e 61 6d 65 73 0d 0a 20 20 20 20 20 20 7d 0d 0a  Names..      }..
bf70: 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
bf80: 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74   # NOTE: Build t
bf90: 68 65 20 73 63 72 69 70 74 20 66 72 61 67 6d 65  he script fragme
bfa0: 6e 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  nt to be returne
bfb0: 64 20 62 79 20 70 72 6f 63 65 73 73 69 6e 67 20  d by processing 
bfc0: 65 61 63 68 0d 0a 20 20 20 20 20 20 23 20 20 20  each..      #   
bfd0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 61 6d      variable nam
bfe0: 65 20 61 6e 64 20 61 64 64 69 6e 67 20 74 68 65  e and adding the
bff0: 20 6e 65 63 65 63 65 73 73 61 72 79 20 73 63 72   nececessary scr
c000: 69 70 74 20 66 72 61 67 6d 65 6e 74 73 20 66 6f  ipt fragments fo
c010: 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
c020: 20 65 61 63 68 20 6f 6e 65 2e 0d 0a 20 20 20 20   each one...    
c030: 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 72    #..      set r
c040: 65 73 75 6c 74 20 22 22 0d 0a 0d 0a 20 20 20 20  esult ""....    
c050: 20 20 66 6f 72 65 61 63 68 20 76 61 72 4e 61 6d    foreach varNam
c060: 65 20 24 76 61 72 4e 61 6d 65 73 20 7b 0d 0a 20  e $varNames {.. 
c070: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
c080: 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20    # NOTE: Build 
c090: 74 68 65 20 71 75 61 6c 69 66 69 65 64 20 67 6c  the qualified gl
c0a0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 61  obal variable na
c0b0: 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  me...        #..
c0c0: 20 20 20 20 20 20 20 20 73 65 74 20 66 75 6c 6c          set full
c0d0: 56 61 72 4e 61 6d 65 20 5b 61 70 70 65 6e 64 41  VarName [appendA
c0e0: 72 67 73 20 3a 3a 20 24 76 61 72 4e 61 6d 65 5d  rgs :: $varName]
c0f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
c100: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
c110: 6f 65 73 20 74 68 65 20 76 61 72 69 61 62 6c 65  oes the variable
c120: 20 65 78 69 73 74 20 69 6e 20 74 68 69 73 20 69   exist in this i
c130: 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 65  nterpreter conte
c140: 78 74 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  xt?..        #..
c150: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66          if {[inf
c160: 6f 20 65 78 69 73 74 73 20 24 66 75 6c 6c 56 61  o exists $fullVa
c170: 72 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a  rName]} then {..
c180: 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
c190: 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41         # NOTE: A
c1a0: 70 70 65 6e 64 20 61 20 73 63 72 69 70 74 20 66  ppend a script f
c1b0: 72 61 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 72  ragment to the r
c1c0: 65 73 75 6c 74 20 74 68 61 74 20 77 69 6c 6c 20  esult that will 
c1d0: 63 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20  correctly..     
c1e0: 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 70       #       cop
c1f0: 79 20 61 6e 79 20 63 6f 6e 74 61 69 6e 65 64 20  y any contained 
c200: 76 61 6c 75 65 20 74 6f 20 61 6e 6f 74 68 65 72  value to another
c210: 20 69 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e   interpreter con
c220: 74 65 78 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  text...         
c230: 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 70   #..          ap
c240: 70 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 20 22  pend result \n "
c250: 73 65 74 20 22 20 24 66 75 6c 6c 56 61 72 4e 61  set " $fullVarNa
c260: 6d 65 20 22 20 5c 7b 22 20 5b 73 74 72 69 6e 67  me " \{" [string
c270: 20 6d 61 70 20 5c 0d 0a 20 20 20 20 20 20 20 20   map \..        
c280: 20 20 20 20 20 20 5b 67 65 74 53 74 72 69 6e 67        [getString
c290: 4d 61 70 46 6f 72 54 63 6c 45 73 63 61 70 65 5d  MapForTclEscape]
c2a0: 20 5b 73 65 74 20 24 66 75 6c 6c 56 61 72 4e 61   [set $fullVarNa
c2b0: 6d 65 5d 5d 20 5c 7d 0d 0a 20 20 20 20 20 20 20  me]] \}..       
c2c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
c2d0: 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
c2e0: 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 72 65 73  NOTE: If the res
c2f0: 75 6c 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ult contains one
c300: 20 6f 72 20 6d 6f 72 65 20 73 63 72 69 70 74 20   or more script 
c310: 66 72 61 67 6d 65 6e 74 73 2c 20 61 70 70 65 6e  fragments, appen
c320: 64 20 61 0d 0a 20 20 20 20 20 20 23 20 20 20 20  d a..      #    
c330: 20 20 20 6e 65 77 6c 69 6e 65 2e 0d 0a 20 20 20     newline...   
c340: 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
c350: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
c360: 72 65 73 75 6c 74 5d 20 3e 20 30 7d 20 74 68 65  result] > 0} the
c370: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 70 70  n {..        app
c380: 65 6e 64 20 72 65 73 75 6c 74 20 5c 6e 0d 0a 20  end result \n.. 
c390: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
c3a0: 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a  return $result..
c3b0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
c3c0: 6f 63 20 6d 6f 76 65 53 79 73 74 65 6d 44 61 74  oc moveSystemDat
c3d0: 61 53 51 4c 69 74 65 44 6c 6c 43 6f 6e 66 69 67  aSQLiteDllConfig
c3e0: 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c 73   { {restore fals
c3f0: 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65  e} {verbose true
c400: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
c410: 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42   directory [getB
c420: 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d  inaryDirectory].
c430: 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
c440: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72  ring length $dir
c450: 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  ectory] == 0} th
c460: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
c470: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
c480: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
c490: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c4a0: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c4b0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c4c0: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d   "---- skipped m
c4d0: 6f 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44  oving \"System.D
c4e0: 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63  ata.SQLite.dll.c
c4f0: 6f 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20  onfig\", " \..  
c500: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20              "no 
c510: 62 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79  binary directory
c520: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
c530: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
c540: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
c550: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
c560: 28 31 29 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c  (1) [file normal
c570: 69 7a 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ize \..         
c580: 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72   [file join $dir
c590: 65 63 74 6f 72 79 20 53 79 73 74 65 6d 2e 44 61  ectory System.Da
c5a0: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
c5b0: 6e 66 69 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  nfig]]....      
c5c0: 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 32 29 20  set fileName(2) 
c5d0: 5b 61 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c  [appendArgs $fil
c5e0: 65 4e 61 6d 65 28 31 29 20 2e 6d 6f 76 65 64 5d  eName(1) .moved]
c5f0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 72  ....      if {$r
c600: 65 73 74 6f 72 65 7d 20 74 68 65 6e 20 7b 0d 0a  estore} then {..
c610: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
c620: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
c630: 6d 65 28 32 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  me(2)]} then {..
c640: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72            file r
c650: 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28  ename $fileName(
c660: 32 29 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 0d  2) $fileName(1).
c670: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
c680: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c690: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
c6a0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
c6b0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c6c0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c6d0: 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20      "---- moved 
c6e0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32 29  \"" $fileName(2)
c6f0: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
c710: 66 69 6c 65 4e 61 6d 65 28 31 29 20 5c 22 5c 6e  fileName(1) \"\n
c720: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
c730: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c740: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
c750: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c760: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
c770: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c780: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c790: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c7a0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
c7b0: 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c   moving \"" $fil
c7c0: 65 4e 61 6d 65 28 32 29 20 5c 0d 0a 20 20 20 20  eName(2) \..    
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c7e0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
c7f0: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
c800: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
c810: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
c820: 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c          if {[fil
c830: 65 20 65 78 69 73 74 73 20 24 66 69 6c 65 4e 61  e exists $fileNa
c840: 6d 65 28 31 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  me(1)]} then {..
c850: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 72            file r
c860: 65 6e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 28  ename $fileName(
c870: 31 29 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 0d  1) $fileName(2).
c880: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
c890: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
c8a0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
c8b0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
c8c0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
c8d0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
c8e0: 20 20 20 20 22 2d 2d 2d 2d 20 6d 6f 76 65 64 20      "---- moved 
c8f0: 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31 29  \"" $fileName(1)
c900: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
c920: 66 69 6c 65 4e 61 6d 65 28 32 29 20 5c 22 5c 6e  fileName(2) \"\n
c930: 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
c940: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c950: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
c960: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
c970: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
c980: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
c990: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
c9a0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
c9b0: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
c9c0: 20 6d 6f 76 69 6e 67 20 5c 22 22 20 24 66 69 6c   moving \"" $fil
c9d0: 65 4e 61 6d 65 28 31 29 20 5c 0d 0a 20 20 20 20  eName(1) \..    
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c              "\",
c9f0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
ca00: 73 74 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  st\n"]..        
ca10: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
ca20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ca30: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 77 72 69 74  ...    proc writ
ca40: 65 53 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74  eSystemDataSQLit
ca50: 65 44 6c 6c 43 6f 6e 66 69 67 20 7b 20 64 61 74  eDllConfig { dat
ca60: 61 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65 7d  a {verbose true}
ca70: 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74 20   } {..      set 
ca80: 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 69  directory [getBi
ca90: 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d 0d 0a  naryDirectory]..
caa0: 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
cab0: 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69 72 65  ing length $dire
cac0: 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65  ctory] == 0} the
cad0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
cae0: 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20  {$verbose} then 
caf0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
cb00: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
cb10: 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
cb20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cb30: 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6d 6f  "---- skipped mo
cb40: 76 69 6e 67 20 5c 22 53 79 73 74 65 6d 2e 44 61  ving \"System.Da
cb50: 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f  ta.SQLite.dll.co
cb60: 6e 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20  nfig\", " \..   
cb70: 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62             "no b
cb80: 69 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c  inary directory\
cb90: 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n"]..        }..
cba0: 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
cbb0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
cbc0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
cbd0: 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20  [file normalize 
cbe0: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69  \..          [fi
cbf0: 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f  le join $directo
cc00: 72 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ry System.Data.S
cc10: 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
cc20: 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 77 72 69 74  ]]....      writ
cc30: 65 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20  eFile $fileName 
cc40: 24 64 61 74 61 0d 0a 0d 0a 20 20 20 20 20 20 69  $data....      i
cc50: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
cc60: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  n {..        tpu
cc70: 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
cc80: 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
cc90: 20 20 22 2d 2d 2d 2d 20 77 72 6f 74 65 20 5c 22    "---- wrote \"
cca0: 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
ccb0: 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67 5c 22 5c  te.dll.config\"\
ccc0: 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
ccd0: 20 20 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c       return $fil
cce0: 65 4e 61 6d 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  eName..    }....
ccf0: 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65 45 61  .    proc moveEa
cd00: 67 6c 65 53 68 65 6c 6c 4d 64 61 43 6f 6e 66 69  gleShellMdaConfi
cd10: 67 20 7b 20 7b 72 65 73 74 6f 72 65 20 66 61 6c  g { {restore fal
cd20: 73 65 7d 20 7b 76 65 72 62 6f 73 65 20 74 72 75  se} {verbose tru
cd30: 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
cd40: 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
cd50: 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79 5d  BinaryDirectory]
cd60: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73  ....      if {[s
cd70: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64 69  tring length $di
cd80: 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20 74  rectory] == 0} t
cd90: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
cda0: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
cdb0: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
cdc0: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
cdd0: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
cde0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
cdf0: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
ce00: 6d 6f 76 69 6e 67 20 5c 22 45 61 67 6c 65 53 68  moving \"EagleSh
ce10: 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66  ell.exe.mda.conf
ce20: 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20 20  ig\", " \..     
ce30: 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69 6e           "no bin
ce40: 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e 22  ary directory\n"
ce50: 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ]..        }....
ce60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d 0a          return..
ce70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
ce80: 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 28 31 29   set fileName(1)
ce90: 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65   [file normalize
cea0: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66   \..          [f
ceb0: 69 6c 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74  ile join $direct
cec0: 6f 72 79 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65  ory EagleShell.e
ced0: 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d  xe.mda.config]].
cee0: 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c  ...      set fil
cef0: 65 4e 61 6d 65 28 32 29 20 5b 61 70 70 65 6e 64  eName(2) [append
cf00: 41 72 67 73 20 24 66 69 6c 65 4e 61 6d 65 28 31  Args $fileName(1
cf10: 29 20 2e 6d 6f 76 65 64 5d 0d 0a 0d 0a 20 20 20  ) .moved]....   
cf20: 20 20 20 69 66 20 7b 24 72 65 73 74 6f 72 65 7d     if {$restore}
cf30: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cf40: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
cf50: 73 20 24 66 69 6c 65 4e 61 6d 65 28 32 29 5d 7d  s $fileName(2)]}
cf60: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
cf70: 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24     file rename $
cf80: 66 69 6c 65 4e 61 6d 65 28 32 29 20 24 66 69 6c  fileName(2) $fil
cf90: 65 4e 61 6d 65 28 31 29 0d 0a 0d 0a 20 20 20 20  eName(1)....    
cfa0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
cfb0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
cfc0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
cfd0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
cfe0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
d000: 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69  -- moved \"" $fi
d010: 6c 65 4e 61 6d 65 28 32 29 20 22 5c 22 20 74 6f  leName(2) "\" to
d020: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
d030: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
d040: 65 28 31 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  e(1) \"\n]..    
d050: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d060: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d070: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
d080: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
d090: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d0a0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d0b0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d0d0: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
d0e0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 32   \"" $fileName(2
d0f0: 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) \..           
d100: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
d110: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
d120: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d130: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d140: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
d150: 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
d160: 73 20 24 66 69 6c 65 4e 61 6d 65 28 31 29 5d 7d  s $fileName(1)]}
d170: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
d180: 20 20 20 66 69 6c 65 20 72 65 6e 61 6d 65 20 24     file rename $
d190: 66 69 6c 65 4e 61 6d 65 28 31 29 20 24 66 69 6c  fileName(1) $fil
d1a0: 65 4e 61 6d 65 28 32 29 0d 0a 0d 0a 20 20 20 20  eName(2)....    
d1b0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
d1c0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
d1d0: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d1e0: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
d1f0: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
d210: 2d 2d 20 6d 6f 76 65 64 20 5c 22 22 20 24 66 69  -- moved \"" $fi
d220: 6c 65 4e 61 6d 65 28 31 29 20 22 5c 22 20 74 6f  leName(1) "\" to
d230: 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
d240: 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61 6d          $fileNam
d250: 65 28 32 29 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  e(2) \"\n]..    
d260: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
d270: 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
d280: 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f 73       if {$verbos
d290: 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
d2a0: 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
d2b0: 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
d2c0: 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
d2e0: 2d 20 73 6b 69 70 70 65 64 20 6d 6f 76 69 6e 67  - skipped moving
d2f0: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 28 31   \"" $fileName(1
d300: 29 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) \..           
d310: 20 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65       "\", it doe
d320: 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d  s not exist\n"].
d330: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
d340: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
d350: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
d360: 70 72 6f 63 20 77 72 69 74 65 45 61 67 6c 65 53  proc writeEagleS
d370: 68 65 6c 6c 4d 64 61 43 6f 6e 66 69 67 20 7b 20  hellMdaConfig { 
d380: 64 61 74 61 20 7b 76 65 72 62 6f 73 65 20 74 72  data {verbose tr
d390: 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ue} } {..      s
d3a0: 65 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65  et directory [ge
d3b0: 74 42 69 6e 61 72 79 44 69 72 65 63 74 6f 72 79  tBinaryDirectory
d3c0: 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  ]....      if {[
d3d0: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 64  string length $d
d3e0: 69 72 65 63 74 6f 72 79 5d 20 3d 3d 20 30 7d 20  irectory] == 0} 
d3f0: 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
d400: 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68  if {$verbose} th
d410: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
d420: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
d430: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
d440: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
d450: 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64     "---- skipped
d460: 20 6d 6f 76 69 6e 67 20 5c 22 45 61 67 6c 65 53   moving \"EagleS
d470: 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e  hell.exe.mda.con
d480: 66 69 67 5c 22 2c 20 22 20 5c 0d 0a 20 20 20 20  fig\", " \..    
d490: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 62 69            "no bi
d4a0: 6e 61 72 79 20 64 69 72 65 63 74 6f 72 79 5c 6e  nary directory\n
d4b0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
d4c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
d4d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
d4e0: 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20 5b    set fileName [
d4f0: 66 69 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 5c  file normalize \
d500: 0d 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c  ..          [fil
d510: 65 20 6a 6f 69 6e 20 24 64 69 72 65 63 74 6f 72  e join $director
d520: 79 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65  y EagleShell.exe
d530: 2e 6d 64 61 2e 63 6f 6e 66 69 67 5d 5d 0d 0a 0d  .mda.config]]...
d540: 0a 20 20 20 20 20 20 77 72 69 74 65 46 69 6c 65  .      writeFile
d550: 20 24 66 69 6c 65 4e 61 6d 65 20 24 64 61 74 61   $fileName $data
d560: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 76  ....      if {$v
d570: 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b 0d 0a  erbose} then {..
d580: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
d590: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
d5a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
d5b0: 2d 2d 20 77 72 6f 74 65 20 5c 22 45 61 67 6c 65  -- wrote \"Eagle
d5c0: 53 68 65 6c 6c 2e 65 78 65 2e 6d 64 61 2e 63 6f  Shell.exe.mda.co
d5d0: 6e 66 69 67 5c 22 5c 6e 22 0d 0a 20 20 20 20 20  nfig\"\n"..     
d5e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
d5f0: 72 6e 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  rn $fileName..  
d600: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
d610: 20 67 65 74 41 70 70 44 6f 6d 61 69 6e 50 72 65   getAppDomainPre
d620: 61 6d 62 6c 65 20 7b 20 7b 70 72 65 66 69 78 20  amble { {prefix 
d630: 22 22 7d 20 7b 73 75 66 66 69 78 20 22 22 7d 20  ""} {suffix ""} 
d640: 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
d650: 20 20 20 20 23 20 4e 4f 54 45 3a 20 54 68 69 73      # NOTE: This
d660: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
d670: 6e 73 20 61 20 74 65 73 74 20 73 65 74 75 70 20  ns a test setup 
d680: 73 63 72 69 70 74 20 66 72 61 67 6d 65 6e 74 20  script fragment 
d690: 73 75 69 74 61 62 6c 65 20 66 6f 72 0d 0a 20 20  suitable for..  
d6a0: 20 20 20 20 23 20 20 20 20 20 20 20 65 76 61 6c      #       eval
d6b0: 75 61 74 69 6f 6e 20 62 79 20 61 6e 20 69 6e 74  uation by an int
d6c0: 65 72 70 72 65 74 65 72 20 63 72 65 61 74 65 64  erpreter created
d6d0: 20 69 6e 20 61 6e 20 69 73 6f 6c 61 74 65 64 20   in an isolated 
d6e0: 61 70 70 6c 69 63 61 74 69 6f 6e 0d 0a 20 20 20  application..   
d6f0: 20 20 20 23 20 20 20 20 20 20 20 64 6f 6d 61 69     #       domai
d700: 6e 2e 20 20 54 68 65 20 73 63 72 69 70 74 20 66  n.  The script f
d710: 72 61 67 6d 65 6e 74 20 62 65 69 6e 67 20 72 65  ragment being re
d720: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
d730: 75 72 72 6f 75 6e 64 65 64 20 62 79 0d 0a 20 20  urrounded by..  
d740: 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20      #       the 
d750: 70 72 65 66 69 78 20 61 6e 64 20 73 75 66 66 69  prefix and suffi
d760: 78 20 22 73 63 72 69 70 74 20 66 72 61 67 6d 65  x "script fragme
d770: 6e 74 73 22 20 73 70 65 63 69 66 69 65 64 20 62  nts" specified b
d780: 79 20 6f 75 72 20 63 61 6c 6c 65 72 2c 0d 0a 20  y our caller,.. 
d790: 20 20 20 20 20 23 20 20 20 20 20 20 20 69 66 20       #       if 
d7a0: 61 6e 79 2e 20 20 54 68 65 20 65 6e 74 69 72 65  any.  The entire
d7b0: 20 73 63 72 69 70 74 20 62 65 69 6e 67 20 72 65   script being re
d7c0: 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 73  turned will be s
d7d0: 75 62 73 74 69 74 75 74 65 64 20 76 69 61 0d 0a  ubstituted via..
d7e0: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5b 73        #       [s
d7f0: 75 62 73 74 5d 2c 20 69 6e 20 74 68 65 20 63 6f  ubst], in the co
d800: 6e 74 65 78 74 20 6f 66 20 6f 75 72 20 63 61 6c  ntext of our cal
d810: 6c 65 72 2c 20 62 65 66 6f 72 65 20 62 65 69 6e  ler, before bein
d820: 67 20 72 65 74 75 72 6e 65 64 2e 0d 0a 20 20 20  g returned...   
d830: 20 20 20 23 20 20 20 20 20 20 20 54 68 69 73 20     #       This 
d840: 73 74 65 70 20 69 73 20 6e 65 63 65 73 73 61 72  step is necessar
d850: 79 20 73 6f 20 74 68 61 74 20 73 6f 6d 65 20 6c  y so that some l
d860: 69 6d 69 74 65 64 20 63 6f 6e 74 65 78 74 20 69  imited context i
d870: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 0d 0a 20 20 20  nformation,..   
d880: 20 20 20 23 20 20 20 20 20 20 20 70 72 69 6d 61     #       prima
d890: 72 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20  rily related to 
d8a0: 74 68 65 20 74 65 73 74 69 6e 67 20 64 69 72 65  the testing dire
d8b0: 63 74 6f 72 69 65 73 2c 20 63 61 6e 20 62 65 20  ctories, can be 
d8c0: 74 72 61 6e 73 66 65 72 72 65 64 0d 0a 20 20 20  transferred..   
d8d0: 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 74 68     #       to th
d8e0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 69 6e  e interpreter in
d8f0: 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 61 70   the isolated ap
d900: 70 6c 69 63 61 74 69 6f 6e 20 64 6f 6d 61 69 6e  plication domain
d910: 2c 20 6d 61 6b 69 6e 67 20 69 74 0d 0a 20 20 20  , making it..   
d920: 20 20 20 23 20 20 20 20 20 20 20 61 62 6c 65 20     #       able 
d930: 74 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  to successfully 
d940: 72 75 6e 20 74 65 73 74 73 20 74 68 61 74 20 72  run tests that r
d950: 65 71 75 69 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  equire one or mo
d960: 72 65 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20  re of the..     
d970: 20 23 20 20 20 20 20 20 20 66 69 6c 65 73 20 69   #       files i
d980: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 73  n one of the tes
d990: 74 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  ting directories
d9a0: 2e 20 20 43 61 6c 6c 65 72 73 20 73 68 6f 75 6c  .  Callers shoul
d9b0: 64 20 6b 65 65 70 20 69 6e 0d 0a 20 20 20 20 20  d keep in..     
d9c0: 20 23 20 20 20 20 20 20 20 6d 69 6e 64 20 74 68   #       mind th
d9d0: 61 74 20 74 68 65 20 74 65 73 74 20 73 63 72 69  at the test scri
d9e0: 70 74 20 66 72 61 67 6d 65 6e 74 20 62 65 69 6e  pt fragment bein
d9f0: 67 20 72 65 74 75 72 6e 65 64 20 63 61 6e 6e 6f  g returned canno
da00: 74 20 72 65 6c 79 20 6f 6e 0d 0a 20 20 20 20 20  t rely on..     
da10: 20 23 20 20 20 20 20 20 20 61 6e 79 20 73 63 72   #       any scr
da20: 69 70 74 20 6c 69 62 72 61 72 79 20 70 72 6f 63  ipt library proc
da30: 65 64 75 72 65 73 20 74 68 61 74 20 61 72 65 20  edures that are 
da40: 6e 6f 74 20 70 72 6f 76 69 64 65 64 20 62 79 20  not provided by 
da50: 74 68 65 20 45 61 67 6c 65 0d 0a 20 20 20 20 20  the Eagle..     
da60: 20 23 20 20 20 20 20 20 20 6c 69 62 72 61 72 79   #       library
da70: 20 70 61 63 6b 61 67 65 20 28 69 2e 65 2e 20 22   package (i.e. "
da80: 69 6e 69 74 2e 65 61 67 6c 65 22 29 2c 20 69 6e  init.eagle"), in
da90: 63 6c 75 64 69 6e 67 20 74 68 6f 73 65 20 70 72  cluding those pr
daa0: 6f 76 69 64 65 64 20 62 79 0d 0a 20 20 20 20 20  ovided by..     
dab0: 20 23 20 20 20 20 20 20 20 74 68 65 20 45 61 67   #       the Eag
dac0: 6c 65 20 74 65 73 74 20 70 61 63 6b 61 67 65 2c  le test package,
dad0: 20 75 6e 6c 65 73 73 20 74 68 65 20 66 69 6c 65   unless the file
dae0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 6d   containing them
daf0: 20 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20   is loaded..    
db00: 20 20 23 20 20 20 20 20 20 20 6d 61 6e 75 61 6c    #       manual
db10: 6c 79 20 76 69 61 20 73 6f 6d 65 20 6f 74 68 65  ly via some othe
db20: 72 20 6d 65 63 68 61 6e 69 73 6d 20 28 65 2e 67  r mechanism (e.g
db30: 2e 20 62 79 20 69 6e 63 6c 75 64 69 6e 67 20 61  . by including a
db40: 70 70 72 6f 70 72 69 61 74 65 0d 0a 20 20 20 20  ppropriate..    
db50: 20 20 23 20 20 20 20 20 20 20 5b 70 61 63 6b 61    #       [packa
db60: 67 65 20 72 65 71 75 69 72 65 5d 20 6f 72 20 5b  ge require] or [
db70: 73 6f 75 72 63 65 5d 20 63 6f 6d 6d 61 6e 64 73  source] commands
db80: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f   in the prefix o
db90: 72 20 73 75 66 66 69 78 0d 0a 20 20 20 20 20 20  r suffix..      
dba0: 23 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66  #       script f
dbb0: 72 61 67 6d 65 6e 74 73 29 2e 20 20 41 6c 73 6f  ragments).  Also
dbc0: 2c 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 20 72  , all variable r
dbd0: 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 61 6c  eferences and al
dbe0: 6c 20 6e 65 73 74 65 64 0d 0a 20 20 20 20 20 20  l nested..      
dbf0: 23 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 73  #       commands
dc00: 20 28 69 2e 65 2e 20 74 68 6f 73 65 20 69 6e 20   (i.e. those in 
dc10: 73 71 75 61 72 65 20 62 72 61 63 6b 65 74 73 29  square brackets)
dc20: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
dc30: 65 20 66 69 6e 61 6c 0d 0a 20 20 20 20 20 20 23  e final..      #
dc40: 20 20 20 20 20 20 20 73 63 72 69 70 74 20 66 72         script fr
dc50: 61 67 6d 65 6e 74 20 77 69 6c 6c 20 65 6e 64 20  agment will end 
dc60: 75 70 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74  up being evaluat
dc70: 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ed in the contex
dc80: 74 20 6f 66 20 74 68 65 0d 0a 20 20 20 20 20 20  t of the..      
dc90: 23 20 20 20 20 20 20 20 63 61 6c 6c 69 6e 67 20  #       calling 
dca0: 69 6e 74 65 72 70 72 65 74 65 72 20 61 6e 64 20  interpreter and 
dcb0: 6e 6f 74 20 74 68 65 20 74 61 72 67 65 74 20 69  not the target i
dcc0: 6e 74 65 72 70 72 65 74 65 72 20 63 72 65 61 74  nterpreter creat
dcd0: 65 64 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  ed in the..     
dce0: 20 23 20 20 20 20 20 20 20 69 73 6f 6c 61 74 65   #       isolate
dcf0: 64 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 6f  d application do
dd00: 6d 61 69 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  main unless the 
dd10: 64 6f 6c 6c 61 72 20 73 69 67 6e 73 20 61 6e 64  dollar signs and
dd20: 2f 6f 72 20 73 71 75 61 72 65 0d 0a 20 20 20 20  /or square..    
dd30: 20 20 23 20 20 20 20 20 20 20 62 72 61 63 6b 65    #       bracke
dd40: 74 73 20 61 72 65 20 73 70 65 63 69 61 6c 6c 79  ts are specially
dd50: 20 71 75 6f 74 65 64 20 77 69 74 68 20 62 61 63   quoted with bac
dd60: 6b 73 6c 61 73 68 65 73 2e 0d 0a 20 20 20 20 20  kslashes...     
dd70: 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   #..      return
dd80: 20 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73   [uplevel 1 [lis
dd90: 74 20 73 75 62 73 74 20 5b 61 70 70 65 6e 64 41  t subst [appendA
dda0: 72 67 73 20 24 70 72 65 66 69 78 20 7b 0d 0a 20  rgs $prefix {.. 
ddb0: 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
ddc0: 20 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 5c 5b    # NOTE: The \[
ddd0: 6f 62 6a 65 63 74 5c 5d 20 63 6f 6d 6d 61 6e 64  object\] command
dde0: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
ddf0: 69 6e 20 73 6f 6d 65 20 45 61 67 6c 65 20 63 6f  in some Eagle co
de00: 72 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  re..        #   
de10: 20 20 20 20 6c 69 62 72 61 72 79 20 63 6f 6e 66      library conf
de20: 69 67 75 72 61 74 69 6f 6e 73 2e 20 20 43 6c 6f  igurations.  Clo
de30: 6e 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 74  ning and using t
de40: 68 65 20 70 72 6f 63 65 64 75 72 65 0d 0a 20 20  he procedure..  
de50: 20 20 20 20 20 20 23 20 20 20 20 20 20 20 5c 5b        #       \[
de60: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
de70: 69 6d 65 4f 70 74 69 6f 6e 5c 5d 20 6d 61 79 20  imeOption\] may 
de80: 68 65 6c 70 20 74 6f 20 6d 69 74 69 67 61 74 65  help to mitigate
de90: 20 74 68 69 73 2e 0d 0a 20 20 20 20 20 20 20 20   this...        
dea0: 23 0d 0a 20 20 20 20 20 20 20 20 70 72 6f 63 20  #..        proc 
deb0: 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75 6e 74  changeNativeRunt
dec0: 69 6d 65 4f 70 74 69 6f 6e 20 5c 0d 0a 20 20 20  imeOption \..   
ded0: 20 20 20 20 20 20 20 20 20 7b 5b 69 6e 66 6f 20           {[info 
dee0: 61 72 67 73 20 63 68 61 6e 67 65 4e 61 74 69 76  args changeNativ
def0: 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 5d 7d  eRuntimeOption]}
df00: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
df10: 7b 5b 69 6e 66 6f 20 62 6f 64 79 20 63 68 61 6e  {[info body chan
df20: 67 65 4e 61 74 69 76 65 52 75 6e 74 69 6d 65 4f  geNativeRuntimeO
df30: 70 74 69 6f 6e 5d 7d 0d 0a 0d 0a 20 20 20 20 20  ption]}....     
df40: 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20 20     catch {..    
df50: 20 20 20 20 20 20 63 68 61 6e 67 65 4e 61 74 69        changeNati
df60: 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
df70: 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f  [hasRuntimeOptio
df80: 6e 20 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20 20  n native]..     
df90: 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 5b 67     }..      } [g
dfa0: 65 74 54 65 73 74 4f 76 65 72 72 69 64 65 73 50  etTestOverridesP
dfb0: 72 65 61 6d 62 6c 65 20 5b 6c 69 73 74 20 70 61  reamble [list pa
dfc0: 74 68 20 74 65 73 74 5f 63 68 61 6e 6e 65 6c 5d  th test_channel]
dfd0: 5d 20 24 73 75 66 66 69 78 5d 5d 5d 0d 0a 20 20  ] $suffix]]]..  
dfe0: 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
dff0: 20 74 72 79 43 6f 70 79 45 78 74 65 72 6e 61 6c   tryCopyExternal
e000: 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  File {..        
e010: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
e020: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e 65 77 46  atform ""} {newF
e030: 69 6c 65 4e 61 6d 65 20 22 22 7d 20 7b 76 65 72  ileName ""} {ver
e040: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
e050: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
e060: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 45 78 74  FileName [getExt
e070: 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 20 24 66  ernalFileName $f
e080: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
e090: 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
e0a0: 73 74 73 20 24 73 6f 75 72 63 65 46 69 6c 65 4e  sts $sourceFileN
e0b0: 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ame]} then {..  
e0c0: 20 20 20 20 20 20 69 66 20 7b 24 76 65 72 62 6f        if {$verbo
e0d0: 73 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  se} then {..    
e0e0: 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
e0f0: 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
e100: 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
e110: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73           "---- s
e120: 6b 69 70 70 65 64 20 63 6f 70 79 69 6e 67 20 65  kipped copying e
e130: 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 5c 22 22  xternal file \""
e140: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
e150: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
e160: 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e    "\", it does n
e170: 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
e180: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
e190: 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20     return..     
e1a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
e1b0: 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
e1c0: 6e 65 77 46 69 6c 65 4e 61 6d 65 5d 20 3e 20 30  newFileName] > 0
e1d0: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e1e0: 20 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65    set targetFile
e1f0: 4e 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46  Name [getBinaryF
e200: 69 6c 65 4e 61 6d 65 20 24 6e 65 77 46 69 6c 65  ileName $newFile
e210: 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Name $platform].
e220: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
e230: 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72  .        set tar
e240: 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74  getFileName [get
e250: 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
e260: 66 69 6c 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f  fileName $platfo
e270: 72 6d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  rm]..      }....
e280: 20 20 20 20 20 20 73 65 74 20 74 61 72 67 65 74        set target
e290: 44 69 72 65 63 74 6f 72 79 20 5b 66 69 6c 65 20  Directory [file 
e2a0: 64 69 72 6e 61 6d 65 20 24 74 61 72 67 65 74 46  dirname $targetF
e2b0: 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20  ileName]....    
e2c0: 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
e2d0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 66 69          if {![fi
e2e0: 6c 65 20 65 78 69 73 74 73 20 24 74 61 72 67 65  le exists $targe
e2f0: 74 44 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65  tDirectory]} the
e300: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
e310: 69 6c 65 20 6d 6b 64 69 72 20 24 74 61 72 67 65  ile mkdir $targe
e320: 74 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20  tDirectory..    
e330: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
e340: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
e350: 65 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d  e $sourceFileNam
e360: 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d  e $targetFileNam
e370: 65 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30  e..      }] == 0
e380: 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
e390: 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
e3a0: 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
e3b0: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
e3c0: 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 69 65 64 20     "---- copied 
e3d0: 65 78 74 65 72 6e 61 6c 20 66 69 6c 65 20 66 72  external file fr
e3e0: 6f 6d 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  om \"" $sourceFi
e3f0: 6c 65 4e 61 6d 65 20 22 5c 22 20 74 6f 20 5c 22  leName "\" to \"
e400: 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
e410: 20 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65   $targetFileName
e420: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
e430: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
e440: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
e450: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
e460: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
e470: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
e480: 20 63 6f 70 79 20 65 78 74 65 72 6e 61 6c 20 66   copy external f
e490: 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f  ile from \"" $so
e4a0: 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  urceFileName \..
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20              "\" 
e4c0: 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74 46 69  to \"" $targetFi
e4d0: 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20  leName \"\n]..  
e4e0: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
e4f0: 0a 20 20 20 20 70 72 6f 63 20 74 72 79 43 6f 70  .    proc tryCop
e500: 79 42 69 6e 61 72 79 46 69 6c 65 20 7b 0d 0a 20  yBinaryFile {.. 
e510: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e             fileN
e520: 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  ame managedOnly 
e530: 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7b 6e  {platform ""} {n
e540: 65 77 46 69 6c 65 4e 61 6d 65 20 22 22 7d 0d 0a  ewFileName ""}..
e550: 20 20 20 20 20 20 20 20 20 20 20 20 7b 76 65 72              {ver
e560: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
e570: 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63 65        set source
e580: 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42 69 6e  FileName [getBin
e590: 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c  aryFileName $fil
e5a0: 65 4e 61 6d 65 20 24 70 6c 61 74 66 6f 72 6d 5d  eName $platform]
e5b0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 5b  ....      if {![
e5c0: 66 69 6c 65 20 65 78 69 73 74 73 20 24 73 6f 75  file exists $sou
e5d0: 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d 20 74 68  rceFileName]} th
e5e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  en {..        if
e5f0: 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e   {$verbose} then
e600: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70   {..          tp
e610: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
e620: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e630: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
e640: 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 63   "---- skipped c
e650: 6f 70 79 69 6e 67 20 62 69 6e 61 72 79 20 66 69  opying binary fi
e660: 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69  le \"" $sourceFi
e670: 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20  leName \..      
e680: 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69 74 20          "\", it 
e690: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
e6a0: 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  "]..        }...
e6b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0d  .        return.
e6c0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e6d0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
e6e0: 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e 61 6d  ngth $newFileNam
e6f0: 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
e700: 20 20 20 20 20 20 20 20 73 65 74 20 74 61 72 67          set targ
e710: 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65 74 42  etFileName [getB
e720: 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a  uildFileName \..
e730: 20 20 20 20 20 20 20 20 20 20 20 20 24 6e 65 77              $new
e740: 46 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65  FileName $manage
e750: 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d  dOnly $platform]
e760: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
e770: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
e780: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
e790: 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d 65 20 5c  tBuildFileName \
e7a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 66  ..            $f
e7b0: 69 6c 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64  ileName $managed
e7c0: 4f 6e 6c 79 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  Only $platform].
e7d0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
e7e0: 20 20 73 65 74 20 74 61 72 67 65 74 44 69 72 65    set targetDire
e7f0: 63 74 6f 72 79 20 5b 66 69 6c 65 20 64 69 72 6e  ctory [file dirn
e800: 61 6d 65 20 24 74 61 72 67 65 74 46 69 6c 65 4e  ame $targetFileN
e810: 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  ame]....      if
e820: 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
e830: 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
e840: 78 69 73 74 73 20 24 74 61 72 67 65 74 44 69 72  xists $targetDir
e850: 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d  ectory]} then {.
e860: 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  .          file 
e870: 6d 6b 64 69 72 20 24 74 61 72 67 65 74 44 69 72  mkdir $targetDir
e880: 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  ectory..        
e890: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 66 69 6c  }....        fil
e8a0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 24 73  e copy -force $s
e8b0: 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 24 74  ourceFileName $t
e8c0: 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 0d 0a 20  argetFileName.. 
e8d0: 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68       }] == 0} th
e8e0: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  en {..        tp
e8f0: 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
e900: 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
e910: 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
e920: 2d 2d 2d 2d 20 63 6f 70 69 65 64 20 62 69 6e 61  ---- copied bina
e930: 72 79 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22  ry file from \""
e940: 20 24 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65   $sourceFileName
e950: 20 22 5c 22 20 74 6f 20 5c 22 22 20 5c 0d 0a 20   "\" to \"" \.. 
e960: 20 20 20 20 20 20 20 20 20 20 20 24 74 61 72 67             $targ
e970: 65 74 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d  etFileName \"\n]
e980: 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
e990: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
e9a0: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
e9b0: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
e9d0: 20 66 61 69 6c 65 64 20 74 6f 20 63 6f 70 79 20   failed to copy 
e9e0: 62 69 6e 61 72 79 20 66 69 6c 65 20 66 72 6f 6d  binary file from
e9f0: 20 5c 22 22 20 24 73 6f 75 72 63 65 46 69 6c 65   \"" $sourceFile
ea00: 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  Name \..        
ea10: 20 20 20 20 22 5c 22 20 74 6f 20 5c 22 22 20 24      "\" to \"" $
ea20: 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5c  targetFileName \
ea30: 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  "\n]..      }.. 
ea40: 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
ea50: 63 20 74 72 79 43 6f 70 79 42 75 69 6c 64 46 69  c tryCopyBuildFi
ea60: 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  le {..          
ea70: 20 20 66 69 6c 65 4e 61 6d 65 20 6d 61 6e 61 67    fileName manag
ea80: 65 64 4f 6e 6c 79 20 7b 70 6c 61 74 66 6f 72 6d  edOnly {platform
ea90: 20 22 22 7d 20 7b 6e 65 77 46 69 6c 65 4e 61 6d   ""} {newFileNam
eaa0: 65 20 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20  e ""}..         
eab0: 20 20 20 7b 76 65 72 62 6f 73 65 20 74 72 75 65     {verbose true
eac0: 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65 74  } } {..      set
ead0: 20 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20   sourceFileName 
eae0: 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
eaf0: 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61 6e  e $fileName $man
eb00: 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66 6f  agedOnly $platfo
eb10: 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  rm]....      if 
eb20: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
eb30: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 5d 7d  sourceFileName]}
eb40: 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
eb50: 20 69 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74   if {$verbose} t
eb60: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
eb70: 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
eb80: 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
eb90: 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
eba0: 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65      "---- skippe
ebb0: 64 20 63 6f 70 79 69 6e 67 20 62 75 69 6c 64 20  d copying build 
ebc0: 66 69 6c 65 20 5c 22 22 20 24 73 6f 75 72 63 65  file \"" $source
ebd0: 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20  FileName \..    
ebe0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 2c 20 69            "\", i
ebf0: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
ec00: 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  \n"]..        }.
ec10: 0a 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ...        retur
ec20: 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  n..      }....  
ec30: 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
ec40: 6c 65 6e 67 74 68 20 24 6e 65 77 46 69 6c 65 4e  length $newFileN
ec50: 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ame] > 0} then {
ec60: 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 61  ..        set ta
ec70: 72 67 65 74 46 69 6c 65 4e 61 6d 65 20 5b 67 65  rgetFileName [ge
ec80: 74 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20  tBinaryFileName 
ec90: 24 6e 65 77 46 69 6c 65 4e 61 6d 65 20 24 70 6c  $newFileName $pl
eca0: 61 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 7d  atform]..      }
ecb0: 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
ecc0: 20 73 65 74 20 74 61 72 67 65 74 46 69 6c 65 4e   set targetFileN
ecd0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
ece0: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
ecf0: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 20 20 20   $platform]..   
ed00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65     }....      se
ed10: 74 20 74 61 72 67 65 74 44 69 72 65 63 74 6f 72  t targetDirector
ed20: 79 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  y [file dirname 
ed30: 24 74 61 72 67 65 74 46 69 6c 65 4e 61 6d 65 5d  $targetFileName]
ed40: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
ed50: 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
ed60: 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74  if {![file exist
ed70: 73 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  s $targetDirecto
ed80: 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ry]} then {..   
ed90: 20 20 20 20 20 20 20 66 69 6c 65 20 6d 6b 64 69         file mkdi
eda0: 72 20 24 74 61 72 67 65 74 44 69 72 65 63 74 6f  r $targetDirecto
edb0: 72 79 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ry..        }...
edc0: 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f  .        file co
edd0: 70 79 20 2d 66 6f 72 63 65 20 24 73 6f 75 72 63  py -force $sourc
ede0: 65 46 69 6c 65 4e 61 6d 65 20 24 74 61 72 67 65  eFileName $targe
edf0: 74 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  tFileName..     
ee00: 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
ee10: 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
ee20: 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
ee30: 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
ee40: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
ee50: 20 63 6f 70 69 65 64 20 62 75 69 6c 64 20 66 69   copied build fi
ee60: 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24 73 6f 75  le from \"" $sou
ee70: 72 63 65 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20  rceFileName "\" 
ee80: 74 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  to \"" \..      
ee90: 20 20 20 20 20 20 24 74 61 72 67 65 74 46 69 6c        $targetFil
eea0: 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20  eName \"\n]..   
eeb0: 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
eec0: 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
eed0: 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
eee0: 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
eef0: 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 61 69 6c        "---- fail
ef00: 65 64 20 74 6f 20 63 6f 70 79 20 62 75 69 6c 64  ed to copy build
ef10: 20 66 69 6c 65 20 66 72 6f 6d 20 5c 22 22 20 24   file from \"" $
ef20: 73 6f 75 72 63 65 46 69 6c 65 4e 61 6d 65 20 5c  sourceFileName \
ef30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5c  ..            "\
ef40: 22 20 74 6f 20 5c 22 22 20 24 74 61 72 67 65 74  " to \"" $target
ef50: 46 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e 5d 0d 0a  FileName \"\n]..
ef60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
ef70: 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74 72 79 44  ...    proc tryD
ef80: 65 6c 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20  eleteBinaryFile 
ef90: 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c 61 74  { fileName {plat
efa0: 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f 73  form ""} {verbos
efb0: 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20  e true} } {..   
efc0: 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65 20     set fileName 
efd0: 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65 4e 61  [getBinaryFileNa
efe0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70 6c  me $fileName $pl
eff0: 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20  atform]....     
f000: 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69 73   if {![file exis
f010: 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
f020: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
f030: 66 20 7b 24 76 65 72 62 6f 73 65 7d 20 74 68 65  f {$verbose} the
f040: 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  n {..          t
f050: 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
f060: 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
f070: 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
f080: 20 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20    "---- skipped 
f090: 64 65 6c 65 74 69 6e 67 20 62 69 6e 61 72 79 20  deleting binary 
f0a0: 66 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61  file \"" $fileNa
f0b0: 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  me \..          
f0c0: 20 20 20 20 22 5c 22 2c 20 69 74 20 64 6f 65 73      "\", it does
f0d0: 20 6e 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a   not exist\n"]..
f0e0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f0f0: 20 20 20 20 20 72 65 74 75 72 6e 0d 0a 20 20 20       return..   
f100: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
f110: 20 7b 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64   {[catch {file d
f120: 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
f130: 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
f140: 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
f150: 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
f160: 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
f170: 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 64           "---- d
f180: 65 6c 65 74 65 64 20 62 69 6e 61 72 79 20 66 69  eleted binary fi
f190: 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65  le \"" $fileName
f1a0: 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20   \"\n]..      } 
f1b0: 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
f1c0: 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
f1d0: 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
f1e0: 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
f1f0: 20 22 2d 2d 2d 2d 20 66 61 69 6c 65 64 20 74 6f   "---- failed to
f200: 20 64 65 6c 65 74 65 20 62 69 6e 61 72 79 20 66   delete binary f
f210: 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
f220: 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  e \"\n]..      }
f230: 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
f240: 70 72 6f 63 20 74 72 79 44 65 6c 65 74 65 42 75  proc tryDeleteBu
f250: 69 6c 64 46 69 6c 65 20 7b 0d 0a 20 20 20 20 20  ildFile {..     
f260: 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65 20         fileName 
f270: 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 7b 70 6c 61  managedOnly {pla
f280: 74 66 6f 72 6d 20 22 22 7d 20 7b 76 65 72 62 6f  tform ""} {verbo
f290: 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  se true} } {..  
f2a0: 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
f2b0: 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61   [getBuildFileNa
f2c0: 6d 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 6d 61  me $fileName $ma
f2d0: 6e 61 67 65 64 4f 6e 6c 79 20 24 70 6c 61 74 66  nagedOnly $platf
f2e0: 6f 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66  orm]....      if
f2f0: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
f300: 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e  $fileName]} then
f310: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
f320: 24 76 65 72 62 6f 73 65 7d 20 74 68 65 6e 20 7b  $verbose} then {
f330: 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74  ..          tput
f340: 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
f350: 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
f360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
f370: 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 64 65 6c  ---- skipped del
f380: 65 74 69 6e 67 20 62 75 69 6c 64 20 66 69 6c 65  eting build file
f390: 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
f3a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f3b0: 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  "\", it does not
f3c0: 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20 20 20   exist\n"]..    
f3d0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
f3e0: 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 7d   return..      }
f3f0: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63  ....      if {[c
f400: 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c 65 74  atch {file delet
f410: 65 20 24 66 69 6c 65 4e 61 6d 65 7d 5d 20 3d 3d  e $fileName}] ==
f420: 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
f430: 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
f440: 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
f450: 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
f460: 20 20 20 20 20 22 2d 2d 2d 2d 20 64 65 6c 65 74       "---- delet
f470: 65 64 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  ed build file \"
f480: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
f490: 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
f4a0: 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  {..        tputs
f4b0: 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
f4c0: 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
f4e0: 2d 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65  - failed to dele
f4f0: 74 65 20 62 75 69 6c 64 20 66 69 6c 65 20 5c 22  te build file \"
f500: 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c 22 5c 6e  " $fileName \"\n
f510: 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  ]..      }..    
f520: 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 74  }.....    proc t
f530: 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 7b  ryCopyAssembly {
f540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 69  ..            fi
f550: 6c 65 4e 61 6d 65 20 6d 61 6e 61 67 65 64 4f 6e  leName managedOn
f560: 6c 79 20 7b 70 6c 61 74 66 6f 72 6d 20 22 22 7d  ly {platform ""}
f570: 20 7b 70 64 62 20 74 72 75 65 7d 20 7b 76 65 72   {pdb true} {ver
f580: 62 6f 73 65 20 74 72 75 65 7d 20 7d 20 7b 0d 0a  bose true} } {..
f590: 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75 69        tryCopyBui
f5a0: 6c 64 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65  ldFile $fileName
f5b0: 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20 24 70   $managedOnly $p
f5c0: 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65 72 62  latform "" $verb
f5d0: 6f 73 65 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  ose....      if 
f5e0: 7b 24 70 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20  {$pdb} then {.. 
f5f0: 20 20 20 20 20 20 20 74 72 79 43 6f 70 79 42 75         tryCopyBu
f600: 69 6c 64 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  ildFile [appendA
f610: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
f620: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
f630: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
f640: 62 5d 20 24 6d 61 6e 61 67 65 64 4f 6e 6c 79 20  b] $managedOnly 
f650: 24 70 6c 61 74 66 6f 72 6d 20 22 22 20 24 76 65  $platform "" $ve
f660: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rbose..      }..
f670: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f680: 6f 63 20 74 72 79 44 65 6c 65 74 65 41 73 73 65  oc tryDeleteAsse
f690: 6d 62 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20  mbly {..        
f6a0: 20 20 20 20 66 69 6c 65 4e 61 6d 65 20 7b 70 6c      fileName {pl
f6b0: 61 74 66 6f 72 6d 20 22 22 7d 20 7b 70 64 62 20  atform ""} {pdb 
f6c0: 74 72 75 65 7d 20 7b 76 65 72 62 6f 73 65 20 74  true} {verbose t
f6d0: 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
f6e0: 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
f6f0: 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 20 24 70  ile $fileName $p
f700: 6c 61 74 66 6f 72 6d 20 24 76 65 72 62 6f 73 65  latform $verbose
f710: 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24 70  ....      if {$p
f720: 64 62 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  db} then {..    
f730: 20 20 20 20 74 72 79 44 65 6c 65 74 65 42 69 6e      tryDeleteBin
f740: 61 72 79 46 69 6c 65 20 5b 61 70 70 65 6e 64 41  aryFile [appendA
f750: 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
f760: 20 20 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d     [file rootnam
f770: 65 20 24 66 69 6c 65 4e 61 6d 65 5d 20 2e 70 64  e $fileName] .pd
f780: 62 5d 20 24 70 6c 61 74 66 6f 72 6d 20 24 76 65  b] $platform $ve
f790: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 7d 0d 0a  rbose..      }..
f7a0: 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
f7b0: 6f 63 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62  oc tryLoadAssemb
f7c0: 6c 79 20 7b 20 66 69 6c 65 4e 61 6d 65 20 7b 70  ly { fileName {p
f7d0: 6c 61 74 66 6f 72 6d 20 22 22 7d 20 7d 20 7b 0d  latform ""} } {.
f7e0: 0a 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e  .      set fileN
f7f0: 61 6d 65 20 5b 67 65 74 42 69 6e 61 72 79 46 69  ame [getBinaryFi
f800: 6c 65 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65  leName $fileName
f810: 20 24 70 6c 61 74 66 6f 72 6d 5d 0d 0a 0d 0a 20   $platform].... 
f820: 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
f830: 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 61  {..        set a
f840: 73 73 65 6d 62 6c 79 20 5b 6f 62 6a 65 63 74 20  ssembly [object 
f850: 6c 6f 61 64 20 2d 6c 6f 61 64 74 79 70 65 20 46  load -loadtype F
f860: 69 6c 65 20 2d 61 6c 69 61 73 20 24 66 69 6c 65  ile -alias $file
f870: 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 7d 5d 20  Name]..      }] 
f880: 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
f890: 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
f8a0: 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20 61 64   # NOTE: Now, ad
f8b0: 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
f8c0: 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 2e  test constraint.
f8d0: 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
f8e0: 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
f8f0: 6e 74 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d  nt [file rootnam
f900: 65 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69  e [file tail $fi
f910: 6c 65 4e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20  leName]]....    
f920: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
f930: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
f940: 69 6d 61 67 65 20 72 75 6e 74 69 6d 65 20 76 65  image runtime ve
f950: 72 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61  rsion from the a
f960: 73 73 65 6d 62 6c 79 20 62 65 63 61 75 73 65 0d  ssembly because.
f970: 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
f980: 20 73 65 76 65 72 61 6c 20 74 65 73 74 73 20 72   several tests r
f990: 65 6c 79 20 6f 6e 20 69 74 20 68 61 76 69 6e 67  ely on it having
f9a0: 20 61 20 63 65 72 74 61 69 6e 20 76 61 6c 75 65   a certain value
f9b0: 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
f9c0: 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
f9d0: 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
f9e0: 5b 66 69 6c 65 20 74 61 69 6c 20 24 66 69 6c 65  [file tail $file
f9f0: 4e 61 6d 65 5d 20 5f 20 5c 0d 0a 20 20 20 20 20  Name] _ \..     
fa00: 20 20 20 20 20 20 20 5b 24 61 73 73 65 6d 62 6c         [$assembl
fa10: 79 20 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65  y ImageRuntimeVe
fa20: 72 73 69 6f 6e 5d 5d 0d 0a 0d 0a 20 20 20 20 20  rsion]]....     
fa30: 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
fa40: 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65  NOTE: Return the
fa50: 20 66 75 6c 6c 20 70 61 74 68 20 6f 66 20 74 68   full path of th
fa60: 65 20 6c 6f 61 64 65 64 20 66 69 6c 65 2e 0d 0a  e loaded file...
fa70: 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
fa80: 20 20 20 72 65 74 75 72 6e 20 24 66 69 6c 65 4e     return $fileN
fa90: 61 6d 65 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ame..      }....
faa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
fab0: 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
fac0: 72 6f 63 20 69 73 53 51 4c 69 74 65 52 65 61 64  roc isSQLiteRead
fad0: 79 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  y {} {..      #.
fae0: 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54  .      # NOTE: T
faf0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6d 75  his procedure mu
fb00: 73 74 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  st return non-ze
fb10: 72 6f 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 53  ro only if the S
fb20: 51 4c 69 74 65 20 6e 61 74 69 76 65 0d 0a 20 20  QLite native..  
fb30: 20 20 20 20 23 20 20 20 20 20 20 20 6c 69 62 72      #       libr
fb40: 61 72 79 20 61 6e 64 20 74 68 65 20 53 79 73 74  ary and the Syst
fb50: 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 6d  em.Data.SQLite m
fb60: 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
fb70: 61 72 65 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20  are loaded..    
fb80: 20 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65    #       and re
fb90: 61 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74  ady for use by t
fba0: 68 65 20 74 65 73 74 20 73 75 69 74 65 2e 20 20  he test suite.  
fbb0: 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 69 73 20  Currently, this 
fbc0: 70 72 6f 63 65 64 75 72 65 0d 0a 20 20 20 20 20  procedure..     
fbd0: 20 23 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20   #       should 
fbe0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 61  be called only a
fbf0: 66 74 65 72 20 74 68 65 20 5b 74 72 79 4c 6f 61  fter the [tryLoa
fc00: 64 41 73 73 65 6d 62 6c 79 5d 20 70 72 6f 63 65  dAssembly] proce
fc10: 64 75 72 65 20 68 61 73 0d 0a 20 20 20 20 20 20  dure has..      
fc20: 23 20 20 20 20 20 20 20 62 65 65 6e 20 63 61 6c  #       been cal
fc30: 6c 65 64 20 74 6f 20 70 72 6f 62 65 20 66 6f 72  led to probe for
fc40: 20 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61   the System.Data
fc50: 2e 53 51 4c 69 74 65 20 6d 61 6e 61 67 65 64 20  .SQLite managed 
fc60: 61 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20  assembly..      
fc70: 23 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20  #       and the 
fc80: 5b 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 5d  [checkForSQLite]
fc90: 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 62   procedure has b
fca0: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 70 72  een called to pr
fcb0: 6f 62 65 20 66 6f 72 0d 0a 20 20 20 20 20 20 23  obe for..      #
fcc0: 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
fcd0: 65 20 6e 61 74 69 76 65 20 6c 69 62 72 61 72 79  e native library
fce0: 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74 68 69  ; otherwise, thi
fcf0: 73 20 70 72 6f 63 65 64 75 72 65 20 77 69 6c 6c  s procedure will
fd00: 20 73 69 6d 70 6c 79 0d 0a 20 20 20 20 20 20 23   simply..      #
fd10: 20 20 20 20 20 20 20 61 6c 77 61 79 73 20 72 65         always re
fd20: 74 75 72 6e 20 7a 65 72 6f 2e 0d 0a 20 20 20 20  turn zero...    
fd30: 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75 72    #..      retur
fd40: 6e 20 5b 65 78 70 72 20 7b 0d 0a 20 20 20 20 20  n [expr {..     
fd50: 20 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69     [haveConstrai
fd60: 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  nt System.Data.S
fd70: 51 4c 69 74 65 5d 20 26 26 20 5b 68 61 76 65 43  QLite] && [haveC
fd80: 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
fd90: 5d 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20 20 20  ]..      }]..   
fda0: 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
fdb0: 6d 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 7b 20  matchPlatform { 
fdc0: 70 6c 61 74 66 6f 72 6d 20 7d 20 7b 0d 0a 20 20  platform } {..  
fdd0: 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
fde0: 4f 54 45 3a 20 41 6e 20 65 6d 70 74 79 20 73 74  OTE: An empty st
fdf0: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 70 6c 61  ring for the pla
fe00: 74 66 6f 72 6d 20 6d 65 61 6e 73 20 74 68 61 74  tform means that
fe10: 20 74 68 65 20 62 75 69 6c 64 20 69 73 20 6e 6f   the build is no
fe20: 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  t..      #      
fe30: 20 5b 70 72 69 6d 61 72 69 6c 79 5d 20 61 20 6e   [primarily] a n
fe40: 61 74 69 76 65 20 62 75 69 6c 64 3b 20 74 68 65  ative build; the
fe50: 72 65 66 6f 72 65 2c 20 69 74 20 61 6c 77 61 79  refore, it alway
fe60: 73 20 6d 61 74 63 68 65 73 2e 0d 0a 20 20 20 20  s matches...    
fe70: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b    #..      if {[
fe80: 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 70  string length $p
fe90: 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d 20 74  latform] == 0} t
fea0: 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  hen {..        r
feb0: 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20  eturn true..    
fec0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
fed0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
fee0: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 6e 61 6d   the machine nam
fef0: 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
ff00: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  , there is nothi
ff10: 6e 67 20 65 6c 73 65 20 77 65 0d 0a 20 20 20 20  ng else we..    
ff20: 20 20 23 20 20 20 20 20 20 20 63 61 6e 20 64 6f    #       can do
ff30: 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
ff40: 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
ff50: 73 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f  sts ::tcl_platfo
ff60: 72 6d 28 6d 61 63 68 69 6e 65 29 5d 7d 20 74 68  rm(machine)]} th
ff70: 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
ff80: 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20  turn false..    
ff90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
ffa0: 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 6f        # NOTE: Do
ffb0: 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
ffc0: 20 70 6c 61 74 66 6f 72 6d 20 6d 61 74 63 68 20   platform match 
ffd0: 75 70 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  up to the curren
ffe0: 74 20 70 72 6f 63 65 73 73 3f 0d 0a 20 20 20 20  t process?..    
fff0: 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 24    #..      if {$
10000 70 6c 61 74 66 6f 72 6d 20 65 71 20 5b 6d 61 63  platform eq [mac
10010 68 69 6e 65 54 6f 50 6c 61 74 66 6f 72 6d 20 24  hineToPlatform $
10020 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6d  ::tcl_platform(m
10030 61 63 68 69 6e 65 29 5d 7d 20 74 68 65 6e 20 7b  achine)]} then {
10040 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10050 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
10060 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
10070 20 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 70 65   # NOTE: The spe
10080 63 69 66 69 65 64 20 70 6c 61 74 66 6f 72 6d 20  cified platform 
10090 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 75  does not match u
100a0 70 20 77 69 74 68 20 74 68 65 20 70 6c 61 74 66  p with the platf
100b0 6f 72 6d 0d 0a 20 20 20 20 20 20 23 20 20 20 20  orm..      #    
100c0 20 20 20 66 6f 72 20 74 68 65 20 63 75 72 72 65     for the curre
100d0 6e 74 20 70 72 6f 63 65 73 73 2e 0d 0a 20 20 20  nt process...   
100e0 20 20 20 23 0d 0a 20 20 20 20 20 20 72 65 74 75     #..      retu
100f0 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d  rn false..    }.
10100 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68 61 76  ....    proc hav
10110 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
10120 6d 61 6e 64 20 7b 7d 20 7b 0d 0a 20 20 20 20 20  mand {} {..     
10130 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
10140 3a 20 49 73 20 74 68 65 20 5b 6f 62 6a 65 63 74  : Is the [object
10150 5d 20 63 6f 6d 6d 61 6e 64 20 63 75 72 72 65 6e  ] command curren
10160 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 3f 0d 0a  tly available?..
10170 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 72        #..      r
10180 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 6c  eturn [expr {[ll
10190 65 6e 67 74 68 20 5b 69 6e 66 6f 20 63 6f 6d 6d  ength [info comm
101a0 61 6e 64 73 20 6f 62 6a 65 63 74 5d 5d 20 3e 20  ands object]] > 
101b0 30 7d 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  0}]..    }..... 
101c0 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
101d0 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d  SQLiteObjectComm
101e0 61 6e 64 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20  and { channel } 
101f0 7b 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  {..      tputs $
10200 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68  channel "---- ch
10210 65 63 6b 69 6e 67 20 66 6f 72 20 5c 22 6f 62 6a  ecking for \"obj
10220 65 63 74 5c 22 20 63 6f 6d 6d 61 6e 64 20 75 73  ect\" command us
10230 61 67 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  age... "....    
10240 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
10250 73 74 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 4f  sts ::no(sqliteO
10260 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 29 5d 20 26  bjectCommand)] &
10270 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
10280 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
10290 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
102a0 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
102b0 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d 0a  $channel yes\n..
102c0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
102d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
102e0 20 20 20 23 20 4e 4f 54 45 3a 20 55 6e 6c 65 73     # NOTE: Unles
102f0 73 20 77 65 20 61 72 65 20 66 6f 72 62 69 64 64  s we are forbidd
10300 65 6e 20 66 72 6f 6d 20 64 6f 69 6e 67 20 73 6f  en from doing so
10310 2c 20 61 64 64 20 73 6f 6d 65 20 63 6f 6e 73 74  , add some const
10320 72 61 69 6e 74 73 0d 0a 20 20 20 20 20 20 20 20  raints..        
10330 23 20 20 20 20 20 20 20 74 68 61 74 20 77 69 6c  #       that wil
10340 6c 20 61 6c 6c 6f 77 20 6d 6f 73 74 20 6f 66 20  l allow most of 
10350 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20 74  the test suite t
10360 6f 20 72 75 6e 20 28 69 2e 65 2e 20 74 68 6f 73  o run (i.e. thos
10370 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
10380 20 20 20 74 65 73 74 73 20 74 68 61 74 20 64 6f     tests that do
10390 20 6e 6f 74 20 64 69 72 65 63 74 6c 79 20 72 65   not directly re
103a0 6c 79 20 75 70 6f 6e 20 74 68 65 20 5b 6f 62 6a  ly upon the [obj
103b0 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 29 2e 0d 0a  ect] command)...
103c0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
103d0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
103e0 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69 6d 53 51  ists ::no(shimSQ
103f0 4c 69 74 65 41 73 73 65 6d 62 6c 79 43 6f 6e 73  LiteAssemblyCons
10400 74 72 61 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20  traints)]} then 
10410 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  {..          add
10420 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
10430 65 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  e..          add
10440 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74  Constraint SQLit
10450 65 49 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20  eInterop..      
10460 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10470 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  t System.Data.SQ
10480 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
10490 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 79  addConstraint Sy
104a0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
104b0 2e 45 6e 63 72 79 70 74 69 6f 6e 0d 0a 20 20 20  .Encryption..   
104c0 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
104d0 61 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61  aint System.Data
104e0 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 0d 0a  .SQLite.Linq....
104f0 20 20 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e            addCon
10500 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41  straint [appendA
10510 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
10520 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
10530 2e 53 51 4c 69 74 65 2e 64 6c 6c 5f 76 20 5b 67  .SQLite.dll_v [g
10540 65 74 42 75 69 6c 64 43 6c 72 56 65 72 73 69 6f  etBuildClrVersio
10550 6e 5d 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  n]]..        }..
10560 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b  ..        if {![
10570 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
10580 28 73 68 69 6d 53 51 4c 69 74 65 44 65 66 69 6e  (shimSQLiteDefin
10590 65 43 6f 6e 73 74 61 6e 74 43 6f 6e 73 74 72 61  eConstantConstra
105a0 69 6e 74 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ints)]} then {..
105b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
105c0 68 20 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74  h defineConstant
105d0 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
105e0 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
105f0 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49  EXTENSION_FUNCTI
10600 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53 35  ONS INTEROP_FTS5
10610 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20  _EXTENSION \..  
10620 20 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45              INTE
10630 52 4f 50 5f 4a 53 4f 4e 31 5f 45 58 54 45 4e 53  ROP_JSON1_EXTENS
10640 49 4f 4e 20 49 4e 54 45 52 4f 50 5f 50 45 52 43  ION INTEROP_PERC
10650 45 4e 54 49 4c 45 5f 45 58 54 45 4e 53 49 4f 4e  ENTILE_EXTENSION
10660 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10670 20 20 49 4e 54 45 52 4f 50 5f 52 45 47 45 58 50    INTEROP_REGEXP
10680 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54 45 52  _EXTENSION INTER
10690 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e 53 49 4f  OP_TEST_EXTENSIO
106a0 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  N \..           
106b0 20 20 20 49 4e 54 45 52 4f 50 5f 53 45 53 53 49     INTEROP_SESSI
106c0 4f 4e 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  ON_EXTENSION INT
106d0 45 52 4f 50 5f 53 48 41 31 5f 45 58 54 45 4e 53  EROP_SHA1_EXTENS
106e0 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ION \..         
106f0 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54       INTEROP_TOT
10700 59 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  YPE_EXTENSION IN
10710 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
10720 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  BLE \..         
10730 20 20 20 20 20 55 53 45 5f 49 4e 54 45 52 4f 50       USE_INTEROP
10740 5f 44 4c 4c 5d 20 7b 0d 0a 20 20 20 20 20 20 20  _DLL] {..       
10750 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69       addConstrai
10760 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  nt [appendArgs \
10770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10780 20 20 5b 67 65 74 53 51 4c 69 74 65 44 65 66 69    [getSQLiteDefi
10790 6e 65 43 6f 6e 73 74 61 6e 74 50 72 65 66 69 78  neConstantPrefix
107a0 5d 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  ] $defineConstan
107b0 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  t]..          }.
107c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
107d0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
107e0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 73 68 69   exists ::no(shi
107f0 6d 53 51 4c 69 74 65 56 69 73 75 61 6c 53 74 75  mSQLiteVisualStu
10800 64 69 6f 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d  dioConstraints)]
10810 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
10820 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
10830 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 76 69  t [appendArgs vi
10840 73 75 61 6c 53 74 75 64 69 6f 20 5b 67 65 74 42  sualStudio [getB
10850 75 69 6c 64 59 65 61 72 5d 5d 0d 0a 20 20 20 20  uildYear]]..    
10860 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
10870 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
10880 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  no\n..      }.. 
10890 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
108a0 63 20 63 68 61 6e 67 65 4e 61 74 69 76 65 52 75  c changeNativeRu
108b0 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 7b 20 6e 61  ntimeOption { na
108c0 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20  tive } {..      
108d0 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e  if {[llength [in
108e0 66 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75  fo commands debu
108f0 67 5d 5d 20 3e 20 30 20 26 26 20 5c 0d 0a 20 20  g]] > 0 && \..  
10900 20 20 20 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68          [llength
10910 20 5b 69 6e 66 6f 20 73 75 62 63 6f 6d 6d 61 6e   [info subcomman
10920 64 73 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65  ds debug runtime
10930 6f 70 74 69 6f 6e 5d 5d 20 3e 20 30 20 26 26 20  option]] > 0 && 
10940 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
10950 20 20 64 65 62 75 67 20 72 75 6e 74 69 6d 65 6f    debug runtimeo
10960 70 74 69 6f 6e 20 5b 65 78 70 72 20 7b 24 6e 61  ption [expr {$na
10970 74 69 76 65 20 3f 20 22 61 64 64 22 20 3a 20 22  tive ? "add" : "
10980 72 65 6d 6f 76 65 22 7d 5d 20 6e 61 74 69 76 65  remove"}] native
10990 0d 0a 20 20 20 20 20 20 7d 5d 20 3d 3d 20 30 7d  ..      }] == 0}
109a0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
109b0 20 72 65 74 75 72 6e 20 74 72 75 65 0d 0a 20 20   return true..  
109c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
109d0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
109e0 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26 26 20  jectCommand] && 
109f0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
10a00 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
10a10 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74 41  Interpreter.GetA
10a20 63 74 69 76 65 20 5b 65 78 70 72 20 7b 24 6e 61  ctive [expr {$na
10a30 74 69 76 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20  tive ? \..      
10a40 20 20 20 20 20 20 22 41 64 64 52 75 6e 74 69 6d        "AddRuntim
10a50 65 4f 70 74 69 6f 6e 22 20 3a 20 22 52 65 6d 6f  eOption" : "Remo
10a60 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 22  veRuntimeOption"
10a70 7d 5d 20 6e 61 74 69 76 65 0d 0a 20 20 20 20 20  }] native..     
10a80 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b   }] == 0} then {
10a90 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
10aa0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
10ab0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
10ac0 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
10ad0 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f      proc checkFo
10ae0 72 53 51 4c 69 74 65 42 75 69 6c 64 73 20 7b 20  rSQLiteBuilds { 
10af0 63 68 61 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20  channel {select 
10b00 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20  false} } {..    
10b10 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
10b20 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 65 76 65  E: Check for eve
10b30 72 79 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 69  ry possible vali
10b40 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
10b50 20 76 61 6c 75 65 73 20 75 73 65 64 20 77 68 65   values used whe
10b60 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
10b70 20 6c 6f 63 61 74 69 6e 67 20 6f 75 74 20 74 68   locating out th
10b80 65 20 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64  e build output d
10b90 69 72 65 63 74 6f 72 79 2c 20 73 68 6f 77 69 6e  irectory, showin
10ba0 67 20 65 61 63 68 20 61 76 61 69 6c 61 62 6c 65  g each available
10bb0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
10bc0 62 75 69 6c 64 20 76 61 72 69 61 74 69 6f 6e 20  build variation 
10bd0 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 0d 0a  along the way...
10be0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 66        #..      f
10bf0 6f 72 65 61 63 68 20 6e 61 74 69 76 65 20 5b 6c  oreach native [l
10c00 69 73 74 20 66 61 6c 73 65 20 74 72 75 65 5d 20  ist false true] 
10c10 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  {..        forea
10c20 63 68 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  ch year [getBuil
10c30 64 59 65 61 72 73 5d 20 7b 0d 0a 20 20 20 20 20  dYears] {..     
10c40 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 6f 6e       foreach con
10c50 66 69 67 75 72 61 74 69 6f 6e 20 5b 67 65 74 42  figuration [getB
10c60 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
10c70 6e 73 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ns] {..         
10c80 20 20 20 66 6f 72 65 61 63 68 20 73 75 66 66 69     foreach suffi
10c90 78 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66 69  x [getBuildConfi
10ca0 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78 65 73  gurationSuffixes
10cb0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
10cc0 20 20 20 66 6f 72 65 61 63 68 20 65 78 74 72 61     foreach extra
10cd0 20 5b 67 65 74 42 75 69 6c 64 45 78 74 72 61 73   [getBuildExtras
10ce0 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ] {..           
10cf0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
10d00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
10d10 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
10d20 66 66 65 63 74 69 76 65 20 62 75 69 6c 64 20 70  ffective build p
10d30 6c 61 74 66 6f 72 6d 2e 20 20 54 68 69 73 20 69  latform.  This i
10d40 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
10d50 20 20 20 23 20 20 20 20 20 20 20 62 61 73 65 64     #       based
10d60 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
10d70 6f 74 20 61 20 5b 70 72 69 6d 61 72 69 6c 79 5d  ot a [primarily]
10d80 20 6e 61 74 69 76 65 20 62 75 69 6c 64 0d 0a 20   native build.. 
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
10da0 20 20 20 20 20 20 20 69 73 20 62 65 69 6e 67 20         is being 
10db0 75 73 65 64 2e 20 20 46 6f 72 20 5b 70 72 69 6d  used.  For [prim
10dc0 61 72 69 6c 79 5d 20 6e 6f 6e 2d 6e 61 74 69 76  arily] non-nativ
10dd0 65 20 62 75 69 6c 64 73 2c 0d 0a 20 20 20 20 20  e builds,..     
10de0 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
10df0 20 20 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20     this will be 
10e00 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
10e10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10e20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
10e30 20 20 20 20 20 73 65 74 20 70 6c 61 74 66 6f 72       set platfor
10e40 6d 20 5b 67 65 74 42 75 69 6c 64 50 6c 61 74 66  m [getBuildPlatf
10e50 6f 72 6d 20 24 6e 61 74 69 76 65 5d 0d 0a 0d 0a  orm $native]....
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  #..             
10e80 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
10e90 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69   the fully quali
10ea0 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 20 77  fied directory w
10eb0 68 65 72 65 20 74 68 65 0d 0a 20 20 20 20 20 20  here the..      
10ec0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
10ed0 20 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6d 70    necessary comp
10ee0 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74 65  onents for Syste
10ef0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73 68  m.Data.SQLite sh
10f00 6f 75 6c 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ould..          
10f10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65        #       be
10f20 20 66 6f 75 6e 64 2e 0d 0a 20 20 20 20 20 20 20   found...       
10f30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
10f40 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
10f50 64 69 72 65 63 74 6f 72 79 20 5b 6a 6f 69 6e 42  directory [joinB
10f60 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 24 6e  uildDirectory $n
10f70 61 74 69 76 65 20 5c 0d 0a 20 20 20 20 20 20 20  ative \..       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
10f90 74 42 75 69 6c 64 42 61 73 65 44 69 72 65 63 74  tBuildBaseDirect
10fa0 6f 72 79 5d 20 24 79 65 61 72 20 24 70 6c 61 74  ory] $year $plat
10fb0 66 6f 72 6d 20 5b 61 70 70 65 6e 64 41 72 67 73  form [appendArgs
10fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
10fd0 20 20 20 20 20 20 20 20 24 63 6f 6e 66 69 67 75          $configu
10fe0 72 61 74 69 6f 6e 20 24 73 75 66 66 69 78 5d 20  ration $suffix] 
10ff0 24 65 78 74 72 61 5d 0d 0a 0d 0a 20 20 20 20 20  $extra]....     
11000 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11010 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
11020 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
11040 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  -- checking for 
11050 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11060 74 65 20 62 75 69 6c 64 20 5c 22 22 20 5b 65 78  te build \"" [ex
11070 70 72 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  pr \..          
11080 20 20 20 20 20 20 20 20 20 20 7b 24 6e 61 74 69            {$nati
11090 76 65 20 3f 20 22 6e 61 74 69 76 65 2f 22 20 3a  ve ? "native/" :
110a0 20 22 22 7d 5d 20 5b 65 78 70 72 20 7b 5b 73 74   ""}] [expr {[st
110b0 72 69 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20  ring length \.. 
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20     $platform] > 
110e0 30 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20  0 ? [appendArgs 
110f0 24 70 6c 61 74 66 6f 72 6d 20 2f 5d 20 3a 20 22  $platform /] : "
11100 22 7d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  "}] \..         
11110 20 20 20 20 20 20 20 20 20 20 20 24 79 65 61 72             $year
11120 20 2f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24   / [appendArgs $
11130 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 24 73  configuration $s
11140 75 66 66 69 78 5d 20 22 5c 22 2e 2e 2e 20 22 5d  uffix] "\"... "]
11150 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11160 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
11170 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44         # NOTE: D
11180 6f 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  o the necessary 
11190 66 69 6c 65 73 20 65 78 69 73 74 3f 20 20 43 75  files exist?  Cu
111a0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 6f 74 68 65  rrently, no othe
111b0 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
111c0 20 20 20 23 20 20 20 20 20 20 20 73 74 65 70 73     #       steps
111d0 20 61 72 65 20 74 61 6b 65 6e 20 74 6f 20 76 65   are taken to ve
111e0 72 69 66 79 20 74 68 69 73 20 62 75 69 6c 64 20  rify this build 
111f0 69 73 20 61 63 74 75 61 6c 6c 79 0d 0a 20 20 20  is actually..   
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20               #  
11210 20 20 20 20 20 76 69 61 62 6c 65 2e 0d 0a 20 20       viable...  
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
11230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11240 20 73 65 74 20 73 6b 69 70 4e 61 74 69 76 65 20   set skipNative 
11250 5b 65 78 70 72 20 7b 5b 69 73 44 6f 74 4e 65 74  [expr {[isDotNet
11260 43 6f 72 65 5d 20 26 26 20 5b 69 73 57 69 6e 64  Core] && [isWind
11270 6f 77 73 5d 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20  ows]}]....      
11280 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69            if {[i
11290 73 42 75 69 6c 64 41 76 61 69 6c 61 62 6c 65 20  sBuildAvailable 
112a0 24 6e 61 74 69 76 65 20 24 73 6b 69 70 4e 61 74  $native $skipNat
112b0 69 76 65 20 24 64 69 72 65 63 74 6f 72 79 5d 7d  ive $directory]}
112c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
112d0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 23 20 4e 4f 54 45 3a 20 57 68 65 6e 20 69 6e 20  # NOTE: When in 
11300 22 73 65 6c 65 63 74 22 20 6d 6f 64 65 2c 20 61  "select" mode, a
11310 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 6c  utomatically sel
11320 65 63 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20  ect the..       
11330 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20             #    
11340 20 20 20 66 69 72 73 74 20 61 76 61 69 6c 61 62     first availab
11350 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 79 73 74  le build of Syst
11360 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 61  em.Data.SQLite a
11370 6e 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  nd..            
11380 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
11390 65 6e 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  en return immedi
113a0 61 74 65 6c 79 2e 0d 0a 20 20 20 20 20 20 20 20  ately...        
113b0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
113d0 66 20 7b 24 73 65 6c 65 63 74 20 26 26 20 5b 6d  f {$select && [m
113e0 61 74 63 68 50 6c 61 74 66 6f 72 6d 20 24 70 6c  atchPlatform $pl
113f0 61 74 66 6f 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d  atform]} then {.
11400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11410 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
11420 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f              # NO
11430 54 45 3a 20 4d 61 6e 75 61 6c 6c 79 20 6f 76 65  TE: Manually ove
11440 72 72 69 64 65 20 61 6c 6c 20 74 68 65 20 62 75  rride all the bu
11450 69 6c 64 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  ild directory.. 
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 23 20 20 20 20 20 20 20 73 65 6c 65 63     #       selec
11480 74 69 6f 6e 20 72 65 6c 61 74 65 64 20 74 65 73  tion related tes
11490 74 20 73 65 74 74 69 6e 67 73 20 69 6e 20 6f 72  t settings in or
114a0 64 65 72 20 74 6f 0d 0a 20 20 20 20 20 20 20 20  der to..        
114b0 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
114c0 20 20 20 20 66 6f 72 63 65 20 74 68 69 73 20 62      force this b
114d0 75 69 6c 64 20 6f 66 20 53 79 73 74 65 6d 2e 44  uild of System.D
114e0 61 74 61 2e 53 51 4c 69 74 65 20 74 6f 20 62 65  ata.SQLite to be
114f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11500 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
11510 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed...           
11520 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 69 66 20 7b 21 5b 63 68 61 6e 67 65 4e 61 74 69  if {![changeNati
11550 76 65 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  veRuntimeOption 
11560 24 6e 61 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b  $native]} then {
11570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11580 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
11590 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
115a0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 22 6e 6f 2c 20 66 61 69 6c 65 64 20 74 6f 20 22  "no, failed to "
115d0 20 5b 65 78 70 72 20 7b 24 6e 61 74 69 76 65 20   [expr {$native 
115e0 3f 20 22 61 64 64 22 20 3a 20 5c 0d 0a 20 20 20  ? "add" : \..   
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 20 20 20 20 20 22 72 65 6d 6f 76 65 22 7d         "remove"}
11610 5d 20 22 20 74 68 65 20 5c 22 6e 61 74 69 76 65  ] " the \"native
11620 5c 22 20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f  \" runtime optio
11630 6e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  n\n"]....       
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
11650 65 74 75 72 6e 20 66 61 6c 73 65 0d 0a 20 20 20  eturn false..   
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
11680 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
11690 74 65 73 74 5f 6e 61 74 69 76 65 20 24 73 6b 69  test_native $ski
116a0 70 4e 61 74 69 76 65 0d 0a 20 20 20 20 20 20 20  pNative..       
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
116c0 20 3a 3a 74 65 73 74 5f 79 65 61 72 20 24 79 65   ::test_year $ye
116d0 61 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ar....          
116e0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
116f0 74 65 73 74 5f 6e 61 74 69 76 65 5f 79 65 61 72  test_native_year
11700 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11710 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
11720 42 75 69 6c 64 4e 61 74 69 76 65 59 65 61 72 46  BuildNativeYearF
11730 6f 72 44 6f 74 4e 65 74 43 6f 72 65 20 24 79 65  orDotNetCore $ye
11740 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ar]....         
11750 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
11760 3a 74 65 73 74 5f 70 6c 61 74 66 6f 72 6d 20 24  :test_platform $
11770 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20  platform..      
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
11790 74 20 3a 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75  t ::test_configu
117a0 72 61 74 69 6f 6e 20 24 63 6f 6e 66 69 67 75 72  ration $configur
117b0 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ation..         
117c0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a             set :
117d0 3a 74 65 73 74 5f 63 6f 6e 66 69 67 75 72 61 74  :test_configurat
117e0 69 6f 6e 5f 73 75 66 66 69 78 20 24 73 75 66 66  ion_suffix $suff
117f0 69 78 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ix....          
11800 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
11810 74 65 73 74 5f 6e 61 74 69 76 65 5f 63 6f 6e 66  test_native_conf
11820 69 67 75 72 61 74 69 6f 6e 5f 73 75 66 66 69 78  iguration_suffix
11830 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11840 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
11850 42 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69  BuildNativeConfi
11860 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78 46 6f  gurationSuffixFo
11870 72 44 6f 74 4e 65 74 43 6f 72 65 20 5c 0d 0a 20  rDotNetCore \.. 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 20 20 20 20 24 73 75 66 66 69 78 5d 0d         $suffix].
118a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
118b0 20 20 20 20 20 20 20 73 65 74 20 3a 3a 74 65 73         set ::tes
118c0 74 5f 65 78 74 72 61 20 24 65 78 74 72 61 0d 0a  t_extra $extra..
118d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
118e0 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
118f0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
11900 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
11910 20 20 20 20 20 20 20 20 20 20 20 20 22 79 65 73              "yes
11920 2c 20 73 65 6c 65 63 74 65 64 20 28 22 20 5b 65  , selected (" [e
11930 78 70 72 20 7b 24 6e 61 74 69 76 65 20 3f 20 22  xpr {$native ? "
11940 6e 61 74 69 76 65 2f 22 20 3a 20 22 22 7d 5d 20  native/" : ""}] 
11950 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
11960 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72             [expr
11970 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
11980 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 20   $platform] > 0 
11990 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  ? [appendArgs \.
119a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
119b0 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f           $platfo
119c0 72 6d 20 2f 5d 20 3a 20 22 22 7d 5d 20 24 79 65  rm /] : ""}] $ye
119d0 61 72 20 2f 20 5b 61 70 70 65 6e 64 41 72 67 73  ar / [appendArgs
119e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
119f0 20 20 20 20 20 20 20 20 20 20 20 20 24 63 6f 6e              $con
11a00 66 69 67 75 72 61 74 69 6f 6e 20 24 73 75 66 66  figuration $suff
11a10 69 78 5d 20 5b 65 78 70 72 20 7b 5b 73 74 72 69  ix] [expr {[stri
11a20 6e 67 20 6c 65 6e 67 74 68 20 5c 0d 0a 20 20 20  ng length \..   
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 24 65 78 74 72 61 5d 20 3e 20 30       $extra] > 0
11a50 20 3f 20 5b 61 70 70 65 6e 64 41 72 67 73 20 2f   ? [appendArgs /
11a60 20 24 65 78 74 72 61 5d 20 3a 20 22 22 7d 5d 20   $extra] : ""}] 
11a70 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ")\n"]....      
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
11a90 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
11ab0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
11ac0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
11ad0 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
11ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11af0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
11b00 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
11b30 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20   no\n..         
11b40 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11b50 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11b60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
11b70 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
11b80 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
11b90 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 0d     return false.
11ba0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
11bb0 72 6f 63 20 63 68 65 63 6b 46 6f 72 53 51 4c 69  roc checkForSQLi
11bc0 74 65 52 65 6c 65 61 73 65 73 20 7b 20 63 68 61  teReleases { cha
11bd0 6e 6e 65 6c 20 7b 73 65 6c 65 63 74 20 66 61 6c  nnel {select fal
11be0 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
11bf0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
11c00 43 68 65 63 6b 20 66 6f 72 20 70 61 73 74 20 72  Check for past r
11c10 65 6c 65 61 73 65 73 20 6f 66 20 53 79 73 74 65  eleases of Syste
11c20 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 69 6e  m.Data.SQLite in
11c30 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a   the directory..
11c40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
11c50 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 22  ntained in the "
11c60 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
11c70 74 65 22 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  te" environment 
11c80 76 61 72 69 61 62 6c 65 2c 20 69 66 0d 0a 20 20  variable, if..  
11c90 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
11ca0 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ent...      #.. 
11cb0 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
11cc0 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 79 73 74  xists ::env(Syst
11cd0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 29 5d  em.Data.SQLite)]
11ce0 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
11cf0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
11d00 24 3a 3a 65 6e 76 28 53 79 73 74 65 6d 2e 44 61  $::env(System.Da
11d10 74 61 2e 53 51 4c 69 74 65 29 5d 20 3e 20 30 7d  ta.SQLite)] > 0}
11d20 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
11d30 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
11d40 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20 66 75  TE: Build the fu
11d50 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 64 69  lly qualified di
11d60 72 65 63 74 6f 72 79 20 77 68 65 72 65 20 74 68  rectory where th
11d70 65 20 6e 65 63 65 73 73 61 72 79 0d 0a 20 20 20  e necessary..   
11d80 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 6d       #       com
11d90 70 6f 6e 65 6e 74 73 20 66 6f 72 20 53 79 73 74  ponents for Syst
11da0 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 73  em.Data.SQLite s
11db0 68 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 2e 0d  hould be found..
11dc0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
11dd0 20 20 20 20 73 65 74 20 64 69 72 65 63 74 6f 72      set director
11de0 79 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  y [file nativena
11df0 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d  me [file join \.
11e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 3a 3a  .            $::
11e10 65 6e 76 28 53 79 73 74 65 6d 2e 44 61 74 61 2e  env(System.Data.
11e20 53 51 4c 69 74 65 29 20 5b 67 65 74 52 65 6c 65  SQLite) [getRele
11e30 61 73 65 56 65 72 73 69 6f 6e 5d 5d 5d 0d 0a 0d  aseVersion]]]...
11e40 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
11e50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
11e60 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
11e70 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
11e80 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
11e90 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65  a.SQLite release
11ea0 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20   \"" \..        
11eb0 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22      $directory "
11ec0 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20  \"... "]....    
11ed0 20 20 20 20 69 66 20 7b 5b 69 73 52 65 6c 65 61      if {[isRelea
11ee0 73 65 41 76 61 69 6c 61 62 6c 65 20 24 64 69 72  seAvailable $dir
11ef0 65 63 74 6f 72 79 20 70 6c 61 74 66 6f 72 6d 5d  ectory platform]
11f00 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
11f10 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
11f20 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
11f30 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
11f40 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11f50 70 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e  platform unknown
11f60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
11f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24  .          if {$
11f80 73 65 6c 65 63 74 20 26 26 20 5b 6d 61 74 63 68  select && [match
11f90 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
11fa0 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
11fb0 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62           set ::b
11fc0 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20 24  uild_directory $
11fd0 64 69 72 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20  directory....   
11fe0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
11ff0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
12000 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65 63 74  rgs "yes, select
12010 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20  ed (" $platform 
12020 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ")\n"]....      
12030 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
12040 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  e..          } e
12050 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
12060 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
12070 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 79  l [appendArgs "y
12080 65 73 20 28 22 20 24 70 6c 61 74 66 6f 72 6d 20  es (" $platform 
12090 22 29 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20  ")\n"]..        
120a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
120b0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
120c0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
120d0 6e 6f 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  no\n....        
120e0 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78 69    if {![file exi
120f0 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d 20  sts $directory] 
12100 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  || \..          
12110 20 20 20 20 21 5b 66 69 6c 65 20 69 73 64 69 72      ![file isdir
12120 65 63 74 6f 72 79 20 24 64 69 72 65 63 74 6f 72  ectory $director
12130 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
12140 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
12150 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
12160 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
12170 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69        "---- envi
12180 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
12190 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
121a0 51 4c 69 74 65 5c 22 20 69 73 20 61 6e 20 22 20  QLite\" is an " 
121b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
121c0 20 20 20 22 69 6e 76 61 6c 69 64 20 64 69 72 65     "invalid dire
121d0 63 74 6f 72 79 2c 20 73 6b 69 70 70 69 6e 67 20  ctory, skipping 
121e0 63 68 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73  check for releas
121f0 65 73 2e 2e 2e 5c 6e 22 5d 0d 0a 0d 0a 20 20 20  es...\n"]....   
12200 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12210 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  false..         
12220 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12230 66 6f 72 65 61 63 68 20 70 61 74 68 20 5b 6c 73  foreach path [ls
12240 6f 72 74 20 2d 64 65 63 72 65 61 73 69 6e 67 20  ort -decreasing 
12250 5b 66 69 6c 65 20 6c 69 73 74 20 24 64 69 72 65  [file list $dire
12260 63 74 6f 72 79 20 2a 5d 5d 20 7b 0d 0a 20 20 20  ctory *]] {..   
12270 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69           if {[fi
12280 6c 65 20 65 78 69 73 74 73 20 24 70 61 74 68 5d  le exists $path]
12290 20 26 26 20 5b 66 69 6c 65 20 69 73 64 69 72 65   && [file isdire
122a0 63 74 6f 72 79 20 24 70 61 74 68 5d 7d 20 74 68  ctory $path]} th
122b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
122c0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
122d0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
122e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
122f0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
12300 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
12310 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 65 61 73  ta.SQLite releas
12320 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
12330 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68             $path
12340 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20   "\"... "]....  
12350 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
12360 5b 69 73 52 65 6c 65 61 73 65 41 76 61 69 6c 61  [isReleaseAvaila
12370 62 6c 65 20 24 70 61 74 68 20 70 6c 61 74 66 6f  ble $path platfo
12380 72 6d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  rm]} then {..   
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
123a0 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
123b0 24 70 6c 61 74 66 6f 72 6d 5d 20 3d 3d 20 30 7d  $platform] == 0}
123c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
123d0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70             set p
123e0 6c 61 74 66 6f 72 6d 20 75 6e 6b 6e 6f 77 6e 0d  latform unknown.
123f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12400 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
12410 20 20 20 20 20 20 69 66 20 7b 24 73 65 6c 65 63        if {$selec
12420 74 20 26 26 20 5b 6d 61 74 63 68 50 6c 61 74 66  t && [matchPlatf
12430 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 7d 20  orm $platform]} 
12440 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
12450 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
12460 62 75 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 20  build_directory 
12470 24 70 61 74 68 0d 0a 0d 0a 20 20 20 20 20 20 20  $path....       
12480 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
12490 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
124a0 64 41 72 67 73 20 22 79 65 73 2c 20 73 65 6c 65  dArgs "yes, sele
124b0 63 74 65 64 20 28 22 20 24 70 6c 61 74 66 6f 72  cted (" $platfor
124c0 6d 20 22 29 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  m ")\n"]....    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
124e0 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
124f0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
12500 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
12510 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12520 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
12530 73 20 22 79 65 73 20 28 22 20 24 70 6c 61 74 66  s "yes (" $platf
12540 6f 72 6d 20 22 29 5c 6e 22 5d 0d 0a 20 20 20 20  orm ")\n"]..    
12550 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
12570 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
12580 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
12590 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
125a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
125b0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
125c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
125d0 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
125e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
125f0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
12600 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
12610 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 6e 76 69        "---- envi
12620 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
12630 20 5c 22 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \"System.Data.S
12640 51 4c 69 74 65 5c 22 20 69 73 20 6e 6f 74 20 22  QLite\" is not "
12650 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12660 22 73 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 63  "set, skipping c
12670 68 65 63 6b 20 66 6f 72 20 72 65 6c 65 61 73 65  heck for release
12680 73 2e 2e 2e 5c 6e 22 5d 0d 0a 20 20 20 20 20 20  s...\n"]..      
12690 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  }....      retur
126a0 6e 20 66 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a  n false..    }..
126b0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63  ...    proc chec
126c0 6b 46 6f 72 53 51 4c 69 74 65 4c 69 62 72 61 72  kForSQLiteLibrar
126d0 79 20 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d  y { channel } {.
126e0 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
126f0 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63  annel "---- chec
12700 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20  king for SQLite 
12710 63 6f 72 65 20 6c 69 62 72 61 72 79 2e 2e 2e 20  core library... 
12720 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  "....      if {[
12730 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
12740 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
12750 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
12760 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
12770 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
12780 74 65 2e 53 51 4c 69 74 65 33 20 53 51 4c 69 74  te.SQLite3 SQLit
12790 65 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  eVersion..      
127a0 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d  } version] == 0}
127b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
127c0 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
127d0 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65  TE: Check if the
127e0 20 72 65 74 75 72 6e 65 64 20 76 65 72 73 69 6f   returned versio
127f0 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49 66 20  n was null.  If 
12800 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65 61 73 79  so, make it easy
12810 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
12820 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20 20 20    to spot...    
12830 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
12840 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
12850 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30  h $version] == 0
12860 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
12870 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e 20      set version 
12880 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d  null..        }.
12890 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
128a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 74        # NOTE: At
128b0 74 65 6d 70 74 20 74 6f 20 71 75 65 72 79 20 74  tempt to query t
128c0 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72 63 65  he Fossil source
128d0 20 69 64 65 6e 74 69 66 69 65 72 20 66 6f 72 20   identifier for 
128e0 74 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20  the SQLite..    
128f0 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72 65      #       core
12900 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20   library...     
12910 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
12920 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
12930 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
12940 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
12950 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
12960 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
12970 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65  ta.SQLite.SQLite
12980 33 20 53 51 4c 69 74 65 53 6f 75 72 63 65 49 64  3 SQLiteSourceId
12990 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 6f 75 72  ..        } sour
129a0 63 65 49 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  ceId]} then {.. 
129b0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
129c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
129d0 20 66 61 69 6c 65 64 20 74 6f 20 71 75 65 72 79   failed to query
129e0 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75 72   the Fossil sour
129f0 63 65 20 69 64 65 6e 74 69 66 69 65 72 2e 0d 0a  ce identifier...
12a00 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
12a10 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
12a20 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d 0a 20 20 20  eId unknown..   
12a30 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
12a40 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
12a50 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74 68  OTE: Check if th
12a60 65 20 72 65 74 75 72 6e 65 64 20 46 6f 73 73 69  e returned Fossi
12a70 6c 20 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66  l source identif
12a80 69 65 72 20 77 61 73 20 6e 75 6c 6c 2e 20 20 49  ier was null.  I
12a90 66 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  f..        #    
12aa0 20 20 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65     so, make it e
12ab0 61 73 79 20 74 6f 20 73 70 6f 74 2e 0d 0a 20 20  asy to spot...  
12ac0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
12ad0 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
12ae0 67 74 68 20 24 73 6f 75 72 63 65 49 64 5d 20 3d  gth $sourceId] =
12af0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
12b00 20 20 20 20 20 20 20 73 65 74 20 73 6f 75 72 63         set sourc
12b10 65 49 64 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20  eId null..      
12b20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
12b30 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
12b40 3a 20 59 65 73 2c 20 74 68 65 20 53 51 4c 69 74  : Yes, the SQLit
12b50 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20 61  e core library a
12b60 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61  ppears to be ava
12b70 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20  ilable...       
12b80 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   #..        addC
12b90 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c 69 74 65  onstraint SQLite
12ba0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
12bb0 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52         # NOTE: R
12bc0 65 63 6f 72 64 20 76 65 72 73 69 6f 6e 20 6f 66  ecord version of
12bd0 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
12be0 20 6c 69 62 72 61 72 79 20 66 6f 72 20 6c 61 74   library for lat
12bf0 65 72 20 75 73 65 0d 0a 20 20 20 20 20 20 20 20  er use..        
12c00 23 20 20 20 20 20 20 20 62 79 20 74 65 73 74 20  #       by test 
12c10 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65  constraint expre
12c20 73 73 69 6f 6e 73 2c 20 65 74 63 2e 20 20 49 66  ssions, etc.  If
12c30 20 74 68 69 73 20 76 61 6c 75 65 20 68 61 73 0d   this value has.
12c40 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
12c50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
12c60 74 20 28 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  t (or overridden
12c70 29 2c 20 73 6b 69 70 20 73 65 74 74 69 6e 67 20  ), skip setting 
12c80 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  it...        #..
12c90 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
12ca0 66 6f 20 65 78 69 73 74 73 20 3a 3a 63 6f 72 65  fo exists ::core
12cb0 5f 6c 69 62 72 61 72 79 5f 76 65 72 73 69 6f 6e  _library_version
12cc0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
12cd0 20 20 20 20 20 73 65 74 20 3a 3a 63 6f 72 65 5f       set ::core_
12ce0 6c 69 62 72 61 72 79 5f 76 65 72 73 69 6f 6e 20  library_version 
12cf0 24 76 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20  $version..      
12d00 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74    }....        t
12d10 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
12d20 70 70 65 6e 64 41 72 67 73 20 22 79 65 73 20 28  ppendArgs "yes (
12d30 22 20 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24  " $version " " $
12d40 73 6f 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d  sourceId ")\n"].
12d50 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
12d60 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
12d70 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20  channel no\n..  
12d80 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
12d90 0a 20 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46  .    proc checkF
12da0 6f 72 53 51 4c 69 74 65 49 6e 74 65 72 6f 70 20  orSQLiteInterop 
12db0 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
12dc0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
12dd0 6e 65 6c 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69  nel "---- checki
12de0 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20 69 6e  ng for SQLite in
12df0 74 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 2e 2e  terop assembly..
12e00 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  . "....      if 
12e10 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
12e20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
12e30 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c   -flags +NonPubl
12e40 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ic \..          
12e50 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
12e60 4c 69 74 65 2e 53 51 4c 69 74 65 33 20 49 6e 74  Lite.SQLite3 Int
12e70 65 72 6f 70 56 65 72 73 69 6f 6e 0d 0a 20 20 20  eropVersion..   
12e80 20 20 20 7d 20 76 65 72 73 69 6f 6e 5d 20 3d 3d     } version] ==
12e90 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
12ea0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
12eb0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
12ec0 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 65 72  the returned ver
12ed0 73 69 6f 6e 20 77 61 73 20 6e 75 6c 6c 2e 20 20  sion was null.  
12ee0 49 66 20 73 6f 2c 20 6d 61 6b 65 20 69 74 20 65  If so, make it e
12ef0 61 73 79 0d 0a 20 20 20 20 20 20 20 20 23 20 20  asy..        #  
12f00 20 20 20 20 20 74 6f 20 73 70 6f 74 2e 0d 0a 20       to spot... 
12f10 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
12f20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
12f30 6e 67 74 68 20 24 76 65 72 73 69 6f 6e 5d 20 3d  ngth $version] =
12f40 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
12f50 20 20 20 20 20 20 20 73 65 74 20 76 65 72 73 69         set versi
12f60 6f 6e 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20  on null..       
12f70 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
12f80 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
12f90 20 41 74 74 65 6d 70 74 20 74 6f 20 71 75 65 72   Attempt to quer
12fa0 79 20 74 68 65 20 46 6f 73 73 69 6c 20 73 6f 75  y the Fossil sou
12fb0 72 63 65 20 69 64 65 6e 74 69 66 69 65 72 20 66  rce identifier f
12fc0 6f 72 20 74 68 65 20 53 51 4c 69 74 65 0d 0a 20  or the SQLite.. 
12fd0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
12fe0 6f 72 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20  ore library...  
12ff0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13000 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
13010 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20           object 
13020 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
13030 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
13040 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d            System
13050 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c  .Data.SQLite.SQL
13060 69 74 65 33 20 49 6e 74 65 72 6f 70 53 6f 75 72  ite3 InteropSour
13070 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ceId..        } 
13080 73 6f 75 72 63 65 49 64 5d 7d 20 74 68 65 6e 20  sourceId]} then 
13090 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
130a0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
130b0 3a 20 57 65 20 66 61 69 6c 65 64 20 74 6f 20 71  : We failed to q
130c0 75 65 72 79 20 74 68 65 20 46 6f 73 73 69 6c 20  uery the Fossil 
130d0 73 6f 75 72 63 65 20 69 64 65 6e 74 69 66 69 65  source identifie
130e0 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  r...          #.
130f0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
13100 6f 75 72 63 65 49 64 20 75 6e 6b 6e 6f 77 6e 0d  ourceId unknown.
13110 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
13120 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13130 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
13140 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 46  f the returned F
13150 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 69 64 65  ossil source ide
13160 6e 74 69 66 69 65 72 20 77 61 73 20 6e 75 6c 6c  ntifier was null
13170 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20 23  .  If..        #
13180 20 20 20 20 20 20 20 73 6f 2c 20 6d 61 6b 65 20         so, make 
13190 69 74 20 65 61 73 79 20 74 6f 20 73 70 6f 74 2e  it easy to spot.
131a0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
131b0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
131c0 20 6c 65 6e 67 74 68 20 24 73 6f 75 72 63 65 49   length $sourceI
131d0 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  d] == 0} then {.
131e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73  .          set s
131f0 6f 75 72 63 65 49 64 20 6e 75 6c 6c 0d 0a 20 20  ourceId null..  
13200 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
13210 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
13220 4e 4f 54 45 3a 20 42 65 66 6f 72 65 20 61 63 74  NOTE: Before act
13230 75 61 6c 6c 79 20 61 64 64 69 6e 67 20 74 68 65  ually adding the
13240 20 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74   test constraint
13250 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 0d  , make sure the.
13260 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
13270 20 76 65 72 73 69 6f 6e 20 69 73 20 76 61 6c 69   version is vali
13280 64 20 28 69 2e 65 2e 20 6e 6f 74 20 6a 75 73 74  d (i.e. not just
13290 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64 20 71   that we could q
132a0 75 65 72 79 20 69 74 29 2e 0d 0a 20 20 20 20 20  uery it)...     
132b0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66     #..        if
132c0 20 7b 24 76 65 72 73 69 6f 6e 20 6e 65 20 22 6e   {$version ne "n
132d0 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ull"} then {..  
132e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
132f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73       # NOTE: Yes
13300 2c 20 74 68 65 20 53 51 4c 69 74 65 20 69 6e 74  , the SQLite int
13310 65 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 61 70  erop assembly ap
13320 70 65 61 72 73 20 74 6f 20 62 65 20 61 76 61 69  pears to be avai
13330 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20  lable...        
13340 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61    #..          a
13350 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 53 51 4c  ddConstraint SQL
13360 69 74 65 49 6e 74 65 72 6f 70 0d 0a 0d 0a 20 20  iteInterop....  
13370 20 20 20 20 20 20 20 20 73 65 74 20 61 6e 73 77          set answ
13380 65 72 20 79 65 73 0d 0a 20 20 20 20 20 20 20 20  er yes..        
13390 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
133a0 20 20 20 20 73 65 74 20 61 6e 73 77 65 72 20 6e      set answer n
133b0 6f 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  o..        }....
133c0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
133d0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
133e0 67 73 20 24 61 6e 73 77 65 72 20 22 20 28 22 20  gs $answer " (" 
133f0 24 76 65 72 73 69 6f 6e 20 22 20 22 20 24 73 6f  $version " " $so
13400 75 72 63 65 49 64 20 22 29 5c 6e 22 5d 0d 0a 20  urceId ")\n"].. 
13410 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
13420 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
13430 61 6e 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20  annel no\n..    
13440 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20    }..    }..... 
13450 20 20 20 70 72 6f 63 20 63 68 65 63 6b 46 6f 72     proc checkFor
13460 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
13470 74 61 6e 74 20 7b 20 63 68 61 6e 6e 65 6c 20 6e  tant { channel n
13480 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74  ame } {..      t
13490 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
134a0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
134b0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65         "---- che
134c0 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d  cking for System
134d0 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 64 65 66  .Data.SQLite def
134e0 69 6e 65 20 63 6f 6e 73 74 61 6e 74 20 5c 22 22  ine constant \""
134f0 20 24 6e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20   $name \..      
13500 20 20 20 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d      "\"... "]...
13510 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
13520 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a  h {..        obj
13530 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
13540 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
13550 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
13560 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53  em.Data.SQLite.S
13570 51 4c 69 74 65 33 20 44 65 66 69 6e 65 43 6f 6e  QLite3 DefineCon
13580 73 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20  stants..      } 
13590 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 73 5d  defineConstants]
135a0 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20   == 0} then {.. 
135b0 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61         if {[lsea
135c0 72 63 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61  rch -exact -noca
135d0 73 65 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61  se $defineConsta
135e0 6e 74 73 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31  nts $name] != -1
135f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
13600 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
13610 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68   # NOTE: Yes, th
13620 69 73 20 64 65 66 69 6e 65 20 63 6f 6e 73 74 61  is define consta
13630 6e 74 20 77 61 73 20 65 6e 61 62 6c 65 64 20 77  nt was enabled w
13640 68 65 6e 20 74 68 65 20 6d 61 6e 61 67 65 64 0d  hen the managed.
13650 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13660 20 20 20 61 73 73 65 6d 62 6c 79 20 77 61 73 20     assembly was 
13670 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20 20 20 20 20  compiled...     
13680 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
13690 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20    addConstraint 
136a0 5b 61 70 70 65 6e 64 41 72 67 73 20 5b 67 65 74  [appendArgs [get
136b0 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
136c0 74 61 6e 74 50 72 65 66 69 78 5d 20 24 6e 61 6d  tantPrefix] $nam
136d0 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
136e0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79  tputs $channel y
136f0 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d 20  es\n..        } 
13700 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
13710 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
13720 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20 20 20 7d   no\n..        }
13730 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
13740 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
13750 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f 72 5c 6e  $channel error\n
13760 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d  ..      }..    }
13770 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63 68  .....    proc ch
13780 65 63 6b 46 6f 72 53 51 4c 69 74 65 43 6f 6d 70  eckForSQLiteComp
13790 69 6c 65 4f 70 74 69 6f 6e 20 7b 20 63 68 61 6e  ileOption { chan
137a0 6e 65 6c 20 6e 61 6d 65 20 7d 20 7b 0d 0a 20 20  nel name } {..  
137b0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
137c0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
137d0 0d 0a 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d  ..          "---
137e0 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 53  - checking for S
137f0 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20 61 73  QLite interop as
13800 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 20 6f  sembly compile o
13810 70 74 69 6f 6e 20 5c 22 22 20 5c 0d 0a 20 20 20  ption \"" \..   
13820 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22 5c 22         $name "\"
13830 2e 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20  ... "]....      
13840 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
13850 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
13860 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
13870 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20  ublic \..       
13880 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
13890 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74 65 33 20  .SQLite.SQLite3 
138a0 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c 65 4f 70  InteropCompileOp
138b0 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 7d 20 63  tions..      } c
138c0 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 5d 20 3d  ompileOptions] =
138d0 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
138e0 20 20 20 20 20 69 66 20 7b 5b 6c 73 65 61 72 63       if {[lsearc
138f0 68 20 2d 65 78 61 63 74 20 2d 6e 6f 63 61 73 65  h -exact -nocase
13900 20 24 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73   $compileOptions
13910 20 24 6e 61 6d 65 5d 20 21 3d 20 2d 31 7d 20 74   $name] != -1} t
13920 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
13930 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
13940 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68 69 73 20  NOTE: Yes, this 
13950 63 6f 6d 70 69 6c 65 20 6f 70 74 69 6f 6e 20 77  compile option w
13960 61 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20  as enabled when 
13970 74 68 65 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20  the interop..   
13980 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
13990 73 73 65 6d 62 6c 79 20 77 61 73 20 63 6f 6d 70  ssembly was comp
139a0 69 6c 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  iled...         
139b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 61 64   #..          ad
139c0 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  dConstraint [app
139d0 65 6e 64 41 72 67 73 20 5b 67 65 74 53 51 4c 69  endArgs [getSQLi
139e0 74 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 50  teCompileOptionP
139f0 72 65 66 69 78 5d 20 24 6e 61 6d 65 5d 0d 0a 0d  refix] $name]...
13a00 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
13a10 20 24 63 68 61 6e 6e 65 6c 20 79 65 73 5c 6e 0d   $channel yes\n.
13a20 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
13a30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
13a40 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f 5c 6e  ts $channel no\n
13a50 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
13a60 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
13a70 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13a80 6e 65 6c 20 65 72 72 6f 72 5c 6e 0d 0a 20 20 20  nel error\n..   
13a90 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 74 70     }....      tp
13aa0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
13ab0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
13ac0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
13ad0 6b 69 6e 67 20 66 6f 72 20 53 51 4c 69 74 65 20  king for SQLite 
13ae0 63 6f 72 65 20 6c 69 62 72 61 72 79 20 63 6f 6d  core library com
13af0 70 69 6c 65 20 6f 70 74 69 6f 6e 20 5c 22 22 20  pile option \"" 
13b00 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 24 6e 61  \..          $na
13b10 6d 65 20 22 5c 22 2e 2e 2e 20 22 5d 0d 0a 0d 0a  me "\"... "]....
13b20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
13b30 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f 62 6a 65   {..        obje
13b40 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
13b50 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
13b60 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
13b70 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
13b80 4c 69 74 65 33 20 53 51 4c 69 74 65 43 6f 6d 70  Lite3 SQLiteComp
13b90 69 6c 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20  ileOptions..    
13ba0 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f    } compileOptio
13bb0 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ns] == 0} then {
13bc0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c  ..        if {[l
13bd0 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d 6e  search -exact -n
13be0 6f 63 61 73 65 20 24 63 6f 6d 70 69 6c 65 4f 70  ocase $compileOp
13bf0 74 69 6f 6e 73 20 24 6e 61 6d 65 5d 20 21 3d 20  tions $name] != 
13c00 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  -1} then {..    
13c10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
13c20 20 20 20 23 20 4e 4f 54 45 3a 20 59 65 73 2c 20     # NOTE: Yes, 
13c30 74 68 69 73 20 63 6f 6d 70 69 6c 65 20 6f 70 74  this compile opt
13c40 69 6f 6e 20 77 61 73 20 65 6e 61 62 6c 65 64 20  ion was enabled 
13c50 77 68 65 6e 20 74 68 65 20 53 51 4c 69 74 65 0d  when the SQLite.
13c60 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
13c70 20 20 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20     core library 
13c80 77 61 73 20 63 6f 6d 70 69 6c 65 64 2e 0d 0a 20  was compiled... 
13c90 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
13ca0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
13cb0 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
13cc0 5b 67 65 74 53 51 4c 69 74 65 43 6f 6d 70 69 6c  [getSQLiteCompil
13cd0 65 4f 70 74 69 6f 6e 50 72 65 66 69 78 5d 20 24  eOptionPrefix] $
13ce0 6e 61 6d 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  name]....       
13cf0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
13d00 6c 20 79 65 73 5c 6e 0d 0a 20 20 20 20 20 20 20  l yes\n..       
13d10 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
13d20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
13d30 6e 65 6c 20 6e 6f 5c 6e 0d 0a 20 20 20 20 20 20  nel no\n..      
13d40 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
13d50 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75  e {..        tpu
13d60 74 73 20 24 63 68 61 6e 6e 65 6c 20 65 72 72 6f  ts $channel erro
13d70 72 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  r\n..      }..  
13d80 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
13d90 20 67 65 74 44 61 74 65 54 69 6d 65 46 6f 72 6d   getDateTimeForm
13da0 61 74 20 7b 20 7b 74 69 6d 65 5a 6f 6e 65 20 74  at { {timeZone t
13db0 72 75 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20  rue} } {..      
13dc0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
13dd0 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
13de0 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 73 20 74  simply returns t
13df0 68 65 20 22 64 65 66 61 75 6c 74 22 20 44 61 74  he "default" Dat
13e00 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 75 73 65  eTime format use
13e10 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  d..      #      
13e20 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75 69   by the test sui
13e30 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  te...      #..  
13e40 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
13e50 69 73 74 73 20 3a 3a 64 61 74 65 74 69 6d 65 5f  ists ::datetime_
13e60 66 6f 72 6d 61 74 5d 20 26 26 20 5c 0d 0a 20 20  format] && \..  
13e70 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
13e80 6c 65 6e 67 74 68 20 24 3a 3a 64 61 74 65 74 69  length $::dateti
13e90 6d 65 5f 66 6f 72 6d 61 74 5d 20 3e 20 30 7d 20  me_format] > 0} 
13ea0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
13eb0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
13ec0 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61  E: Return the ma
13ed0 6e 75 61 6c 6c 79 20 6f 76 65 72 72 69 64 64 65  nually overridde
13ee0 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  n value for the 
13ef0 44 61 74 65 54 69 6d 65 20 66 6f 72 6d 61 74 2e  DateTime format.
13f00 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
13f10 20 20 20 20 20 72 65 74 75 72 6e 20 24 3a 3a 64       return $::d
13f20 61 74 65 74 69 6d 65 5f 66 6f 72 6d 61 74 0d 0a  atetime_format..
13f30 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
13f40 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
13f50 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 74 75 72     # NOTE: Retur
13f60 6e 20 61 6e 20 49 53 4f 38 36 30 31 20 44 61 74  n an ISO8601 Dat
13f70 65 54 69 6d 65 20 66 6f 72 6d 61 74 20 63 6f 6d  eTime format com
13f80 70 61 74 69 62 6c 65 20 77 69 74 68 20 53 51 4c  patible with SQL
13f90 69 74 65 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ite,..        # 
13fa0 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74        System.Dat
13fb0 61 2e 53 51 4c 69 74 65 2c 20 61 6e 64 20 73 75  a.SQLite, and su
13fc0 69 74 61 62 6c 65 20 66 6f 72 20 72 6f 75 6e 64  itable for round
13fd0 2d 74 72 69 70 70 69 6e 67 20 77 69 74 68 20 74  -tripping with t
13fe0 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
13ff0 20 20 20 20 44 61 74 65 54 69 6d 65 20 63 6c 61      DateTime cla
14000 73 73 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77  ss of the framew
14010 6f 72 6b 2e 20 20 49 66 20 74 68 69 73 20 76 61  ork.  If this va
14020 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 2c 0d  lue is changed,.
14030 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
14040 20 76 61 72 69 6f 75 73 20 74 65 73 74 73 20 6d   various tests m
14050 61 79 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20  ay fail...      
14060 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65 74    #..        ret
14070 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
14080 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
14090 79 79 79 79 2d 4d 4d 2d 64 64 20 48 48 3a 6d 6d  yyyy-MM-dd HH:mm
140a0 3a 73 73 2e 46 46 46 46 46 46 46 22 20 5b 65 78  :ss.FFFFFFF" [ex
140b0 70 72 20 7b 24 74 69 6d 65 5a 6f 6e 65 20 3f 20  pr {$timeZone ? 
140c0 22 4b 22 20 3a 20 22 22 7d 5d 5d 0d 0a 20 20 20  "K" : ""}]]..   
140d0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
140e0 20 20 20 20 70 72 6f 63 20 67 65 74 44 61 74 65      proc getDate
140f0 54 69 6d 65 54 69 63 6b 73 20 7b 20 76 61 6c 75  TimeTicks { valu
14100 65 20 7b 6c 6f 63 61 6c 20 22 22 7d 20 7b 64 65  e {local ""} {de
14110 66 61 75 6c 74 20 22 22 7d 20 7d 20 7b 0d 0a 20  fault ""} } {.. 
14120 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
14130 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20   length $value] 
14140 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
14150 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 65        return $de
14160 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 7d 0d 0a  fault..      }..
14170 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74  ..      if {[cat
14180 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  ch {..        se
14190 74 20 64 61 74 65 54 69 6d 65 20 5b 6f 62 6a 65  t dateTime [obje
141a0 63 74 20 69 6e 76 6f 6b 65 20 2d 63 72 65 61 74  ct invoke -creat
141b0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
141c0 20 2d 70 61 72 61 6d 65 74 65 72 74 79 70 65 73   -parametertypes
141d0 20 5b 6c 69 73 74 20 53 74 72 69 6e 67 20 53 74   [list String St
141e0 72 69 6e 67 20 49 46 6f 72 6d 61 74 50 72 6f 76  ring IFormatProv
141f0 69 64 65 72 20 5c 0d 0a 20 20 20 20 20 20 20 20  ider \..        
14200 20 20 20 20 53 79 73 74 65 6d 2e 47 6c 6f 62 61      System.Globa
14210 6c 69 7a 61 74 69 6f 6e 2e 44 61 74 65 54 69 6d  lization.DateTim
14220 65 53 74 79 6c 65 73 5d 20 44 61 74 65 54 69 6d  eStyles] DateTim
14230 65 20 50 61 72 73 65 45 78 61 63 74 20 5c 0d 0a  e ParseExact \..
14240 20 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c              $val
14250 75 65 20 5b 67 65 74 44 61 74 65 54 69 6d 65 46  ue [getDateTimeF
14260 6f 72 6d 61 74 5d 20 6e 75 6c 6c 20 41 64 6a 75  ormat] null Adju
14270 73 74 54 6f 55 6e 69 76 65 72 73 61 6c 5d 0d 0a  stToUniversal]..
14280 20 20 20 20 20 20 7d 5d 7d 20 74 68 65 6e 20 7b        }]} then {
14290 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
142a0 20 24 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20   $default..     
142b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
142c0 5b 73 74 72 69 6e 67 20 69 73 20 62 6f 6f 6c 65  [string is boole
142d0 61 6e 20 2d 73 74 72 69 63 74 20 24 6c 6f 63 61  an -strict $loca
142e0 6c 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  l]} then {..    
142f0 20 20 20 20 73 65 74 20 64 61 74 65 54 69 6d 65      set dateTime
14300 20 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20   [object invoke 
14310 2d 63 72 65 61 74 65 20 44 61 74 65 54 69 6d 65  -create DateTime
14320 20 53 70 65 63 69 66 79 4b 69 6e 64 20 5c 0d 0a   SpecifyKind \..
14330 20 20 20 20 20 20 20 20 20 20 20 20 24 64 61 74              $dat
14340 65 54 69 6d 65 20 55 74 63 5d 0d 0a 20 20 20 20  eTime Utc]..    
14350 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
14360 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a 65      return [obje
14370 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65 54  ct invoke $dateT
14380 69 6d 65 20 54 69 63 6b 73 5d 0d 0a 20 20 20 20  ime Ticks]..    
14390 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20    }....      if 
143a0 7b 24 6c 6f 63 61 6c 7d 20 74 68 65 6e 20 7b 0d  {$local} then {.
143b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
143c0 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
143d0 64 61 74 65 54 69 6d 65 20 54 6f 4c 6f 63 61 6c  dateTime ToLocal
143e0 54 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20  Time.Ticks]..   
143f0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
14400 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6f 62 6a       return [obj
14410 65 63 74 20 69 6e 76 6f 6b 65 20 24 64 61 74 65  ect invoke $date
14420 54 69 6d 65 20 54 6f 55 6e 69 76 65 72 73 61 6c  Time ToUniversal
14430 54 69 6d 65 2e 54 69 63 6b 73 5d 0d 0a 20 20 20  Time.Ticks]..   
14440 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
14450 20 20 20 20 70 72 6f 63 20 67 65 74 50 72 6f 70      proc getProp
14460 65 72 74 69 65 73 20 7b 20 6f 62 6a 65 63 74 20  erties { object 
14470 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a 20 20 20  varName } {..   
14480 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
14490 61 6d 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a  ame properties..
144a0 0d 0a 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e  ..      set coun
144b0 74 20 30 0d 0a 20 20 20 20 20 20 73 65 74 20 6e  t 0..      set n
144c0 61 6d 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20  ames [list].... 
144d0 20 20 20 20 20 69 66 20 7b 5b 69 73 4f 62 6a 65       if {[isObje
144e0 63 74 48 61 6e 64 6c 65 20 24 6f 62 6a 65 63 74  ctHandle $object
144f0 5d 20 26 26 20 24 6f 62 6a 65 63 74 20 6e 65 20  ] && $object ne 
14500 22 6e 75 6c 6c 22 7d 20 74 68 65 6e 20 7b 0d 0a  "null"} then {..
14510 20 20 20 20 20 20 20 20 65 76 61 6c 20 6c 61 70          eval lap
14520 70 65 6e 64 20 6e 61 6d 65 73 20 5b 6f 62 6a 65  pend names [obje
14530 63 74 20 6d 65 6d 62 65 72 73 20 5c 0d 0a 20 20  ct members \..  
14540 20 20 20 20 20 20 20 20 20 20 2d 6d 65 6d 62 65            -membe
14550 72 74 79 70 65 73 20 50 72 6f 70 65 72 74 79 20  rtypes Property 
14560 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62 6a 65 63  -nameonly $objec
14570 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76  t]....        ev
14580 61 6c 20 6c 61 70 70 65 6e 64 20 6e 61 6d 65 73  al lappend names
14590 20 5b 6f 62 6a 65 63 74 20 6d 65 6d 62 65 72 73   [object members
145a0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
145b0 2d 6d 65 6d 62 65 72 74 79 70 65 73 20 46 69 65  -membertypes Fie
145c0 6c 64 20 2d 6e 61 6d 65 6f 6e 6c 79 20 24 6f 62  ld -nameonly $ob
145d0 6a 65 63 74 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a  ject]..      }..
145e0 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  ..      foreach 
145f0 6e 61 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20  name $names {.. 
14600 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
14610 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
14620 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 6f 62  bject invoke -ob
14630 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
14640 70 6f 73 65 20 24 6f 62 6a 65 63 74 20 24 6e 61  pose $object $na
14650 6d 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 76 61  me..        } va
14660 6c 75 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  lue] == 0} then 
14670 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
14680 7b 5b 69 73 4f 62 6a 65 63 74 48 61 6e 64 6c 65  {[isObjectHandle
14690 20 24 76 61 6c 75 65 5d 20 26 26 20 24 76 61 6c   $value] && $val
146a0 75 65 20 6e 65 20 22 6e 75 6c 6c 22 7d 20 74 68  ue ne "null"} th
146b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
146c0 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c    set error null
146d0 3b 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20  ; object invoke 
146e0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
146f0 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  c \..           
14700 20 20 20 20 20 2d 6d 61 72 73 68 61 6c 66 6c 61       -marshalfla
14710 67 73 20 2b 4e 6f 48 61 6e 64 6c 65 20 49 6e 74  gs +NoHandle Int
14720 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
14730 76 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ve \..          
14740 20 20 20 20 20 20 41 64 64 4f 62 6a 65 63 74 52        AddObjectR
14750 65 66 65 72 65 6e 63 65 20 4f 6b 20 24 76 61 6c  eference Ok $val
14760 75 65 20 65 72 72 6f 72 0d 0a 0d 0a 20 20 20 20  ue error....    
14770 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
14780 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63  properties(objec
14790 74 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  ts) [list $name 
147a0 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  $value]..       
147b0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
147c0 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
147d0 20 70 72 6f 70 65 72 74 69 65 73 28 76 61 6c 75   properties(valu
147e0 65 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20  es) [list $name 
147f0 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 20 20 20  $value]..       
14800 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14810 20 20 69 6e 63 72 20 63 6f 75 6e 74 0d 0a 20 20    incr count..  
14820 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
14830 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
14840 64 20 70 72 6f 70 65 72 74 69 65 73 28 65 72 72  d properties(err
14850 6f 72 73 29 20 5b 6c 69 73 74 20 24 6e 61 6d 65  ors) [list $name
14860 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65 5d 0d 0a   $::errorCode]..
14870 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14880 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
14890 72 6e 20 24 63 6f 75 6e 74 0d 0a 20 20 20 20 7d  rn $count..    }
148a0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65  .....    proc ge
148b0 74 41 6c 6c 50 72 6f 70 65 72 74 69 65 73 20 7b  tAllProperties {
148c0 20 6f 62 6a 65 63 74 20 76 61 72 4e 61 6d 65 20   object varName 
148d0 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72  } {..      upvar
148e0 20 31 20 24 76 61 72 4e 61 6d 65 20 70 72 6f 70   1 $varName prop
148f0 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 73 65  erties..      se
14900 74 20 76 61 6c 75 65 20 24 6f 62 6a 65 63 74 0d  t value $object.
14910 0a 0d 0a 20 20 20 20 20 20 77 68 69 6c 65 20 7b  ...      while {
14920 74 72 75 65 7d 20 7b 0d 0a 20 20 20 20 20 20 20  true} {..       
14930 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
14940 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65  ts properties(se
14950 65 6e 4f 62 6a 65 63 74 73 29 5d 20 7c 7c 20 5c  enObjects)] || \
14960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 76  ..            $v
14970 61 6c 75 65 20 6e 69 20 24 70 72 6f 70 65 72 74  alue ni $propert
14980 69 65 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29  ies(seenObjects)
14990 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
149a0 20 20 20 20 67 65 74 50 72 6f 70 65 72 74 69 65      getPropertie
149b0 73 20 24 76 61 6c 75 65 20 70 72 6f 70 65 72 74  s $value propert
149c0 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 6c  ies..          l
149d0 61 70 70 65 6e 64 20 70 72 6f 70 65 72 74 69 65  append propertie
149e0 73 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 20 24  s(seenObjects) $
149f0 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20 20 7d  value..        }
14a00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
14a10 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 70 72  ![info exists pr
14a20 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74 73  operties(objects
14a30 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
14a40 20 20 20 20 20 20 62 72 65 61 6b 0d 0a 20 20 20        break..   
14a50 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
14a60 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
14a70 70 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63  properties(objec
14a80 74 73 29 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ts)] == 0} then 
14a90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73  {..          uns
14aa0 65 74 20 70 72 6f 70 65 72 74 69 65 73 28 6f 62  et properties(ob
14ab0 6a 65 63 74 73 29 3b 20 62 72 65 61 6b 0d 0a 20  jects); break.. 
14ac0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
14ad0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 6c      set value [l
14ae0 69 6e 64 65 78 20 5b 6c 69 6e 64 65 78 20 24 70  index [lindex $p
14af0 72 6f 70 65 72 74 69 65 73 28 6f 62 6a 65 63 74  roperties(object
14b00 73 29 20 30 5d 20 65 6e 64 5d 0d 0a 20 20 20 20  s) 0] end]..    
14b10 20 20 20 20 73 65 74 20 70 72 6f 70 65 72 74 69      set properti
14b20 65 73 28 6f 62 6a 65 63 74 73 29 20 5b 6c 72 61  es(objects) [lra
14b30 6e 67 65 20 24 70 72 6f 70 65 72 74 69 65 73 28  nge $properties(
14b40 6f 62 6a 65 63 74 73 29 20 31 20 65 6e 64 5d 0d  objects) 1 end].
14b50 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
14b60 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
14b70 74 73 20 70 72 6f 70 65 72 74 69 65 73 28 73 65  ts properties(se
14b80 65 6e 4f 62 6a 65 63 74 73 29 5d 7d 20 74 68 65  enObjects)]} the
14b90 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72  n {..        for
14ba0 65 61 63 68 20 76 61 6c 75 65 20 24 70 72 6f 70  each value $prop
14bb0 65 72 74 69 65 73 28 73 65 65 6e 4f 62 6a 65 63  erties(seenObjec
14bc0 74 73 29 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  ts) {..         
14bd0 20 69 66 20 7b 24 76 61 6c 75 65 20 65 71 20 24   if {$value eq $
14be0 6f 62 6a 65 63 74 7d 20 63 6f 6e 74 69 6e 75 65  object} continue
14bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
14c00 68 20 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73  h {object dispos
14c10 65 20 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20  e $value}..     
14c20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
14c30 75 6e 73 65 74 20 70 72 6f 70 65 72 74 69 65 73  unset properties
14c40 28 73 65 65 6e 4f 62 6a 65 63 74 73 29 0d 0a 20  (seenObjects).. 
14c50 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
14c60 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74 56 61  ..    proc getVa
14c70 72 69 61 62 6c 65 73 20 7b 20 76 61 72 4e 61 6d  riables { varNam
14c80 65 73 20 7b 6f 62 6a 65 63 74 73 20 66 61 6c 73  es {objects fals
14c90 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73 65  e} } {..      se
14ca0 74 20 72 65 73 75 6c 74 20 5b 6c 69 73 74 5d 0d  t result [list].
14cb0 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68  ...      foreach
14cc0 20 76 61 72 4e 61 6d 65 20 24 76 61 72 4e 61 6d   varName $varNam
14cd0 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66  es {..        if
14ce0 20 7b 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69   {[uplevel 1 [li
14cf0 73 74 20 61 72 72 61 79 20 65 78 69 73 74 73 20  st array exists 
14d00 24 76 61 72 4e 61 6d 65 5d 5d 7d 20 74 68 65 6e  $varName]]} then
14d10 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
14d20 74 20 61 72 72 61 79 4e 61 6d 65 20 24 76 61 72  t arrayName $var
14d30 4e 61 6d 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  Name....        
14d40 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 65 6e    foreach elemen
14d50 74 4e 61 6d 65 20 5b 75 70 6c 65 76 65 6c 20 31  tName [uplevel 1
14d60 20 5b 6c 69 73 74 20 61 72 72 61 79 20 6e 61 6d   [list array nam
14d70 65 73 20 24 61 72 72 61 79 4e 61 6d 65 5d 5d 20  es $arrayName]] 
14d80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
14d90 65 74 20 6e 61 6d 65 20 5b 61 70 70 65 6e 64 41  et name [appendA
14da0 72 67 73 20 24 61 72 72 61 79 4e 61 6d 65 20 28  rgs $arrayName (
14db0 20 24 65 6c 65 6d 65 6e 74 4e 61 6d 65 20 29 5d   $elementName )]
14dc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
14dd0 74 20 76 61 72 56 61 6c 75 65 20 5b 75 70 6c 65  t varValue [uple
14de0 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 65 74 20  vel 1 [list set 
14df0 24 6e 61 6d 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20  $name]]....     
14e00 20 20 20 20 20 20 20 69 66 20 7b 24 6f 62 6a 65         if {$obje
14e10 63 74 73 20 26 26 20 5b 69 73 4f 62 6a 65 63 74  cts && [isObject
14e20 48 61 6e 64 6c 65 20 24 76 61 72 56 61 6c 75 65  Handle $varValue
14e30 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
14e40 20 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d           unset -
14e50 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70 72 6f 70 65  nocomplain prope
14e60 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  rties..         
14e70 20 20 20 20 20 67 65 74 41 6c 6c 50 72 6f 70 65       getAllPrope
14e80 72 74 69 65 73 20 24 76 61 72 56 61 6c 75 65 20  rties $varValue 
14e90 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a 20 20  properties....  
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
14eb0 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
14ec0 20 24 6e 61 6d 65 20 5b 61 72 72 61 79 20 67 65   $name [array ge
14ed0 74 20 70 72 6f 70 65 72 74 69 65 73 5d 5d 0d 0a  t properties]]..
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
14ef0 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
14f00 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75      lappend resu
14f10 6c 74 20 5b 6c 69 73 74 20 24 6e 61 6d 65 20 24  lt [list $name $
14f20 76 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20 20 20  varValue]..     
14f30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
14f40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
14f50 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
14f60 20 20 20 73 65 74 20 76 61 72 56 61 6c 75 65 20     set varValue 
14f70 5b 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74  [uplevel 1 [list
14f80 20 73 65 74 20 24 76 61 72 4e 61 6d 65 5d 5d 0d   set $varName]].
14f90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
14fa0 7b 24 6f 62 6a 65 63 74 73 20 26 26 20 5b 69 73  {$objects && [is
14fb0 4f 62 6a 65 63 74 48 61 6e 64 6c 65 20 24 76 61  ObjectHandle $va
14fc0 72 56 61 6c 75 65 5d 7d 20 74 68 65 6e 20 7b 0d  rValue]} then {.
14fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
14fe0 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 70  et -nocomplain p
14ff0 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
15000 20 20 20 20 20 20 20 67 65 74 41 6c 6c 50 72 6f         getAllPro
15010 70 65 72 74 69 65 73 20 24 76 61 72 56 61 6c 75  perties $varValu
15020 65 20 70 72 6f 70 65 72 74 69 65 73 0d 0a 0d 0a  e properties....
15030 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70              lapp
15040 65 6e 64 20 72 65 73 75 6c 74 20 5b 6c 69 73 74  end result [list
15050 20 24 76 61 72 4e 61 6d 65 20 5b 61 72 72 61 79   $varName [array
15060 20 67 65 74 20 70 72 6f 70 65 72 74 69 65 73 5d   get properties]
15070 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65  ]..          } e
15080 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
15090 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
150a0 74 20 5b 6c 69 73 74 20 24 76 61 72 4e 61 6d 65  t [list $varName
150b0 20 24 76 61 72 56 61 6c 75 65 5d 0d 0a 20 20 20   $varValue]..   
150c0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
150d0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
150e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
150f0 73 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  sult..    }.....
15100 20 20 20 20 70 72 6f 63 20 65 6e 75 6d 65 72 61      proc enumera
15110 62 6c 65 54 6f 4c 69 73 74 20 7b 20 65 6e 75 6d  bleToList { enum
15120 65 72 61 62 6c 65 20 7d 20 7b 0d 0a 20 20 20 20  erable } {..    
15130 20 20 73 65 74 20 72 65 73 75 6c 74 20 5b 6c 69    set result [li
15140 73 74 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20  st]....      if 
15150 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20  {[string length 
15160 24 65 6e 75 6d 65 72 61 62 6c 65 5d 20 3d 3d 20  $enumerable] == 
15170 30 20 7c 7c 20 24 65 6e 75 6d 65 72 61 62 6c 65  0 || $enumerable
15180 20 65 71 20 22 6e 75 6c 6c 22 7d 20 74 68 65 6e   eq "null"} then
15190 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
151a0 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20  rn $result..    
151b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 6f 62 6a    }....      obj
151c0 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
151d0 61 73 20 69 74 65 6d 20 24 65 6e 75 6d 65 72 61  as item $enumera
151e0 62 6c 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  ble {..        i
151f0 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
15200 68 20 24 69 74 65 6d 5d 20 3e 20 30 7d 20 74 68  h $item] > 0} th
15210 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
15220 6c 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 5b  lappend result [
15230 24 69 74 65 6d 20 54 6f 53 74 72 69 6e 67 5d 0d  $item ToString].
15240 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
15250 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
15260 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
15270 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
15280 63 61 74 63 68 41 6e 64 52 65 74 75 72 6e 20 7b  catchAndReturn {
15290 20 73 63 72 69 70 74 20 7b 73 74 61 63 6b 54 72   script {stackTr
152a0 61 63 65 20 66 61 6c 73 65 7d 20 7b 73 74 72 69  ace false} {stri
152b0 63 74 20 74 72 75 65 7d 20 7d 20 7b 0d 0a 20 20  ct true} } {..  
152c0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
152d0 4f 54 45 3a 20 45 76 61 6c 75 61 74 65 20 74 68  OTE: Evaluate th
152e0 65 20 73 63 72 69 70 74 20 70 72 6f 76 69 64 65  e script provide
152f0 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65 72 20  d by our caller 
15300 69 6e 20 74 68 65 69 72 20 63 6f 6e 74 65 78 74  in their context
15310 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
15320 20 63 61 70 74 75 72 69 6e 67 20 62 6f 74 68 20   capturing both 
15330 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 74  the result and t
15340 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0d  he return code..
15350 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15360 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20  set code [catch 
15370 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69  {uplevel 1 $scri
15380 70 74 7d 20 72 65 73 75 6c 74 5d 0d 0a 0d 0a 20  pt} result].... 
15390 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
153a0 4e 4f 54 45 3a 20 44 69 64 20 74 68 65 20 73 63  NOTE: Did the sc
153b0 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62 79  ript provided by
153c0 20 6f 75 72 20 63 61 6c 6c 65 72 20 4e 4f 54 20   our caller NOT 
153d0 72 61 69 73 65 20 61 6e 20 65 72 72 6f 72 3f 0d  raise an error?.
153e0 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
153f0 69 66 20 7b 24 73 74 72 69 63 74 20 26 26 20 24  if {$strict && $
15400 63 6f 64 65 20 3d 3d 20 30 20 7c 7c 20 21 24 73  code == 0 || !$s
15410 74 72 69 63 74 20 26 26 20 24 63 6f 64 65 20 21  trict && $code !
15420 3d 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 1} then {..   
15430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15440 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2e  # NOTE: Success.
15450 20 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20    Return a list 
15460 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
15470 63 6f 64 65 20 61 6e 64 20 74 68 65 20 72 65 73  code and the res
15480 75 6c 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  ult...        #.
15490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
154a0 5b 6c 69 73 74 20 24 63 6f 64 65 20 24 72 65 73  [list $code $res
154b0 75 6c 74 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c  ult]..      } el
154c0 73 65 69 66 20 7b 24 73 74 61 63 6b 54 72 61 63  seif {$stackTrac
154d0 65 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  e} then {..     
154e0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
154f0 4e 4f 54 45 3a 20 46 61 69 6c 75 72 65 2e 20 20  NOTE: Failure.  
15500 4f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74 73  Our caller wants
15510 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
15520 61 63 65 20 28 69 66 20 61 70 70 6c 69 63 61 62  ace (if applicab
15530 6c 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  le),..        # 
15540 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 20 6c        return a l
15550 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
15560 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 74 68 65  urn code and the
15570 20 72 65 73 75 6c 74 20 76 65 72 62 61 74 69 6d   result verbatim
15580 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
15590 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
155a0 73 74 20 24 63 6f 64 65 20 24 72 65 73 75 6c 74  st $code $result
155b0 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
155c0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
155d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61        # NOTE: Fa
155e0 69 6c 75 72 65 2e 20 20 4f 75 72 20 63 61 6c 6c  ilure.  Our call
155f0 65 72 20 64 6f 65 73 20 6e 6f 74 20 77 61 6e 74  er does not want
15600 20 61 20 66 75 6c 6c 20 73 74 61 63 6b 20 74 72   a full stack tr
15610 61 63 65 20 28 69 66 0d 0a 20 20 20 20 20 20 20  ace (if..       
15620 20 23 20 20 20 20 20 20 20 61 70 70 6c 69 63 61   #       applica
15630 62 6c 65 29 2c 20 72 65 74 75 72 6e 20 61 20 6c  ble), return a l
15640 69 73 74 20 77 69 74 68 20 74 68 65 20 72 65 74  ist with the ret
15650 75 72 6e 20 63 6f 64 65 2c 20 74 68 65 20 65 72  urn code, the er
15660 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ror..        #  
15670 20 20 20 20 20 63 6f 64 65 20 66 6f 72 20 74 68       code for th
15680 65 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 61  e interpreter, a
15690 6e 64 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nd the error mes
156a0 73 61 67 65 20 75 70 20 74 6f 20 74 68 65 0d 0a  sage up to the..
156b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
156c0 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
156d0 73 74 61 63 6b 20 74 72 61 63 65 20 73 68 6f 75  stack trace shou
156e0 6c 64 20 73 74 61 72 74 2e 0d 0a 20 20 20 20 20  ld start...     
156f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72 65     #..        re
15700 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 6f 64 65  turn [list $code
15710 20 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 5c 0d   $::errorCode \.
15720 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78  .            [ex
15730 74 72 61 63 74 53 79 73 74 65 6d 44 61 74 61 53  tractSystemDataS
15740 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65  QLiteExceptionMe
15750 73 73 61 67 65 20 24 72 65 73 75 6c 74 5d 5d 0d  ssage $result]].
15760 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
15770 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 73  ....    proc res
15780 65 74 45 78 63 65 70 74 69 6f 6e 20 7b 7d 20 7b  etException {} {
15790 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
157a0 20 23 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 65   # NOTE: Reset e
157b0 78 63 65 70 74 69 6f 6e 20 61 73 73 6f 63 69 61  xception associa
157c0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69 6e  ted with this in
157d0 74 65 72 70 72 65 74 65 72 20 28 74 6f 20 6e 75  terpreter (to nu
157e0 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 23 20 20 20  ll)...      #   
157f0 20 20 20 20 54 68 69 73 20 28 70 72 69 76 61 74      This (privat
15800 65 29 20 70 72 6f 70 65 72 74 79 20 69 73 20 6d  e) property is m
15810 61 69 6e 74 61 69 6e 65 64 20 6f 6e 20 61 20 70  aintained on a p
15820 65 72 2d 74 68 72 65 61 64 20 62 61 73 69 73 2e  er-thread basis.
15830 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
15840 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
15850 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
15860 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65 74   Interpreter.Get
15870 41 63 74 69 76 65 20 45 78 63 65 70 74 69 6f 6e  Active Exception
15880 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 72 65 74   null..      ret
15890 75 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c  urn ""..    }...
158a0 0d 0a 20 20 20 20 70 72 6f 63 20 63 61 74 63 68  ..    proc catch
158b0 41 6e 64 53 65 74 45 78 63 65 70 74 69 6f 6e 20  AndSetException 
158c0 7b 20 73 63 72 69 70 74 20 7b 76 61 72 4e 61 6d  { script {varNam
158d0 65 20 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  e ""} } {..     
158e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
158f0 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 73  : Evaluate the s
15900 63 72 69 70 74 20 70 72 6f 76 69 64 65 64 20 62  cript provided b
15910 79 20 6f 75 72 20 63 61 6c 6c 65 72 20 69 6e 20  y our caller in 
15920 74 68 65 69 72 20 63 6f 6e 74 65 78 74 2e 0d 0a  their context...
15930 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 63        #..      c
15940 61 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20  atch {uplevel 1 
15950 24 73 63 72 69 70 74 7d 0d 0a 0d 0a 20 20 20 20  $script}....    
15960 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
15970 45 3a 20 47 72 61 62 20 74 68 65 20 28 70 72 69  E: Grab the (pri
15980 76 61 74 65 29 20 65 78 63 65 70 74 69 6f 6e 20  vate) exception 
15990 70 72 6f 70 65 72 74 79 20 66 72 6f 6d 20 74 68  property from th
159a0 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2c 0d  is interpreter,.
159b0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 66  .      #       f
159c0 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 2c 20  or this thread, 
159d0 61 6e 64 20 61 64 64 20 61 73 20 61 6e 20 6f 70  and add as an op
159e0 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64  aque object hand
159f0 6c 65 20 69 6e 20 74 68 65 0d 0a 20 20 20 20 20  le in the..     
15a00 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
15a10 20 6f 66 20 6f 75 72 20 63 61 6c 6c 65 72 2e 0d   of our caller..
15a20 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
15a30 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
15a40 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
15a50 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
15a60 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61    upvar 1 $varNa
15a70 6d 65 20 65 78 63 65 70 74 69 6f 6e 0d 0a 20 20  me exception..  
15a80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 73      }....      s
15a90 65 74 20 65 78 63 65 70 74 69 6f 6e 20 5b 6f 62  et exception [ob
15aa0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c 0d 0a 20  ject invoke \.. 
15ab0 20 20 20 20 20 20 20 20 20 2d 61 6c 69 61 73 20           -alias 
15ac0 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
15ad0 63 20 49 6e 74 65 72 70 72 65 74 65 72 2e 47 65  c Interpreter.Ge
15ae0 74 41 63 74 69 76 65 20 45 78 63 65 70 74 69 6f  tActive Exceptio
15af0 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75  n]....      retu
15b00 72 6e 20 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d  rn ""..    }....
15b10 0a 20 20 20 20 70 72 6f 63 20 63 6f 6d 70 69 6c  .    proc compil
15b20 65 43 53 68 61 72 70 57 69 74 68 20 7b 0d 0a 20  eCSharpWith {.. 
15b30 20 20 20 20 20 20 20 20 20 20 20 74 65 78 74 20             text 
15b40 6d 65 6d 6f 72 79 20 73 79 6d 62 6f 6c 73 20 73  memory symbols s
15b50 74 72 69 63 74 20 72 65 73 75 6c 74 73 56 61 72  trict resultsVar
15b60 4e 61 6d 65 20 65 72 72 6f 72 73 56 61 72 4e 61  Name errorsVarNa
15b70 6d 65 20 66 69 6c 65 4e 61 6d 65 73 0d 0a 20 20  me fileNames..  
15b80 20 20 20 20 20 20 20 20 20 20 61 72 67 73 20 7d            args }
15b90 20 7b 0d 0a 20 20 20 20 20 20 74 72 79 20 7b 0d   {..      try {.
15ba0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
15bb0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 69 6e 63      # NOTE: Sinc
15bc0 65 20 77 65 20 61 72 65 20 67 6f 69 6e 67 20 74  e we are going t
15bd0 6f 20 75 73 65 20 74 68 69 73 20 6d 65 74 68 6f  o use this metho
15be0 64 20 6e 61 6d 65 20 61 20 6c 6f 74 2c 20 61 73  d name a lot, as
15bf0 73 69 67 6e 0d 0a 20 20 20 20 20 20 20 20 23 20  sign..        # 
15c00 20 20 20 20 20 20 69 74 20 74 6f 20 61 20 76 61        it to a va
15c10 72 69 61 62 6c 65 20 66 69 72 73 74 2e 0d 0a 20  riable first... 
15c20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
15c30 20 20 73 65 74 20 61 64 64 20 52 65 66 65 72 65    set add Refere
15c40 6e 63 65 64 41 73 73 65 6d 62 6c 69 65 73 2e 41  ncedAssemblies.A
15c50 64 64 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  dd....        #.
15c60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15c70 20 43 72 65 61 74 65 20 74 68 65 20 62 61 73 65   Create the base
15c80 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
15c90 75 61 74 65 20 61 6e 64 20 61 64 64 20 74 68 65  uate and add the
15ca0 20 70 72 6f 70 65 72 74 79 0d 0a 20 20 20 20 20   property..     
15cb0 20 20 20 23 20 20 20 20 20 20 20 73 65 74 74 69     #       setti
15cc0 6e 67 73 20 74 68 61 74 20 61 72 65 20 61 6c 6d  ngs that are alm
15cd0 6f 73 74 20 61 6c 77 61 79 73 20 6e 65 65 64 65  ost always neede
15ce0 64 20 62 79 20 6f 75 72 20 75 6e 69 74 20 74 65  d by our unit te
15cf0 73 74 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  sts..        #  
15d00 20 20 20 20 20 28 69 2e 65 2e 20 74 68 65 20 53       (i.e. the S
15d10 79 73 74 65 6d 20 61 6e 64 20 53 79 73 74 65 6d  ystem and System
15d20 2e 44 61 74 61 20 61 73 73 65 6d 62 6c 79 20 72  .Data assembly r
15d30 65 66 65 72 65 6e 63 65 73 29 2e 0d 0a 20 20 20  eferences)...   
15d40 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
15d50 73 65 74 20 63 6f 6d 6d 61 6e 64 20 5b 6c 69 73  set command [lis
15d60 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
15d70 20 63 6f 6d 70 69 6c 65 43 53 68 61 72 70 20 24   compileCSharp $
15d80 74 65 78 74 20 24 6d 65 6d 6f 72 79 20 24 73 79  text $memory $sy
15d90 6d 62 6f 6c 73 20 24 73 74 72 69 63 74 20 72 65  mbols $strict re
15da0 73 75 6c 74 73 20 5c 0d 0a 20 20 20 20 20 20 20  sults \..       
15db0 20 20 20 20 20 65 72 72 6f 72 73 20 24 61 64 64       errors $add
15dc0 20 53 79 73 74 65 6d 2e 64 6c 6c 20 24 61 64 64   System.dll $add
15dd0 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 64 6c 6c   System.Data.dll
15de0 20 24 61 64 64 20 5c 0d 0a 20 20 20 20 20 20 20   $add \..       
15df0 20 20 20 20 20 53 79 73 74 65 6d 2e 54 72 61 6e       System.Tran
15e00 73 61 63 74 69 6f 6e 73 2e 64 6c 6c 20 24 61 64  sactions.dll $ad
15e10 64 20 53 79 73 74 65 6d 2e 58 6d 6c 2e 64 6c 6c  d System.Xml.dll
15e20 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
15e30 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
15e40 41 64 64 20 61 6c 6c 20 74 68 65 20 70 72 6f 76  Add all the prov
15e50 69 64 65 64 20 66 69 6c 65 20 6e 61 6d 65 73 20  ided file names 
15e60 61 73 20 61 73 73 65 6d 62 6c 79 20 72 65 66 65  as assembly refe
15e70 72 65 6e 63 65 73 2e 0d 0a 20 20 20 20 20 20 20  rences...       
15e80 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
15e90 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 66 69  ach fileName $fi
15ea0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
15eb0 20 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d       lappend com
15ec0 6d 61 6e 64 20 24 61 64 64 20 5b 67 65 74 42 69  mand $add [getBi
15ed0 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69  naryFileName $fi
15ee0 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20  leName]..       
15ef0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
15f00 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
15f10 20 41 64 64 20 65 78 74 72 61 20 61 72 67 75 6d   Add extra argum
15f20 65 6e 74 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f  ents, if any, to
15f30 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   the command to 
15f40 65 76 61 6c 75 61 74 65 2e 0d 0a 20 20 20 20 20  evaluate...     
15f50 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 65 76     #..        ev
15f60 61 6c 20 6c 61 70 70 65 6e 64 20 63 6f 6d 6d 61  al lappend comma
15f70 6e 64 20 24 61 72 67 73 0d 0a 0d 0a 20 20 20 20  nd $args....    
15f80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
15f90 20 4e 4f 54 45 3a 20 41 6c 69 61 73 20 74 68 65   NOTE: Alias the
15fa0 20 63 6f 6d 70 69 6c 65 72 20 6c 6f 63 61 6c 20   compiler local 
15fb0 72 65 73 75 6c 74 73 20 61 6e 64 20 65 72 72 6f  results and erro
15fc0 72 73 20 76 61 72 69 61 62 6c 65 73 20 74 6f 0d  rs variables to.
15fd0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
15fe0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 61   the variable na
15ff0 6d 65 73 20 70 72 6f 76 69 64 65 64 20 62 79 20  mes provided by 
16000 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
16010 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
16020 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
16030 74 68 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61  th $resultsVarNa
16040 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
16050 0a 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72  .          upvar
16060 20 31 20 24 72 65 73 75 6c 74 73 56 61 72 4e 61   1 $resultsVarNa
16070 6d 65 20 72 65 73 75 6c 74 73 0d 0a 20 20 20 20  me results..    
16080 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
16090 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e   if {[string len
160a0 67 74 68 20 24 65 72 72 6f 72 73 56 61 72 4e 61  gth $errorsVarNa
160b0 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  me] > 0} then {.
160c0 0a 20 20 20 20 20 20 20 20 20 20 75 70 76 61 72  .          upvar
160d0 20 31 20 24 65 72 72 6f 72 73 56 61 72 4e 61 6d   1 $errorsVarNam
160e0 65 20 65 72 72 6f 72 73 0d 0a 20 20 20 20 20 20  e errors..      
160f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
16100 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
16110 3a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  : Evaluate the c
16120 6f 6e 73 74 72 75 63 74 65 64 20 5b 63 6f 6d 70  onstructed [comp
16130 69 6c 65 43 53 68 61 72 70 5d 20 63 6f 6d 6d 61  ileCSharp] comma
16140 6e 64 20 61 6e 64 0d 0a 20 20 20 20 20 20 20 20  nd and..        
16150 23 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74  #       return t
16160 68 65 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  he result...    
16170 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 65      #..        e
16180 76 61 6c 20 24 63 6f 6d 6d 61 6e 64 0d 0a 20 20  val $command..  
16190 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
161a0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
161b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
161c0 68 65 20 43 23 20 63 6f 6d 70 69 6c 65 72 20 77  he C# compiler w
161d0 61 73 20 69 6e 76 6f 6b 65 64 20 75 73 69 6e 67  as invoked using
161e0 20 5b 65 78 65 63 5d 2c 20 72 65 73 65 74 20 74   [exec], reset t
161f0 68 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  he..        #   
16200 20 20 20 20 70 72 65 76 69 6f 75 73 20 70 72 6f      previous pro
16210 63 65 73 73 20 69 64 65 6e 74 69 66 69 65 72 20  cess identifier 
16220 6e 6f 77 20 28 69 2e 65 2e 20 74 68 61 74 20 77  now (i.e. that w
16230 61 79 2c 20 69 74 20 64 6f 65 73 0d 0a 20 20 20  ay, it does..   
16240 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 6f 74       #       not
16250 20 73 68 6f 77 20 75 70 20 61 73 20 62 65 69 6e   show up as bein
16260 67 20 22 6c 65 61 6b 65 64 22 29 2e 0d 0a 20 20  g "leaked")...  
16270 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
16280 20 69 66 20 7b 5b 69 73 44 6f 74 4e 65 74 43 6f   if {[isDotNetCo
16290 72 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  re]} then {..   
162a0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 69 6e         catch {in
162b0 66 6f 20 70 72 65 76 69 6f 75 73 70 69 64 20 74  fo previouspid t
162c0 72 75 65 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d  rue}..        }.
162d0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
162e0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73 4d  ....    proc isM
162f0 65 6d 6f 72 79 44 62 20 7b 20 66 69 6c 65 4e 61  emoryDb { fileNa
16300 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d  me } {..      #.
16310 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49  .      # NOTE: I
16320 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
16330 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
16340 6d 65 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 2d  me really an in-
16350 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 3f  memory database?
16360 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16370 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
16380 66 69 6c 65 4e 61 6d 65 20 65 71 20 22 3a 6d 65  fileName eq ":me
16390 6d 6f 72 79 3a 22 20 7c 7c 20 5c 0d 0a 20 20 20  mory:" || \..   
163a0 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 72         [string r
163b0 61 6e 67 65 20 24 66 69 6c 65 4e 61 6d 65 20 30  ange $fileName 0
163c0 20 31 32 5d 20 65 71 20 22 66 69 6c 65 3a 3a 6d   12] eq "file::m
163d0 65 6d 6f 72 79 3a 22 7d 5d 0d 0a 20 20 20 20 7d  emory:"}]..    }
163e0 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 69 73  .....    proc is
163f0 54 61 62 6c 65 49 6e 44 62 20 7b 20 6e 61 6d 65  TableInDb { name
16400 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7d 20   {varName db} } 
16410 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
16420 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
16430 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
16440 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
16450 22 64 62 22 29 20 69 6e 20 74 68 65 20 63 6f 6e  "db") in the con
16460 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20  text of our..   
16470 20 20 20 23 20 20 20 20 20 20 20 63 61 6c 6c 65     #       calle
16480 72 2e 20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  r.  It contains 
16490 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
164a0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74  nection handle t
164b0 68 61 74 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20  hat will be..   
164c0 20 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20     #       used 
164d0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 71  to execute the q
164e0 75 65 72 79 20 75 73 65 64 20 74 6f 20 64 65 74  uery used to det
164f0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 61  ermine if the na
16500 6d 65 64 20 74 61 62 6c 65 20 69 73 0d 0a 20 20  med table is..  
16510 20 20 20 20 23 20 20 20 20 20 20 20 70 72 65 73      #       pres
16520 65 6e 74 20 69 6e 20 74 68 61 74 20 64 61 74 61  ent in that data
16530 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  base...      #..
16540 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
16550 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
16560 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
16570 54 45 3a 20 55 73 65 20 74 68 65 20 73 71 6c 69  TE: Use the sqli
16580 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
16590 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
165a0 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 20  the named table 
165b0 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  is..      #     
165c0 20 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65    present in the
165d0 20 64 61 74 61 62 61 73 65 2e 0d 0a 20 20 20 20   database...    
165e0 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73    #..      set s
165f0 71 6c 20 7b 0d 0a 20 20 20 20 20 20 20 20 53 45  ql {..        SE
16600 4c 45 43 54 20 43 4f 55 4e 54 28 2a 29 20 46 52  LECT COUNT(*) FR
16610 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
16620 20 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74   WHERE type = 't
16630 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 20 3d  able' AND name =
16640 20 3f 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   ?;..      }....
16650 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
16660 20 4e 4f 54 45 3a 20 52 65 74 75 72 6e 20 6e 6f   NOTE: Return no
16670 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6e 61  n-zero if the na
16680 6d 65 64 20 74 61 62 6c 65 20 69 73 20 70 72 65  med table is pre
16690 73 65 6e 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  sent...      #..
166a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78        return [ex
166b0 70 72 20 7b 0d 0a 20 20 20 20 20 20 20 20 5b 73  pr {..        [s
166c0 71 6c 20 65 78 65 63 75 74 65 20 2d 65 78 65 63  ql execute -exec
166d0 75 74 65 20 73 63 61 6c 61 72 20 24 64 62 20 24  ute scalar $db $
166e0 73 71 6c 20 5b 6c 69 73 74 20 70 61 72 61 6d 31  sql [list param1
166f0 20 53 74 72 69 6e 67 20 24 6e 61 6d 65 5d 5d 20   String $name]] 
16700 3e 20 30 0d 0a 20 20 20 20 20 20 7d 5d 0d 0a 20  > 0..      }].. 
16710 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
16720 63 20 67 65 74 44 62 44 65 66 61 75 6c 74 50 61  c getDbDefaultPa
16730 67 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20 20  geSize {} {..   
16740 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 65     if {[catch {e
16750 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47 4d  xecuteSql "PRAGM
16760 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 20 73 63  A page_size;" sc
16770 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20 3d 3d  alar} result] ==
16780 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
16790 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73 75      return $resu
167a0 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  lt..      } else
167b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75   {..        retu
167c0 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 20  rn 0..      }.. 
167d0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
167e0 63 20 67 65 74 44 62 44 65 66 61 75 6c 74 43 61  c getDbDefaultCa
167f0 63 68 65 53 69 7a 65 20 7b 7d 20 7b 0d 0a 20 20  cheSize {} {..  
16800 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
16810 65 78 65 63 75 74 65 53 71 6c 20 22 50 52 41 47  executeSql "PRAG
16820 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 20  MA cache_size;" 
16830 73 63 61 6c 61 72 7d 20 72 65 73 75 6c 74 5d 20  scalar} result] 
16840 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
16850 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
16860 73 75 6c 74 0d 0a 20 20 20 20 20 20 7d 20 65 6c  sult..      } el
16870 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  se {..        re
16880 74 75 72 6e 20 30 0d 0a 20 20 20 20 20 20 7d 0d  turn 0..      }.
16890 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
168a0 72 6f 63 20 75 73 65 4c 65 67 61 63 79 44 62 50  roc useLegacyDbP
168b0 61 67 65 41 6e 64 43 61 63 68 65 53 69 7a 65 73  ageAndCacheSizes
168c0 20 7b 20 76 61 72 4e 61 6d 65 20 7d 20 7b 0d 0a   { varName } {..
168d0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
168e0 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
168f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
16900 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
16910 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
16920 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
16930 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
16940 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   It contains the
16950 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
16960 74 69 6f 6e 20 68 61 6e 64 6c 65 20 74 68 61 74  tion handle that
16970 20 77 69 6c 6c 20 62 65 0d 0a 20 20 20 20 20 20   will be..      
16980 23 20 20 20 20 20 20 20 75 73 65 64 20 74 6f 20  #       used to 
16990 65 78 65 63 75 74 65 20 71 75 65 72 69 65 73 20  execute queries 
169a0 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
169b0 70 61 67 65 20 61 6e 64 20 63 61 63 68 65 20 73  page and cache s
169c0 69 7a 65 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  izes...      #..
169d0 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76        upvar 1 $v
169e0 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20  arName db....   
169f0 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
16a00 64 62 20 7b 0d 0a 20 20 20 20 20 20 20 20 50 52  db {..        PR
16a10 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
16a20 20 31 30 32 34 3b 0d 0a 20 20 20 20 20 20 20 20   1024;..        
16a30 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
16a40 65 20 3d 20 32 30 30 30 3b 0d 0a 20 20 20 20 20  e = 2000;..     
16a50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75   }....      retu
16a60 72 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20  rn [list \..    
16a70 20 20 20 20 20 20 5b 73 71 6c 20 65 78 65 63 75        [sql execu
16a80 74 65 20 2d 65 78 65 63 75 74 65 20 73 63 61 6c  te -execute scal
16a90 61 72 20 24 64 62 20 22 50 52 41 47 4d 41 20 70  ar $db "PRAGMA p
16aa0 61 67 65 5f 73 69 7a 65 3b 22 5d 20 5c 0d 0a 20  age_size;"] \.. 
16ab0 20 20 20 20 20 20 20 20 20 5b 73 71 6c 20 65 78           [sql ex
16ac0 65 63 75 74 65 20 2d 65 78 65 63 75 74 65 20 73  ecute -execute s
16ad0 63 61 6c 61 72 20 24 64 62 20 22 50 52 41 47 4d  calar $db "PRAGM
16ae0 41 20 63 61 63 68 65 5f 73 69 7a 65 3b 22 5d 5d  A cache_size;"]]
16af0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16b00 70 72 6f 63 20 6e 6f 72 6d 61 6c 69 7a 65 45 78  proc normalizeEx
16b10 63 65 70 74 69 6f 6e 4d 65 73 73 61 67 65 20 7b  ceptionMessage {
16b20 20 76 61 6c 75 65 20 7d 20 7b 0d 0a 20 20 20 20   value } {..    
16b30 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
16b40 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d 20  ngth $value] == 
16b50 30 7d 20 74 68 65 6e 20 7b 72 65 74 75 72 6e 20  0} then {return 
16b60 24 76 61 6c 75 65 7d 0d 0a 20 20 20 20 20 20 72  $value}..      r
16b70 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61  eturn [string ma
16b80 70 20 5b 6c 69 73 74 20 5c 72 5c 6e 20 22 20 3d  p [list \r\n " =
16b90 3d 3e 20 22 20 5c 6e 20 22 20 3d 3d 3e 20 22 5d  => " \n " ==> "]
16ba0 20 24 76 61 6c 75 65 5d 0d 0a 20 20 20 20 7d 0d   $value]..    }.
16bb0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 78 74  ....    proc ext
16bc0 72 61 63 74 53 79 73 74 65 6d 44 61 74 61 53 51  ractSystemDataSQ
16bd0 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 4d 65 73  LiteExceptionMes
16be0 73 61 67 65 20 7b 20 76 61 6c 75 65 20 7d 20 7b  sage { value } {
16bf0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
16c00 20 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20   # NOTE: If the 
16c10 73 74 72 69 6e 67 20 63 6f 6e 66 6f 72 6d 73 20  string conforms 
16c20 74 6f 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65  to format of the
16c30 20 6e 6f 72 6d 61 6c 20 65 78 63 65 70 74 69 6f   normal exceptio
16c40 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
16c50 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2c 20   error strings, 
16c60 65 78 74 72 61 63 74 20 61 6e 64 20 72 65 74 75  extract and retu
16c70 72 6e 20 6f 6e 6c 79 20 74 68 65 20 65 72 72 6f  rn only the erro
16c80 72 20 6d 65 73 73 61 67 65 0d 0a 20 20 20 20 20  r message..     
16c90 20 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e   #       portion
16ca0 20 69 74 73 65 6c 66 2e 0d 0a 20 20 20 20 20 20   itself...      
16cb0 23 0d 0a 20 20 20 20 20 20 73 65 74 20 70 61 74  #..      set pat
16cc0 74 65 72 6e 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  terns [list \.. 
16cd0 20 20 20 20 20 7b 53 79 73 74 65 6d 5c 2e 44 61       {System\.Da
16ce0 74 61 5c 2e 53 51 4c 69 74 65 5c 2e 53 51 4c 69  ta\.SQLite\.SQLi
16cf0 74 65 45 78 63 65 70 74 69 6f 6e 20 5c 28 30 78  teException \(0x
16d00 28 3f 3a 30 7c 38 29 5b 30 2d 39 41 2d 46 61 2d  (?:0|8)[0-9A-Fa-
16d10 66 5d 7b 37 7d 5c 29 3a 5c 0d 0a 20 20 20 20 20  f]{7}\):\..     
16d20 20 20 20 20 20 28 2e 2b 3f 29 20 20 28 3f 3a 20       (.+?)  (?: 
16d30 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20 20 7b  )?at} \..      {
16d40 53 79 73 74 65 6d 5c 2e 44 61 74 61 5c 2e 53 51  System\.Data\.SQ
16d50 4c 69 74 65 5c 2e 53 51 4c 69 74 65 45 78 63 65  Lite\.SQLiteExce
16d60 70 74 69 6f 6e 3a 20 28 2e 2b 3f 29 20 20 28 3f  ption: (.+?)  (?
16d70 3a 20 29 3f 61 74 7d 20 5c 0d 0a 20 20 20 20 20  : )?at} \..     
16d80 20 7b 45 61 67 6c 65 5c 2e 5f 43 6f 6d 70 6f 6e   {Eagle\._Compon
16d90 65 6e 74 73 5c 2e 50 75 62 6c 69 63 5c 2e 53 63  ents\.Public\.Sc
16da0 72 69 70 74 45 78 63 65 70 74 69 6f 6e 3a 20 28  riptException: (
16db0 2e 2b 3f 29 20 20 28 3f 3a 20 29 3f 61 74 7d 5d  .+?)  (?: )?at}]
16dc0 0d 0a 0d 0a 20 20 20 20 20 20 66 6f 72 65 61 63  ....      foreac
16dd0 68 20 70 61 74 74 65 72 6e 20 24 70 61 74 74 65  h pattern $patte
16de0 72 6e 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  rns {..        i
16df0 66 20 7b 5b 72 65 67 65 78 70 20 2d 2d 20 24 70  f {[regexp -- $p
16e00 61 74 74 65 72 6e 20 24 76 61 6c 75 65 20 64 75  attern $value du
16e10 6d 6d 79 20 6d 65 73 73 61 67 65 5d 7d 20 74 68  mmy message]} th
16e20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
16e30 73 65 74 20 6d 65 73 73 61 67 65 20 5b 73 74 72  set message [str
16e40 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 5c 72  ing map [list \r
16e50 5c 6e 20 5c 6e 5d 20 5b 73 74 72 69 6e 67 20 74  \n \n] [string t
16e60 72 69 6d 20 24 6d 65 73 73 61 67 65 5d 5d 0d 0a  rim $message]]..
16e70 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6c 69            set li
16e80 6e 65 73 20 5b 73 70 6c 69 74 20 24 6d 65 73 73  nes [split $mess
16e90 61 67 65 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  age \n]....     
16ea0 20 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74       if {[llengt
16eb0 68 20 24 6c 69 6e 65 73 5d 20 3d 3d 20 32 7d 20  h $lines] == 2} 
16ec0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16ed0 20 20 20 20 69 66 20 7b 5b 6c 69 6e 64 65 78 20      if {[lindex 
16ee0 24 6c 69 6e 65 73 20 30 5d 20 65 71 20 5b 6c 69  $lines 0] eq [li
16ef0 6e 64 65 78 20 24 6c 69 6e 65 73 20 31 5d 7d 20  ndex $lines 1]} 
16f00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
16f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
16f20 6e 64 65 78 20 24 6c 69 6e 65 73 20 30 5d 0d 0a  ndex $lines 0]..
16f30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
16f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
16f50 75 72 6e 20 5b 61 70 70 65 6e 64 41 72 67 73 20  urn [appendArgs 
16f60 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 30  [lindex $lines 0
16f70 5d 20 22 20 2d 2d 20 22 20 5b 6c 69 6e 64 65 78  ] " -- " [lindex
16f80 20 24 6c 69 6e 65 73 20 31 5d 5d 0d 0a 20 20 20   $lines 1]]..   
16f90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
16fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 6d 65        return $me
16fb0 73 73 61 67 65 0d 0a 20 20 20 20 20 20 20 20 7d  ssage..        }
16fc0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
16fd0 20 20 20 72 65 74 75 72 6e 20 24 76 61 6c 75 65     return $value
16fe0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
16ff0 70 72 6f 63 20 74 72 69 6d 53 71 6c 20 7b 20 73  proc trimSql { s
17000 71 6c 20 7d 20 7b 0d 0a 20 20 20 20 20 20 72 65  ql } {..      re
17010 74 75 72 6e 20 5b 72 65 67 73 75 62 20 2d 61 6c  turn [regsub -al
17020 6c 20 2d 2d 20 7b 5c 73 2b 7d 20 5b 73 74 72 69  l -- {\s+} [stri
17030 6e 67 20 74 72 69 6d 20 24 73 71 6c 5d 20 22 20  ng trim $sql] " 
17040 22 5d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  "]..    }.....  
17050 20 20 70 72 6f 63 20 65 78 65 63 75 74 65 53 71    proc executeSq
17060 6c 20 7b 20 73 71 6c 20 7b 65 78 65 63 75 74 65  l { sql {execute
17070 20 6e 6f 6e 65 7d 20 7b 66 6f 72 6d 61 74 20 6e   none} {format n
17080 6f 6e 65 7d 20 7b 66 69 6c 65 4e 61 6d 65 20 22  one} {fileName "
17090 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  "} } {..      if
170a0 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
170b0 20 24 66 69 6c 65 4e 61 6d 65 5d 20 3d 3d 20 30   $fileName] == 0
170c0 7d 20 74 68 65 6e 20 7b 73 65 74 20 66 69 6c 65  } then {set file
170d0 4e 61 6d 65 20 3a 6d 65 6d 6f 72 79 3a 7d 0d 0a  Name :memory:}..
170e0 20 20 20 20 20 20 73 65 74 75 70 44 62 20 24 66        setupDb $f
170f0 69 6c 65 4e 61 6d 65 20 22 22 20 22 22 20 22 22  ileName "" "" ""
17100 20 22 22 20 22 22 20 66 61 6c 73 65 20 66 61 6c   "" "" false fal
17110 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65 20 64  se false false d
17120 62 20 74 72 75 65 0d 0a 0d 0a 20 20 20 20 20 20  b true....      
17130 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 72  try {..        r
17140 65 74 75 72 6e 20 5b 75 70 6c 65 76 65 6c 20 31  eturn [uplevel 1
17150 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20   [list \..      
17160 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
17170 65 20 2d 65 78 65 63 75 74 65 20 24 65 78 65 63  e -execute $exec
17180 75 74 65 20 2d 66 6f 72 6d 61 74 20 24 66 6f 72  ute -format $for
17190 6d 61 74 20 24 64 62 20 24 73 71 6c 5d 5d 0d 0a  mat $db $sql]]..
171a0 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
171b0 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  {..        set c
171c0 6f 6e 6e 65 63 74 69 6f 6e 20 5b 67 65 74 44 62  onnection [getDb
171d0 43 6f 6e 6e 65 63 74 69 6f 6e 5d 0d 0a 0d 0a 20  Connection].... 
171e0 20 20 20 20 20 20 20 74 72 79 20 7b 0d 0a 20 20         try {..  
171f0 20 20 20 20 20 20 20 20 63 6c 65 61 6e 75 70 44          cleanupD
17200 62 20 24 66 69 6c 65 4e 61 6d 65 20 64 62 20 66  b $fileName db f
17210 61 6c 73 65 20 66 61 6c 73 65 20 66 61 6c 73 65  alse false false
17220 0d 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61  ..        } fina
17230 6c 6c 79 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lly {..         
17240 20 6f 62 6a 65 63 74 20 66 6c 61 67 73 20 24 63   object flags $c
17250 6f 6e 6e 65 63 74 69 6f 6e 20 2d 4e 6f 44 69 73  onnection -NoDis
17260 70 6f 73 65 3b 20 66 72 65 65 44 62 43 6f 6e 6e  pose; freeDbConn
17270 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ection..        
17280 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
17290 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 68  }.....    proc h
172a0 61 73 4e 6f 46 6c 61 67 73 20 7b 20 76 61 72 4e  asNoFlags { varN
172b0 61 6d 65 20 6e 6f 6e 65 20 7d 20 7b 0d 0a 20 20  ame none } {..  
172c0 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72      upvar 1 $var
172d0 4e 61 6d 65 20 66 6c 61 67 73 0d 0a 0d 0a 20 20  Name flags....  
172e0 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65      if {![info e
172f0 78 69 73 74 73 20 66 6c 61 67 73 5d 7d 20 74 68  xists flags]} th
17300 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65  en {..        re
17310 74 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20  turn true..     
17320 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
17330 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
17340 66 6c 61 67 73 5d 20 3d 3d 20 30 7d 20 74 68 65  flags] == 0} the
17350 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 72 65 74  n {..        ret
17360 75 72 6e 20 74 72 75 65 0d 0a 20 20 20 20 20 20  urn true..      
17370 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 24  }....      if {$
17380 6e 6f 6e 65 20 26 26 20 24 66 6c 61 67 73 20 65  none && $flags e
17390 71 20 22 4e 6f 6e 65 22 7d 20 74 68 65 6e 20 7b  q "None"} then {
173a0 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
173b0 20 74 72 75 65 0d 0a 20 20 20 20 20 20 7d 0d 0a   true..      }..
173c0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66  ..      return f
173d0 61 6c 73 65 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  alse..    }.....
173e0 20 20 20 20 70 72 6f 63 20 67 65 74 43 6f 6e 6e      proc getConn
173f0 65 63 74 69 6f 6e 46 6c 61 67 73 20 7b 20 66 69  ectionFlags { fi
17400 6c 65 4e 61 6d 65 20 66 6c 61 67 73 20 7b 71 75  leName flags {qu
17410 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
17420 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
17430 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
17440 74 20 77 68 69 63 68 20 64 61 74 61 62 61 73 65  t which database
17450 20 66 69 6c 65 20 6e 61 6d 65 20 6f 72 20 63 6f   file name or co
17460 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 20  nnection string 
17470 74 68 65 73 65 0d 0a 20 20 20 20 20 20 23 20 20  these..      #  
17480 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
17490 66 6c 61 67 73 20 77 69 6c 6c 20 61 63 74 75 61  flags will actua
174a0 6c 6c 79 20 61 70 70 6c 79 20 74 6f 2e 20 20 54  lly apply to.  T
174b0 68 69 73 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  his is not neces
174c0 73 61 72 79 0d 0a 20 20 20 20 20 20 23 20 20 20  sary..      #   
174d0 20 20 20 20 69 6e 20 71 75 69 65 74 20 6d 6f 64      in quiet mod
174e0 65 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69  e because this i
174f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  nformation is on
17500 6c 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 67 67  ly used for logg
17510 69 6e 67 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ing..      #    
17520 20 20 20 61 6e 64 20 72 65 70 6f 72 74 69 6e 67     and reporting
17530 20 70 75 72 70 6f 73 65 73 2e 0d 0a 20 20 20 20   purposes...    
17540 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21    #..      if {!
17550 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
17560 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
17570 69 6e 67 20 6c 65 6e 67 74 68 20 24 66 69 6c 65  ing length $file
17580 4e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  Name] > 0} then 
17590 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  {..          set
175a0 20 64 61 74 61 62 61 73 65 20 5b 61 70 70 65 6e   database [appen
175b0 64 41 72 67 73 20 22 66 69 6c 65 20 6e 61 6d 65  dArgs "file name
175c0 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20 5c   \"" $fileName \
175d0 22 5d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  "]..        } el
175e0 73 65 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73  seif {[info exis
175f0 74 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d  ts ::dataSource]
17600 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
17610 20 20 20 21 5b 61 72 72 61 79 20 65 78 69 73 74     ![array exist
17620 73 20 3a 3a 64 61 74 61 53 6f 75 72 63 65 5d 7d  s ::dataSource]}
17630 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17640 20 20 20 73 65 74 20 64 61 74 61 62 61 73 65 20     set database 
17650 5b 61 70 70 65 6e 64 41 72 67 73 20 22 64 61 74  [appendArgs "dat
17660 61 20 73 6f 75 72 63 65 20 5c 22 22 20 24 3a 3a  a source \"" $::
17670 64 61 74 61 53 6f 75 72 63 65 20 5c 22 5d 0d 0a  dataSource \"]..
17680 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
17690 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
176a0 64 61 74 61 62 61 73 65 20 3c 75 6e 6b 6e 6f 77  database <unknow
176b0 6e 3e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  n>..        }.. 
176c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
176d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
176e0 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   Even though the
176f0 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 73  re is only one s
17700 6f 75 72 63 65 20 6f 66 20 66 6c 61 67 73 20 73  ource of flags s
17710 6f 20 66 61 72 2c 20 74 68 65 79 0d 0a 20 20 20  o far, they..   
17720 20 20 20 23 20 20 20 20 20 20 20 6d 75 73 74 20     #       must 
17730 62 65 20 63 6f 6d 62 69 6e 65 64 20 75 73 69 6e  be combined usin
17740 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 79  g the correct sy
17750 6e 74 61 78 20 66 6f 72 20 65 6e 75 6d 65 72 61  ntax for enumera
17760 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
17770 20 20 20 66 6c 61 67 20 76 61 6c 75 65 73 20 66     flag values f
17780 6f 72 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d  or the .NET Fram
17790 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 23 0d  ework...      #.
177a0 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61 67 73  .      set flags
177b0 20 5b 63 6f 6d 62 69 6e 65 46 6c 61 67 73 20 24   [combineFlags $
177c0 66 6c 61 67 73 20 22 22 5d 0d 0a 0d 0a 20 20 20  flags ""]....   
177d0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
177e0 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
177f0 67 29 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  g) the local con
17800 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e  nection flags an
17810 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
17820 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
17830 64 61 74 61 20 73 6f 75 72 63 65 20 6f 72 20 66  data source or f
17840 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20  ile name...     
17850 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24   #..      if {!$
17860 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
17870 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
17880 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d  o exists ::no(em
17890 69 74 4c 6f 63 61 6c 46 6c 61 67 73 29 5d 20 26  itLocalFlags)] &
178a0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
178b0 20 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   (![info exists 
178c0 3a 3a 6e 6f 28 65 6d 69 74 4c 6f 63 61 6c 46 6c  ::no(emitLocalFl
178d0 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c  agsIfNone)] || \
178e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 21  ..             !
178f0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
17900 73 20 66 61 6c 73 65 5d 29 7d 20 74 68 65 6e 20  s false])} then 
17910 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
17920 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e  ts $::test_chann
17930 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
17940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17950 22 2d 2d 2d 2d 20 6c 6f 63 61 6c 20 63 6f 6e 6e  "---- local conn
17960 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72  ection flags for
17970 20 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a   " $database \..
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
17990 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b  are: " [expr {![
179a0 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67 73  hasNoFlags flags
179b0 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20 20   false] ? \..   
179c0 20 20 20 20 20 20 20 20 20 20 20 5b 61 70 70 65             [appe
179d0 6e 64 41 72 67 73 20 5c 22 20 24 66 6c 61 67 73  ndArgs \" $flags
179e0 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65 3e 22 7d   \"] : "<none>"}
179f0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d  ] \n]..        }
17a00 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
17a10 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
17a20 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c 6f  TE: Show (and lo
17a30 67 29 20 74 68 65 20 73 68 61 72 65 64 20 63 6f  g) the shared co
17a40 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0d  nnection flags..
17a50 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
17a60 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
17a70 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
17a80 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
17a90 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
17aa0 6b 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ke System.Data.S
17ab0 51 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e  QLite.SQLiteConn
17ac0 65 63 74 69 6f 6e 20 53 68 61 72 65 64 46 6c 61  ection SharedFla
17ad0 67 73 0d 0a 20 20 20 20 20 20 20 20 7d 20 73 68  gs..        } sh
17ae0 61 72 65 64 46 6c 61 67 73 5d 20 3d 3d 20 30 7d  aredFlags] == 0}
17af0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
17b00 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17b10 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53 68  ists ::no(emitSh
17b20 61 72 65 64 46 6c 61 67 73 29 5d 20 26 26 20 5c  aredFlags)] && \
17b30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17b40 28 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  (![info exists :
17b50 3a 6e 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c  :no(emitSharedFl
17b60 61 67 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c  agsIfNone)] || \
17b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17b80 20 21 5b 68 61 73 4e 6f 46 6c 61 67 73 20 73 68   ![hasNoFlags sh
17b90 61 72 65 64 46 6c 61 67 73 20 74 72 75 65 5d 29  aredFlags true])
17ba0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
17bb0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
17bc0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
17bd0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
17be0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17bf0 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
17c00 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20 22 20 24  on flags for " $
17c10 64 61 74 61 62 61 73 65 20 5c 0d 0a 20 20 20 20  database \..    
17c20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 61 72              " ar
17c30 65 3a 20 22 20 5b 65 78 70 72 20 7b 21 5b 68 61  e: " [expr {![ha
17c40 73 4e 6f 46 6c 61 67 73 20 73 68 61 72 65 64 46  sNoFlags sharedF
17c50 6c 61 67 73 20 74 72 75 65 5d 20 3f 20 5c 0d 0a  lags true] ? \..
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
17c80 73 68 61 72 65 64 46 6c 61 67 73 20 5c 22 5d 20  sharedFlags \"] 
17c90 3a 20 22 3c 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d  : "<none>"}] \n]
17ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
17cb0 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
17cc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21  .          if {!
17cd0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17ce0 6f 28 65 6d 69 74 53 68 61 72 65 64 46 6c 61 67  o(emitSharedFlag
17cf0 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  s)] && \..      
17d00 20 20 20 20 20 20 20 20 21 5b 69 6e 66 6f 20 65          ![info e
17d10 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 53  xists ::no(emitS
17d20 68 61 72 65 64 46 6c 61 67 73 49 66 55 6e 61 76  haredFlagsIfUnav
17d30 61 69 6c 61 62 6c 65 29 5d 7d 20 74 68 65 6e 20  ailable)]} then 
17d40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
17d50 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
17d60 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
17d70 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17d80 20 20 20 20 22 2d 2d 2d 2d 20 73 68 61 72 65 64      "---- shared
17d90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67   connection flag
17da0 73 20 66 6f 72 20 22 20 24 64 61 74 61 62 61 73  s for " $databas
17db0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
17dc0 20 20 20 20 20 22 20 61 72 65 3a 20 3c 75 6e 61       " are: <una
17dd0 76 61 69 6c 61 62 6c 65 3e 5c 6e 22 5d 0d 0a 20  vailable>\n"].. 
17de0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
17df0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
17e00 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
17e10 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61   # NOTE: Show (a
17e20 6e 64 20 6c 6f 67 29 20 74 68 65 20 64 65 74 65  nd log) the dete
17e30 63 74 65 64 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e  cted global conn
17e40 65 63 74 69 6f 6e 20 66 6c 61 67 73 2c 20 69 66  ection flags, if
17e50 20 61 6e 79 2e 0d 0a 20 20 20 20 20 20 23 0d 0a   any...      #..
17e60 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
17e70 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
17e80 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
17e90 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 47 6c  ists ::no(emitGl
17ea0 6f 62 61 6c 46 6c 61 67 73 29 5d 20 26 26 20 5c  obalFlags)] && \
17eb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 21  ..            (!
17ec0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
17ed0 6f 28 65 6d 69 74 47 6c 6f 62 61 6c 46 6c 61 67  o(emitGlobalFlag
17ee0 73 49 66 4e 6f 6e 65 29 5d 20 7c 7c 20 5c 0d 0a  sIfNone)] || \..
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 5b 68               ![h
17f00 61 73 4e 6f 46 6c 61 67 73 20 3a 3a 63 6f 6e 6e  asNoFlags ::conn
17f10 65 63 74 69 6f 6e 5f 66 6c 61 67 73 20 66 61 6c  ection_flags fal
17f20 73 65 5d 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  se])} then {..  
17f30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
17f40 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
17f50 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
17f60 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
17f70 20 67 6c 6f 62 61 6c 20 63 6f 6e 6e 65 63 74 69   global connecti
17f80 6f 6e 20 66 6c 61 67 73 20 61 72 65 3a 20 22 20  on flags are: " 
17f90 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
17fa0 20 5b 65 78 70 72 20 7b 21 5b 68 61 73 4e 6f 46   [expr {![hasNoF
17fb0 6c 61 67 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  lags ::connectio
17fc0 6e 5f 66 6c 61 67 73 20 66 61 6c 73 65 5d 20 3f  n_flags false] ?
17fd0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
17fe0 20 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22    [appendArgs \"
17ff0 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 5f 66   $::connection_f
18000 6c 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e  lags \"] : "<non
18010 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20  e>"}] \n]..     
18020 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d     }..      }...
18030 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
18040 23 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 72 65  # NOTE: If there
18050 20 61 72 65 20 61 6e 79 20 67 6c 6f 62 61 6c 20   are any global 
18060 28 70 65 72 20 74 65 73 74 20 72 75 6e 29 20 63  (per test run) c
18070 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 20  onnection flags 
18080 63 75 72 72 65 6e 74 6c 79 0d 0a 20 20 20 20 20  currently..     
18090 20 23 20 20 20 20 20 20 20 73 65 74 2c 20 75 73   #       set, us
180a0 65 20 74 68 65 6d 20 6e 6f 77 20 28 69 2e 65 2e  e them now (i.e.
180b0 20 62 79 20 63 6f 6d 62 69 6e 69 6e 67 20 74 68   by combining th
180c0 65 6d 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  em with the ones
180d0 20 66 6f 72 20 74 68 69 73 0d 0a 20 20 20 20 20   for this..     
180e0 20 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74   #       connect
180f0 69 6f 6e 29 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  ion)...      #..
18100 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
18110 65 78 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74  exists ::connect
18120 69 6f 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e  ion_flags]} then
18130 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20   {..        #.. 
18140 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
18150 6f 6d 62 69 6e 65 20 61 6e 64 2f 6f 72 20 72 65  ombine and/or re
18160 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 6e 65 63  place the connec
18170 74 69 6f 6e 20 66 6c 61 67 73 20 61 6e 64 20 74  tion flags and t
18180 68 65 6e 20 73 68 6f 77 20 74 68 65 0d 0a 20 20  hen show the..  
18190 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6e 65        #       ne
181a0 77 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 20 20  w value...      
181b0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 73 65 74    #..        set
181c0 20 66 6c 61 67 73 20 5b 63 6f 6d 62 69 6e 65 46   flags [combineF
181d0 6c 61 67 73 20 24 66 6c 61 67 73 20 24 3a 3a 63  lags $flags $::c
181e0 6f 6e 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 5d  onnection_flags]
181f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
18200 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
18210 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74 68  how (and log) th
18220 65 20 6e 65 77 20 65 66 66 65 63 74 69 76 65 20  e new effective 
18230 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73  connection flags
18240 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
18250 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
18260 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
18270 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
18280 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 6d 69 74  exists ::no(emit
18290 43 6f 6d 62 69 6e 65 64 46 6c 61 67 73 29 5d 20  CombinedFlags)] 
182a0 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
182b0 20 20 20 20 28 21 5b 69 6e 66 6f 20 65 78 69 73      (![info exis
182c0 74 73 20 3a 3a 6e 6f 28 65 6d 69 74 43 6f 6d 62  ts ::no(emitComb
182d0 69 6e 65 64 46 6c 61 67 73 49 66 4e 6f 6e 65 29  inedFlagsIfNone)
182e0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
182f0 20 20 20 20 20 20 20 21 5b 68 61 73 4e 6f 46 6c         ![hasNoFl
18300 61 67 73 20 66 6c 61 67 73 20 66 61 6c 73 65 5d  ags flags false]
18310 29 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  )} then {..     
18320 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
18330 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
18340 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
18350 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
18360 2d 20 63 6f 6d 62 69 6e 65 64 20 63 6f 6e 6e 65  - combined conne
18370 63 74 69 6f 6e 20 66 6c 61 67 73 20 66 6f 72 20  ction flags for 
18380 22 20 24 64 61 74 61 62 61 73 65 20 5c 0d 0a 20  " $database \.. 
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
183a0 20 61 72 65 3a 20 22 20 5b 65 78 70 72 20 7b 21   are: " [expr {!
183b0 5b 68 61 73 4e 6f 46 6c 61 67 73 20 66 6c 61 67  [hasNoFlags flag
183c0 73 20 66 61 6c 73 65 5d 20 3f 20 5c 0d 0a 20 20  s false] ? \..  
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 61                [a
183e0 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 66 6c  ppendArgs \" $fl
183f0 61 67 73 20 5c 22 5d 20 3a 20 22 3c 6e 6f 6e 65  ags \"] : "<none
18400 3e 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  >"}] \n]..      
18410 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
18420 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
18430 20 20 20 72 65 74 75 72 6e 20 24 66 6c 61 67 73     return $flags
18440 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
18450 70 72 6f 63 20 67 65 74 46 6c 61 67 73 50 72 6f  proc getFlagsPro
18460 70 65 72 74 79 20 7b 20 7b 66 6c 61 67 73 20 22  perty { {flags "
18470 22 7d 20 7b 71 75 69 65 74 20 66 61 6c 73 65 7d  "} {quiet false}
18480 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
18490 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 44 65 74       # NOTE: Det
184a0 65 72 6d 69 6e 65 20 77 68 61 74 20 74 68 65 20  ermine what the 
184b0 63 6f 6d 62 69 6e 65 64 20 28 67 6c 6f 62 61 6c  combined (global
184c0 20 61 6e 64 20 6c 6f 63 61 6c 29 20 63 6f 6e 6e   and local) conn
184d0 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20  ection..      # 
184e0 20 20 20 20 20 20 66 6c 61 67 73 20 73 68 6f 75        flags shou
184f0 6c 64 20 62 65 2c 20 70 6f 73 73 69 62 6c 79 20  ld be, possibly 
18500 71 75 69 65 74 6c 79 2e 0d 0a 20 20 20 20 20 20  quietly...      
18510 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66 6c 61  #..      set fla
18520 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74 69 6f  gs [getConnectio
18530 6e 46 6c 61 67 73 20 22 22 20 24 66 6c 61 67 73  nFlags "" $flags
18540 20 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20   $quiet]....    
18550 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18560 45 3a 20 49 66 20 6e 6f 20 67 6c 6f 62 61 6c 20  E: If no global 
18570 6f 72 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  or local connect
18580 69 6f 6e 20 66 6c 61 67 73 20 77 65 72 65 20 73  ion flags were s
18590 70 65 63 69 66 69 65 64 2c 20 74 68 65 0d 0a 20  pecified, the.. 
185a0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 65 66       #       def
185b0 61 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ault connection 
185c0 66 6c 61 67 73 20 73 68 6f 75 6c 64 20 62 65 20  flags should be 
185d0 75 73 65 64 3b 20 74 68 65 72 65 66 6f 72 65 2c  used; therefore,
185e0 20 72 65 74 75 72 6e 0d 0a 20 20 20 20 20 20 23   return..      #
185f0 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79 20         an empty 
18600 73 74 72 69 6e 67 20 69 6e 20 74 68 61 74 20 63  string in that c
18610 61 73 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ase...      #.. 
18620 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
18630 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73 5d 20   length $flags] 
18640 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
18650 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 0d        return "".
18660 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
18670 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
18680 45 3a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 63  E: In order to c
18690 68 65 63 6b 20 69 66 20 74 68 65 20 64 65 66 61  heck if the defa
186a0 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
186b0 6c 61 67 73 20 61 72 65 20 62 65 69 6e 67 20 75  lags are being u
186c0 73 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  sed..      #    
186d0 20 20 20 69 74 20 69 73 20 6e 65 63 65 73 73 61     it is necessa
186e0 72 79 20 74 6f 20 61 74 74 65 6d 70 74 20 61 20  ry to attempt a 
186f0 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 74 68  conversion to th
18700 65 20 61 63 74 75 61 6c 20 65 6e 75 6d 65 72 61  e actual enumera
18710 74 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ted..      #    
18720 20 20 20 74 79 70 65 2e 20 20 46 61 69 6c 69 6e     type.  Failin
18730 67 20 74 68 61 74 2c 20 74 68 65 20 63 68 65 63  g that, the chec
18740 6b 20 61 67 61 69 6e 73 74 20 74 68 65 20 64 65  k against the de
18750 66 61 75 6c 74 20 76 61 6c 75 65 20 77 69 6c 6c  fault value will
18760 20 62 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20   be..      #    
18770 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20 20 20     skipped...   
18780 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
18790 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
187a0 20 20 73 65 74 20 65 72 72 6f 72 20 6e 75 6c 6c    set error null
187b0 3b 20 23 20 49 47 4e 4f 52 45 44 0d 0a 0d 0a 20  ; # IGNORED.... 
187c0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
187d0 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 54 72 79  voke Utility Try
187e0 50 61 72 73 65 46 6c 61 67 73 45 6e 75 6d 20 22  ParseFlagsEnum "
187f0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
18800 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
18810 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite.SQLiteConnec
18820 74 69 6f 6e 46 6c 61 67 73 20 22 22 20 24 66 6c  tionFlags "" $fl
18830 61 67 73 20 6e 75 6c 6c 20 74 72 75 65 20 5c 0d  ags null true \.
18840 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75  .            tru
18850 65 20 74 72 75 65 20 65 72 72 6f 72 0d 0a 20 20  e true error..  
18860 20 20 20 20 7d 20 76 61 6c 75 65 5d 7d 20 74 68      } value]} th
18870 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
18880 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
18890 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 70   Attempting to p
188a0 61 72 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  arse the connect
188b0 69 6f 6e 20 66 6c 61 67 73 20 63 61 75 73 65 64  ion flags caused
188c0 20 61 20 73 63 72 69 70 74 0d 0a 20 20 20 20 20   a script..     
188d0 20 20 20 23 20 20 20 20 20 20 20 65 72 72 6f 72     #       error
188e0 2e 20 20 45 6d 69 74 20 61 20 77 61 72 6e 69 6e  .  Emit a warnin
188f0 67 20 74 6f 20 74 68 65 20 74 65 73 74 20 6c 6f  g to the test lo
18900 67 20 66 69 6c 65 20 61 6e 64 20 63 6f 6e 74 69  g file and conti
18910 6e 75 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20  nue..        #  
18920 20 20 20 20 20 75 73 69 6e 67 20 61 6e 20 65 6d       using an em
18930 74 70 79 20 73 74 72 69 6e 67 20 69 6e 73 74 65  tpy string inste
18940 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ad...        #..
18950 20 20 20 20 20 20 20 20 74 6c 6f 67 20 5b 61 70          tlog [ap
18960 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
18970 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
18980 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
18990 20 70 61 72 73 65 20 63 6f 6e 6e 65 63 74 69 6f   parse connectio
189a0 6e 20 66 6c 61 67 73 2c 20 65 72 72 6f 72 3a 20  n flags, error: 
189b0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
189c0 20 5c 6e 5c 74 20 24 76 61 6c 75 65 20 5c 6e 5d   \n\t $value \n]
189d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20  ....        set 
189e0 76 61 6c 75 65 20 22 22 0d 0a 20 20 20 20 20 20  value ""..      
189f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
18a00 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 74      # NOTE: If t
18a10 68 65 20 63 6f 6d 62 69 6e 65 64 20 66 6c 61 67  he combined flag
18a20 73 20 73 74 72 69 6e 67 20 63 6f 75 6c 64 20 6e  s string could n
18a30 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 63  ot actually be c
18a40 6f 6e 76 65 72 74 65 64 0d 0a 20 20 20 20 20 20  onverted..      
18a50 23 20 20 20 20 20 20 20 74 6f 20 74 68 65 20 65  #       to the e
18a60 6e 75 6d 65 72 61 74 65 64 20 74 79 70 65 20 69  numerated type i
18a70 74 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  t is the default
18a80 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 6a 75 73   value, then jus
18a90 74 20 75 73 65 0d 0a 20 20 20 20 20 20 23 20 20  t use..      #  
18aa0 20 20 20 20 20 69 74 20 76 65 72 62 61 74 69 6d       it verbatim
18ab0 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6a 75 73  ; otherwise, jus
18ac0 74 20 72 65 74 75 72 6e 20 61 6e 20 65 6d 70 74  t return an empt
18ad0 79 20 73 74 72 69 6e 67 2e 20 20 49 6e 20 74 68  y string.  In th
18ae0 61 74 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  at..      #     
18af0 20 20 63 61 73 65 2c 20 74 68 65 20 64 65 66 61    case, the defa
18b00 75 6c 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ult connection f
18b10 6c 61 67 73 20 77 69 6c 6c 20 62 65 20 75 73 65  lags will be use
18b20 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  d...      #..   
18b30 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c     if {[string l
18b40 65 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3d 3d  ength $value] ==
18b50 20 30 20 7c 7c 20 24 76 61 6c 75 65 20 6e 65 20   0 || $value ne 
18b60 22 44 65 66 61 75 6c 74 22 7d 20 74 68 65 6e 20  "Default"} then 
18b70 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
18b80 20 20 20 20 20 20 23 20 57 41 52 4e 49 4e 47 3a        # WARNING:
18b90 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
18ba0 65 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 6f  e string value o
18bb0 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 66  f the combined f
18bc0 6c 61 67 73 2c 20 6e 6f 74 0d 0a 20 20 20 20 20  lags, not..     
18bd0 20 20 20 23 20 20 20 20 20 20 20 20 20 20 74 68     #          th
18be0 65 20 65 6e 75 6d 65 72 61 74 65 64 20 76 61 6c  e enumerated val
18bf0 75 65 2e 20 20 54 68 69 73 20 69 73 20 62 79 20  ue.  This is by 
18c00 64 65 73 69 67 6e 20 61 6e 64 20 73 68 6f 75 6c  design and shoul
18c10 64 20 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 23  d not..        #
18c20 20 20 20 20 20 20 20 20 20 20 62 65 20 63 68 61            be cha
18c30 6e 67 65 64 20 77 69 74 68 6f 75 74 20 63 61 72  nged without car
18c40 65 66 75 6c 20 63 6f 6e 73 69 64 65 72 61 74 69  eful considerati
18c50 6f 6e 20 28 65 2e 67 2e 20 69 74 20 77 6f 75 6c  on (e.g. it woul
18c60 64 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  d..        #    
18c70 20 20 20 20 20 20 70 72 65 76 65 6e 74 20 74 68        prevent th
18c80 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  e SQLiteConnecti
18c90 6f 6e 20 63 6c 61 73 73 20 66 72 6f 6d 20 61 6c  on class from al
18ca0 6c 6f 77 69 6e 67 20 69 6e 76 61 6c 69 64 0d 0a  lowing invalid..
18cb0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
18cc0 20 20 20 5b 22 6d 61 67 69 63 61 6c 22 5d 20 6d     ["magical"] m
18cd0 65 74 61 2d 66 6c 61 67 73 29 2e 0d 0a 20 20 20  eta-flags)...   
18ce0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
18cf0 72 65 74 75 72 6e 20 5b 61 70 70 65 6e 64 41 72  return [appendAr
18d00 67 73 20 22 46 6c 61 67 73 3d 22 20 24 66 6c 61  gs "Flags=" $fla
18d10 67 73 20 5c 3b 5d 0d 0a 20 20 20 20 20 20 7d 0d  gs \;]..      }.
18d20 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
18d30 22 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  ""..    }.....  
18d40 20 20 70 72 6f 63 20 67 65 74 54 65 73 74 50 72    proc getTestPr
18d50 6f 70 65 72 74 69 65 73 20 7b 20 7b 66 6c 61 67  operties { {flag
18d60 73 20 22 22 7d 20 7b 71 75 69 65 74 20 66 61 6c  s ""} {quiet fal
18d70 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23  se} } {..      #
18d80 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
18d90 53 74 61 72 74 20 77 69 74 68 20 22 46 6c 61 67  Start with "Flag
18da0 73 22 20 70 72 6f 70 65 72 74 79 20 66 6f 72 20  s" property for 
18db0 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
18dc0 6f 6e 2c 20 69 66 20 61 6e 79 2e 0d 0a 20 20 20  on, if any...   
18dd0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
18de0 72 65 73 75 6c 74 20 5b 67 65 74 46 6c 61 67 73  result [getFlags
18df0 50 72 6f 70 65 72 74 79 20 24 66 6c 61 67 73 20  Property $flags 
18e00 24 71 75 69 65 74 5d 0d 0a 0d 0a 20 20 20 20 20  $quiet]....     
18e10 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18e20 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f  : Add the name o
18e30 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
18e40 73 74 20 66 69 6c 65 2c 20 69 66 20 61 76 61 69  st file, if avai
18e50 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0d  lable.  This is.
18e60 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6f  .      #       o
18e70 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 64 65 62  nly used for deb
18e80 75 67 67 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  ugging...      #
18e90 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66  ..      if {[inf
18ea0 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74 5f  o exists ::test_
18eb0 66 69 6c 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  file]} then {.. 
18ec0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 72 65         append re
18ed0 73 75 6c 74 20 54 65 73 74 46 69 6c 65 3d 20 24  sult TestFile= $
18ee0 3a 3a 74 65 73 74 5f 66 69 6c 65 20 5c 3b 0d 0a  ::test_file \;..
18ef0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18f00 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
18f10 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20 6f  : Add the name o
18f20 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
18f30 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62 6c 65  st, if available
18f40 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 0d  .  This is only.
18f50 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75  .      #       u
18f60 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
18f70 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  g...      #..   
18f80 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
18f90 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73 74  sts ::eagle_test
18fa0 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 5d 7d  s(CurrentName)]}
18fb0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
18fc0 20 61 70 70 65 6e 64 20 72 65 73 75 6c 74 20 54   append result T
18fd0 65 73 74 4e 61 6d 65 3d 20 24 3a 3a 65 61 67 6c  estName= $::eagl
18fe0 65 5f 74 65 73 74 73 28 43 75 72 72 65 6e 74 4e  e_tests(CurrentN
18ff0 61 6d 65 29 20 5c 3b 0d 0a 20 20 20 20 20 20 7d  ame) \;..      }
19000 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ....      return
19010 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 7d 0d   $result..    }.
19020 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 65 6e 61  ....    proc ena
19030 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20 7b  bleSharedCache {
19040 20 63 68 61 6e 6e 65 6c 20 65 6e 61 62 6c 65 20   channel enable 
19050 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
19060 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61  {..      if {[ca
19070 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 6f  tch {..        o
19080 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
19090 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
190a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 79  ..            Sy
190b0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
190c0 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74  .UnsafeNativeMet
190d0 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  hods \..        
190e0 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
190f0 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20  le_shared_cache 
19100 5b 65 78 70 72 20 69 6e 74 28 24 65 6e 61 62 6c  [expr int($enabl
19110 65 29 5d 0d 0a 20 20 20 20 20 20 7d 20 72 65 73  e)]..      } res
19120 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
19130 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21  {..        if {!
19140 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
19150 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
19160 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
19170 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
19180 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c        "---- call
19190 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
191a0 73 68 61 72 65 64 5f 63 61 63 68 65 28 22 20 24  shared_cache(" $
191b0 65 6e 61 62 6c 65 20 5c 0d 0a 20 20 20 20 20 20  enable \..      
191c0 20 20 20 20 20 20 20 20 22 29 2e 2e 2e 20 6f 6b          ")... ok
191d0 3a 20 22 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d  : " $result \n].
191e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
191f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
19200 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
19210 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
19220 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
19230 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
19240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19250 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74 65  ---- call sqlite
19260 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
19270 63 61 63 68 65 28 22 20 24 65 6e 61 62 6c 65 20  cache(" $enable 
19280 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
19290 20 22 29 2e 2e 2e 20 65 72 72 6f 72 3a 20 22 20   ")... error: " 
192a0 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
192b0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
192c0 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
192d0 20 20 20 20 70 72 6f 63 20 73 65 74 75 70 44 62      proc setupDb
192e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
192f0 66 69 6c 65 4e 61 6d 65 20 7b 6d 6f 64 65 20 22  fileName {mode "
19300 22 7d 20 7b 64 61 74 65 54 69 6d 65 46 6f 72 6d  "} {dateTimeForm
19310 61 74 20 22 22 7d 20 7b 64 61 74 65 54 69 6d 65  at ""} {dateTime
19320 4b 69 6e 64 20 22 22 7d 20 7b 66 6c 61 67 73 20  Kind ""} {flags 
19330 22 22 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ""}..           
19340 20 7b 65 78 74 72 61 20 22 22 7d 20 7b 71 75 61   {extra ""} {qua
19350 6c 69 66 79 20 74 72 75 65 7d 20 7b 64 65 6c 65  lify true} {dele
19360 74 65 20 74 72 75 65 7d 20 7b 75 72 69 20 66 61  te true} {uri fa
19370 6c 73 65 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  lse}..          
19380 20 20 7b 74 65 6d 70 6f 72 61 72 79 20 74 72 75    {temporary tru
19390 65 7d 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20  e} {varName db} 
193a0 7b 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20  {quiet false} } 
193b0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
193c0 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
193d0 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
193e0 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
193f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
19400 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
19410 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
19420 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
19430 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
19440 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
19450 4e 4f 54 45 3a 20 46 6f 72 20 6e 6f 77 2c 20 61  NOTE: For now, a
19460 6c 6c 20 74 65 73 74 20 64 61 74 61 62 61 73 65  ll test database
19470 73 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65  s used by the te
19480 73 74 20 73 75 69 74 65 20 61 72 65 20 70 6c 61  st suite are pla
19490 63 65 64 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ced..      #    
194a0 20 20 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61     into the data
194b0 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 2e 20  base directory. 
194c0 20 45 61 63 68 20 64 61 74 61 62 61 73 65 20 61   Each database a
194d0 6e 64 20 72 65 6c 61 74 65 64 20 66 69 6c 65 73  nd related files
194e0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
194f0 75 73 65 64 20 62 79 20 61 20 74 65 73 74 20 73  used by a test s
19500 68 6f 75 6c 64 20 62 65 20 63 6c 65 61 6e 65 64  hould be cleaned
19510 20 75 70 20 62 79 20 74 68 61 74 20 74 65 73 74   up by that test
19520 20 75 73 69 6e 67 20 74 68 65 0d 0a 20 20 20 20   using the..    
19530 20 20 23 20 20 20 20 20 20 20 22 63 6c 65 61 6e    #       "clean
19540 75 70 44 62 22 20 70 72 6f 63 65 64 75 72 65 2c  upDb" procedure,
19550 20 62 65 6c 6f 77 2e 0d 0a 20 20 20 20 20 20 23   below...      #
19560 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69 73  ..      if {!$is
19570 4d 65 6d 6f 72 79 20 26 26 20 24 71 75 61 6c 69  Memory && $quali
19580 66 79 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  fy} then {..    
19590 20 20 20 20 73 65 74 20 66 69 6c 65 4e 61 6d 65      set fileName
195a0 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74   [file join [get
195b0 44 61 74 61 62 61 73 65 44 69 72 65 63 74 6f 72  DatabaseDirector
195c0 79 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 66  y] [file tail $f
195d0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
195e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
195f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 79 20       # NOTE: By 
19600 64 65 66 61 75 6c 74 2c 20 64 65 6c 65 74 65 20  default, delete 
19610 61 6e 79 20 70 72 65 2d 65 78 69 73 74 69 6e 67  any pre-existing
19620 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
19630 68 65 20 73 61 6d 65 20 66 69 6c 65 0d 0a 20 20  he same file..  
19640 20 20 20 20 23 20 20 20 20 20 20 20 6e 61 6d 65      #       name
19650 20 69 66 20 69 74 20 63 75 72 72 65 6e 74 6c 79   if it currently
19660 20 65 78 69 73 74 73 2e 0d 0a 20 20 20 20 20 20   exists...      
19670 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 69  #..      if {!$i
19680 73 4d 65 6d 6f 72 79 20 26 26 20 24 64 65 6c 65  sMemory && $dele
19690 74 65 20 26 26 20 5b 66 69 6c 65 20 65 78 69 73  te && [file exis
196a0 74 73 20 24 66 69 6c 65 4e 61 6d 65 5d 7d 20 74  ts $fileName]} t
196b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23  hen {..        #
196c0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
196d0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
196e0 65 74 65 20 61 6e 79 20 70 72 65 2d 65 78 69 73  ete any pre-exis
196f0 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 77 69  ting database wi
19700 74 68 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  th the same file
19710 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
19720 20 20 6e 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20    name...       
19730 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
19740 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64 65 6c  [catch {file del
19750 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d 20 65  ete $fileName} e
19760 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  rror]} then {.. 
19770 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
19780 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65        # NOTE: We
19790 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20   somehow failed 
197a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  to delete the fi
197b0 6c 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  le, report why..
197c0 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
197d0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
197e0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
197f0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
19800 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
19810 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
19830 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
19840 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64 61  led to delete da
19850 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
19860 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c 22               "\"
19880 20 64 75 72 69 6e 67 20 73 65 74 75 70 2c 20 65   during setup, e
19890 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72  rror: " \n\t $er
198a0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
198b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
198c0 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
198d0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
198e0 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
198f0 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
19900 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
19910 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
19920 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
19930 20 20 20 20 63 61 6c 6c 65 72 2e 20 20 54 68 65      caller.  The
19940 20 68 61 6e 64 6c 65 20 74 6f 20 74 68 65 20 6f   handle to the o
19950 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 20 77  pened database w
19960 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 74 68  ill be stored th
19970 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ere...      #.. 
19980 20 20 20 20 20 75 70 76 61 72 20 31 20 24 76 61       upvar 1 $va
19990 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20 20 20  rName db....    
199a0 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
199b0 45 3a 20 53 74 61 72 74 20 62 75 69 6c 64 69 6e  E: Start buildin
199c0 67 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  g the connection
199d0 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 6f 6e   string.  The on
199e0 6c 79 20 72 65 71 75 69 72 65 64 20 70 6f 72 74  ly required port
199f0 69 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ion..      #    
19a00 20 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63     of the connec
19a10 74 69 6f 6e 20 73 74 72 69 6e 67 20 69 73 20 74  tion string is t
19a20 68 65 20 64 61 74 61 20 73 6f 75 72 63 65 2c 20  he data source, 
19a30 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74  which contains t
19a40 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  he..      #     
19a50 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
19a60 6e 61 6d 65 20 69 74 73 65 6c 66 2e 20 20 49 66  name itself.  If
19a70 20 6f 75 72 20 63 61 6c 6c 65 72 20 77 61 6e 74   our caller want
19a80 73 20 74 6f 20 75 73 65 20 61 20 55 52 49 20 61  s to use a URI a
19a90 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
19aa0 20 74 68 65 20 64 61 74 61 20 73 6f 75 72 63 65   the data source
19ab0 2c 20 75 73 65 20 74 68 65 20 46 75 6c 6c 55 72  , use the FullUr
19ac0 69 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72  i connection str
19ad0 69 6e 67 20 70 72 6f 70 65 72 74 79 20 74 6f 0d  ing property to.
19ae0 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 70  .      #       p
19af0 72 65 76 65 6e 74 20 74 68 65 20 64 61 74 61 20  revent the data 
19b00 73 6f 75 72 63 65 20 73 74 72 69 6e 67 20 66 72  source string fr
19b10 6f 6d 20 62 65 69 6e 67 20 6d 61 6e 67 6c 65 64  om being mangled
19b20 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
19b30 20 20 69 66 20 7b 24 75 72 69 7d 20 74 68 65 6e    if {$uri} then
19b40 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
19b50 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 46 75 6c 6c  connection {Full
19b60 55 72 69 3d 24 7b 66 69 6c 65 4e 61 6d 65 7d 7d  Uri=${fileName}}
19b70 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..      } else {
19b80 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
19b90 6e 6e 65 63 74 69 6f 6e 20 7b 44 61 74 61 20 53  nnection {Data S
19ba0 6f 75 72 63 65 3d 24 7b 66 69 6c 65 4e 61 6d 65  ource=${fileName
19bb0 7d 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  }}..      }.... 
19bc0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
19bd0 4e 4f 54 45 3a 20 53 69 6e 63 65 20 74 68 69 73  NOTE: Since this
19be0 20 70 72 6f 63 65 64 75 72 65 20 68 61 73 20 6e   procedure has n
19bf0 6f 20 73 70 65 63 69 61 6c 20 6b 6e 6f 77 6c 65  o special knowle
19c00 64 67 65 20 6f 66 20 77 68 61 74 20 74 68 65 20  dge of what the 
19c10 64 65 66 61 75 6c 74 0d 0a 20 20 20 20 20 20 23  default..      #
19c20 20 20 20 20 20 20 20 73 65 74 74 69 6e 67 20 69         setting i
19c30 73 20 66 6f 72 20 74 68 65 20 54 6f 46 75 6c 6c  s for the ToFull
19c40 50 61 74 68 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Path connection 
19c50 73 74 72 69 6e 67 20 70 72 6f 70 65 72 79 2c 20  string propery, 
19c60 61 6c 77 61 79 73 0d 0a 20 20 20 20 20 20 23 20  always..      # 
19c70 20 20 20 20 20 20 61 64 64 20 74 68 65 20 76 61        add the va
19c80 6c 75 65 20 77 65 20 6b 6e 6f 77 20 61 62 6f 75  lue we know abou
19c90 74 20 74 6f 20 74 68 65 20 63 6f 6e 6e 65 63 74  t to the connect
19ca0 69 6f 6e 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20  ion string...   
19cb0 20 20 20 23 0d 0a 20 20 20 20 20 20 61 70 70 65     #..      appe
19cc0 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 7b 3b  nd connection {;
19cd0 54 6f 46 75 6c 6c 50 61 74 68 3d 24 7b 71 75 61  ToFullPath=${qua
19ce0 6c 69 66 79 7d 7d 0d 0a 0d 0a 20 20 20 20 20 20  lify}}....      
19cf0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
19d00 20 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73   If our caller s
19d10 70 65 63 69 66 69 65 64 20 61 20 6a 6f 75 72 6e  pecified a journ
19d20 61 6c 20 6d 6f 64 65 2c 20 61 64 64 20 74 68 65  al mode, add the
19d30 20 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69   necessary porti
19d40 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  on..      #     
19d50 20 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74    of the connect
19d60 69 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d  ion string now..
19d70 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
19d80 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
19d90 74 68 20 24 6d 6f 64 65 5d 20 3e 20 30 7d 20 74  th $mode] > 0} t
19da0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
19db0 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
19dc0 20 7b 3b 4a 6f 75 72 6e 61 6c 20 4d 6f 64 65 3d   {;Journal Mode=
19dd0 24 7b 6d 6f 64 65 7d 7d 0d 0a 20 20 20 20 20 20  ${mode}}..      
19de0 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
19df0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
19e00 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
19e10 69 65 64 20 61 20 44 61 74 65 54 69 6d 65 20 66  ied a DateTime f
19e20 6f 72 6d 61 74 2c 20 61 64 64 20 74 68 65 20 6e  ormat, add the n
19e30 65 63 65 73 73 61 72 79 0d 0a 20 20 20 20 20 20  ecessary..      
19e40 23 20 20 20 20 20 20 20 70 6f 72 74 69 6f 6e 20  #       portion 
19e50 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
19e60 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a 20  n string now... 
19e70 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
19e80 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
19e90 20 24 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74   $dateTimeFormat
19ea0 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
19eb0 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
19ec0 6e 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54  nnection {;DateT
19ed0 69 6d 65 46 6f 72 6d 61 74 3d 24 7b 64 61 74 65  imeFormat=${date
19ee0 54 69 6d 65 46 6f 72 6d 61 74 7d 7d 0d 0a 20 20  TimeFormat}}..  
19ef0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
19f00 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
19f10 49 66 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70  If our caller sp
19f20 65 63 69 66 69 65 64 20 61 20 44 61 74 65 54 69  ecified a DateTi
19f30 6d 65 4b 69 6e 64 2c 20 61 64 64 20 74 68 65 20  meKind, add the 
19f40 6e 65 63 65 73 73 61 72 79 20 70 6f 72 74 69 6f  necessary portio
19f50 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  n..      #      
19f60 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   of the connecti
19f70 6f 6e 20 73 74 72 69 6e 67 20 6e 6f 77 2e 0d 0a  on string now...
19f80 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
19f90 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
19fa0 68 20 24 64 61 74 65 54 69 6d 65 4b 69 6e 64 5d  h $dateTimeKind]
19fb0 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
19fc0 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f 6e        append con
19fd0 6e 65 63 74 69 6f 6e 20 7b 3b 44 61 74 65 54 69  nection {;DateTi
19fe0 6d 65 4b 69 6e 64 3d 24 7b 64 61 74 65 54 69 6d  meKind=${dateTim
19ff0 65 4b 69 6e 64 7d 7d 0d 0a 20 20 20 20 20 20 7d  eKind}}..      }
1a000 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  ....      #..   
1a010 20 20 20 23 20 4e 4f 54 45 3a 20 46 69 67 75 72     # NOTE: Figur
1a020 65 20 6f 75 74 20 77 68 61 74 20 74 68 65 20 66  e out what the f
1a030 69 6e 61 6c 20 66 6c 61 67 73 20 66 6f 72 20 74  inal flags for t
1a040 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  his connection n
1a050 65 65 64 20 74 6f 20 62 65 2e 0d 0a 20 20 20 20  eed to be...    
1a060 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20 66    #..      set f
1a070 6c 61 67 73 20 5b 67 65 74 43 6f 6e 6e 65 63 74  lags [getConnect
1a080 69 6f 6e 46 6c 61 67 73 20 24 66 69 6c 65 4e 61  ionFlags $fileNa
1a090 6d 65 20 24 66 6c 61 67 73 20 24 71 75 69 65 74  me $flags $quiet
1a0a0 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ]....      #..  
1a0b0 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 6f      # NOTE: If o
1a0c0 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63 69 66  ur caller specif
1a0d0 69 65 64 20 73 6f 6d 65 20 53 51 4c 69 74 65 43  ied some SQLiteC
1a0e0 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 2c 20  onnectionFlags, 
1a0f0 61 64 64 20 74 68 65 0d 0a 20 20 20 20 20 20 23  add the..      #
1a100 20 20 20 20 20 20 20 6e 65 63 65 73 73 61 72 79         necessary
1a110 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1a120 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e  connection strin
1a130 67 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 23 0d  g now...      #.
1a140 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
1a150 6e 67 20 6c 65 6e 67 74 68 20 24 66 6c 61 67 73  ng length $flags
1a160 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1a170 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 63 6f         append co
1a180 6e 6e 65 63 74 69 6f 6e 20 7b 3b 46 6c 61 67 73  nnection {;Flags
1a190 3d 24 7b 66 6c 61 67 73 7d 7d 0d 0a 20 20 20 20  =${flags}}..    
1a1a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
1a1b0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
1a1c0 20 6f 75 72 20 63 61 6c 6c 65 72 20 73 70 65 63   our caller spec
1a1d0 69 66 69 65 64 20 61 6e 20 65 78 74 72 61 20 70  ified an extra p
1a1e0 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 63 6f  ayload to the co
1a1f0 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20 20  nnection..      
1a200 23 20 20 20 20 20 20 20 73 74 72 69 6e 67 2c 20  #       string, 
1a210 61 70 70 65 6e 64 20 69 74 20 6e 6f 77 2e 0d 0a  append it now...
1a220 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1a230 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  f {[string lengt
1a240 68 20 24 65 78 74 72 61 5d 20 3e 20 30 7d 20 74  h $extra] > 0} t
1a250 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
1a260 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  ppend connection
1a270 20 5c 3b 20 24 65 78 74 72 61 0d 0a 20 20 20 20   \; $extra..    
1a280 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
1a290 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 64        # NOTE: Ad
1a2a0 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
1a2b0 65 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 66  e current test f
1a2c0 69 6c 65 2c 20 69 66 20 61 76 61 69 6c 61 62 6c  ile, if availabl
1a2d0 65 2e 20 20 54 68 69 73 20 69 73 0d 0a 20 20 20  e.  This is..   
1a2e0 20 20 20 23 20 20 20 20 20 20 20 6f 6e 6c 79 20     #       only 
1a2f0 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
1a300 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
1a310 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1a320 69 73 74 73 20 3a 3a 74 65 73 74 5f 66 69 6c 65  ists ::test_file
1a330 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a340 20 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63     append connec
1a350 74 69 6f 6e 20 7b 3b 54 65 73 74 46 69 6c 65 3d  tion {;TestFile=
1a360 24 7b 3a 3a 74 65 73 74 5f 66 69 6c 65 7d 7d 0d  ${::test_file}}.
1a370 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1a380 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1a390 45 3a 20 41 64 64 20 74 68 65 20 6e 61 6d 65 20  E: Add the name 
1a3a0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
1a3b0 65 73 74 2c 20 69 66 20 61 76 61 69 6c 61 62 6c  est, if availabl
1a3c0 65 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  e.  This is only
1a3d0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1a3e0 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
1a3f0 6e 67 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  ng...      #..  
1a400 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1a410 69 73 74 73 20 3a 3a 65 61 67 6c 65 5f 74 65 73  ists ::eagle_tes
1a420 74 73 28 43 75 72 72 65 6e 74 4e 61 6d 65 29 5d  ts(CurrentName)]
1a430 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1a440 20 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74    append connect
1a450 69 6f 6e 20 7b 3b 54 65 73 74 4e 61 6d 65 3d 24  ion {;TestName=$
1a460 7b 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28 43  {::eagle_tests(C
1a470 75 72 72 65 6e 74 4e 61 6d 65 29 7d 7d 0d 0a 20  urrentName)}}.. 
1a480 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a490 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a4a0 20 46 6f 72 20 63 6c 61 72 69 74 79 2c 20 61 70   For clarity, ap
1a4b0 70 65 6e 64 20 61 20 66 69 6e 61 6c 20 73 65 6d  pend a final sem
1a4c0 69 63 6f 6c 6f 6e 20 74 6f 20 74 68 65 20 63 6f  icolon to the co
1a4d0 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67 2e  nnection string.
1a4e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a4f0 20 61 70 70 65 6e 64 20 63 6f 6e 6e 65 63 74 69   append connecti
1a500 6f 6e 20 5c 3b 0d 0a 0d 0a 20 20 20 20 20 20 23  on \;....      #
1a510 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
1a520 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
1a530 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 77  e connection now
1a540 2c 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6f 70  , placing the op
1a550 61 71 75 65 20 68 61 6e 64 6c 65 20 76 61 6c 75  aque handle valu
1a560 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  e..      #      
1a570 20 69 6e 74 6f 20 74 68 65 20 76 61 72 69 61 62   into the variab
1a580 6c 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  le specified by 
1a590 6f 75 72 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20  our caller...   
1a5a0 20 20 20 23 0d 0a 20 20 20 20 20 20 73 65 74 20     #..      set 
1a5b0 64 62 20 5b 73 71 6c 20 6f 70 65 6e 20 2d 74 79  db [sql open -ty
1a5c0 70 65 20 53 51 4c 69 74 65 20 5b 73 75 62 73 74  pe SQLite [subst
1a5d0 20 24 63 6f 6e 6e 65 63 74 69 6f 6e 5d 5d 0d 0a   $connection]]..
1a5e0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1a5f0 20 23 20 4e 4f 54 45 3a 20 43 6f 6e 66 69 67 75   # NOTE: Configu
1a600 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
1a610 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20 74   directory for t
1a620 68 65 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 20  he newly opened 
1a630 64 61 74 61 62 61 73 65 0d 0a 20 20 20 20 20 20  database..      
1a640 23 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69  #       connecti
1a650 6f 6e 20 6e 6f 77 20 75 6e 6c 65 73 73 20 6f 75  on now unless ou
1a660 72 20 63 61 6c 6c 65 72 20 66 6f 72 62 69 64 73  r caller forbids
1a670 20 69 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20   it...      #.. 
1a680 20 20 20 20 20 69 66 20 7b 24 74 65 6d 70 6f 72       if {$tempor
1a690 61 72 79 20 26 26 20 21 5b 69 6e 66 6f 20 65 78  ary && ![info ex
1a6a0 69 73 74 73 20 3a 3a 6e 6f 28 73 65 74 54 65 6d  ists ::no(setTem
1a6b0 70 6f 72 61 72 79 44 69 72 65 63 74 6f 72 79 29  poraryDirectory)
1a6c0 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1a6d0 20 20 20 73 71 6c 20 65 78 65 63 75 74 65 20 24     sql execute $
1a6e0 64 62 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  db [appendArgs \
1a6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 50  ..            "P
1a700 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65  RAGMA temp_store
1a710 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 5c 22 22  _directory = \""
1a720 20 5b 67 65 74 54 65 6d 70 6f 72 61 72 79 44 69   [getTemporaryDi
1a730 72 65 63 74 6f 72 79 5d 20 5c 22 5c 3b 5d 0d 0a  rectory] \"\;]..
1a740 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1a750 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1a760 3a 20 50 65 72 66 6f 72 6d 20 61 6e 79 20 65 78  : Perform any ex
1a770 74 72 61 20 70 65 72 2d 63 6f 6e 6e 65 63 74 69  tra per-connecti
1a780 6f 6e 20 73 65 74 75 70 20 66 6f 72 20 74 68 65  on setup for the
1a790 20 6e 65 77 6c 79 20 6f 70 65 6e 65 64 0d 0a 20   newly opened.. 
1a7a0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 61 74       #       dat
1a7b0 61 62 61 73 65 20 6e 6f 77 20 75 6e 6c 65 73 73  abase now unless
1a7c0 20 6f 75 72 20 63 61 6c 6c 65 72 20 66 6f 72 62   our caller forb
1a7d0 69 64 73 20 69 74 2e 0d 0a 20 20 20 20 20 20 23  ids it...      #
1a7e0 0d 0a 20 20 20 20 20 20 73 65 74 20 65 78 65 63  ..      set exec
1a7f0 75 74 65 4f 6e 53 65 74 75 70 20 5b 67 65 74 45  uteOnSetup [getE
1a800 78 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a  xecuteOnSetup]..
1a810 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
1a820 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 65 63  ing length $exec
1a830 75 74 65 4f 6e 53 65 74 75 70 5d 20 3e 20 30 20  uteOnSetup] > 0 
1a840 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
1a850 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
1a860 6e 6f 28 65 78 65 63 75 74 65 4f 6e 53 65 74 75  no(executeOnSetu
1a870 70 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  p)]} then {..   
1a880 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1a890 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 63 6f 6d  # NOTE: This com
1a8a0 6d 61 6e 64 20 6d 61 79 20 72 61 69 73 65 20 61  mand may raise a
1a8b0 6e 20 65 72 72 6f 72 3b 20 69 66 20 73 6f 2c 20  n error; if so, 
1a8c0 74 68 61 74 20 69 73 20 66 69 6e 65 2c 20 61 73  that is fine, as
1a8d0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
1a8e0 20 20 74 68 65 20 65 6e 63 6c 6f 73 69 6e 67 20    the enclosing 
1a8f0 74 65 73 74 20 77 69 6c 6c 20 74 68 65 6e 20 66  test will then f
1a900 61 69 6c 2e 20 20 54 68 65 20 5b 73 75 62 73 74  ail.  The [subst
1a910 5d 20 63 6f 6d 6d 61 6e 64 20 69 73 0d 0a 20 20  ] command is..  
1a920 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75 73        #       us
1a930 65 64 20 6f 6e 20 74 68 65 20 53 51 4c 20 69 6e  ed on the SQL in
1a940 20 63 61 73 65 20 69 74 20 6e 65 65 64 73 20 74   case it needs t
1a950 6f 20 72 65 66 65 72 20 74 6f 20 73 74 61 74 65  o refer to state
1a960 20 69 6e 20 6f 75 72 0d 0a 20 20 20 20 20 20 20   in our..       
1a970 20 23 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74   #       context
1a980 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
1a990 20 20 20 20 20 20 73 71 6c 20 65 78 65 63 75 74        sql execut
1a9a0 65 20 24 64 62 20 5b 73 75 62 73 74 20 24 65 78  e $db [subst $ex
1a9b0 65 63 75 74 65 4f 6e 53 65 74 75 70 5d 0d 0a 20  ecuteOnSetup].. 
1a9c0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1a9d0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
1a9e0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
1a9f0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
1aa00 6e 64 6c 65 20 75 70 6f 6e 20 73 75 63 63 65 73  ndle upon succes
1aa10 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20  s...      #..   
1aa20 20 20 20 72 65 74 75 72 6e 20 24 64 62 0d 0a 20     return $db.. 
1aa30 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1aa40 63 20 67 65 74 44 62 43 6f 6e 6e 65 63 74 69 6f  c getDbConnectio
1aa50 6e 20 7b 20 7b 76 61 72 4e 61 6d 65 20 64 62 7d  n { {varName db}
1aa60 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1aa70 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 66       # NOTE: Ref
1aa80 65 72 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  er to the specif
1aa90 69 65 64 20 76 61 72 69 61 62 6c 65 20 28 65 2e  ied variable (e.
1aaa0 67 2e 20 22 64 62 22 29 20 69 6e 20 74 68 65 20  g. "db") in the 
1aab0 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 0d 0a  context of our..
1aac0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 61        #       ca
1aad0 6c 6c 65 72 2e 20 20 54 68 65 20 68 61 6e 64 6c  ller.  The handl
1aae0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1aaf0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65  e previously ope
1ab00 6e 65 64 20 76 69 61 20 74 68 65 0d 0a 20 20 20  ned via the..   
1ab10 20 20 20 23 20 20 20 20 20 20 20 5b 73 65 74 75     #       [setu
1ab20 70 44 62 5d 20 70 72 6f 63 65 64 75 72 65 20 73  pDb] procedure s
1ab30 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
1ab40 74 68 65 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d  there...      #.
1ab50 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 24  .      upvar 1 $
1ab60 76 61 72 4e 61 6d 65 20 64 62 0d 0a 0d 0a 20 20  varName db....  
1ab70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e      #..      # N
1ab80 4f 54 45 3a 20 54 68 69 73 20 72 65 74 75 72 6e  OTE: This return
1ab90 73 20 74 68 65 20 41 44 4f 2e 4e 45 54 20 49 44  s the ADO.NET ID
1aba0 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 6a 65  bConnection obje
1abb0 63 74 20 69 6e 73 74 61 6e 63 65 20 66 6f 72 20  ct instance for 
1abc0 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20 20  the..      #    
1abd0 20 20 20 73 70 65 63 69 66 69 65 64 20 64 61 74     specified dat
1abe0 61 62 73 65 20 68 61 6e 64 6c 65 2e 20 20 53 69  abse handle.  Si
1abf0 6e 63 65 20 67 65 74 74 69 6e 67 20 74 68 69 73  nce getting this
1ac00 20 6f 62 6a 65 63 74 20 72 65 6c 69 65 73 20 75   object relies u
1ac10 70 6f 6e 0d 0a 20 20 20 20 20 20 23 20 20 20 20  pon..      #    
1ac20 20 20 20 45 61 67 6c 65 20 69 6e 74 65 72 6e 61     Eagle interna
1ac30 6c 73 2c 20 67 72 65 61 74 20 63 61 72 65 20 73  ls, great care s
1ac40 68 6f 75 6c 64 20 62 65 20 74 61 6b 65 6e 20 74  hould be taken t
1ac50 6f 20 61 76 6f 69 64 20 64 69 73 70 6f 73 69 6e  o avoid disposin
1ac60 67 20 6f 66 0d 0a 20 20 20 20 20 20 23 20 20 20  g of..      #   
1ac70 20 20 20 20 74 68 69 73 20 6f 62 6a 65 63 74 20      this object 
1ac80 6f 72 20 6f 74 68 65 72 77 69 73 65 20 70 75 74  or otherwise put
1ac90 74 69 6e 67 20 69 74 20 69 6e 74 6f 20 61 6e 20  ting it into an 
1aca0 69 6e 76 61 6c 69 64 20 73 74 61 74 65 2e 0d 0a  invalid state...
1acb0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
1acc0 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
1acd0 64 62 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  db]} then {..   
1ace0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
1acf0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  {..          obj
1ad00 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1ad10 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 6f 62  s +NonPublic -ob
1ad20 6a 65 63 74 66 6c 61 67 73 20 2b 4e 6f 44 69 73  jectflags +NoDis
1ad30 70 6f 73 65 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  pose -alias \.. 
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74               Int
1ad50 65 72 70 72 65 74 65 72 2e 47 65 74 41 63 74 69  erpreter.GetActi
1ad60 76 65 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 49  ve.connections I
1ad70 74 65 6d 20 24 64 62 0d 0a 20 20 20 20 20 20 20  tem $db..       
1ad80 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
1ad90 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1ada0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1adb0 23 20 4e 4f 54 45 3a 20 53 75 63 63 65 73 73 2c  # NOTE: Success,
1adc0 20 72 65 74 75 72 6e 20 74 68 65 20 6f 70 61 71   return the opaq
1add0 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65  ue object handle
1ade0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1adf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ae00 20 24 72 65 73 75 6c 74 0d 0a 20 20 20 20 20 20   $result..      
1ae10 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1ae20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ae30 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69 6c 75     # NOTE: Failu
1ae40 72 65 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d  re, report why..
1ae50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1ae60 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
1ae70 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
1ae80 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
1ae90 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
1aea0 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
1aeb0 20 74 6f 20 67 65 74 20 63 6f 6e 6e 65 63 74 69   to get connecti
1aec0 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20 64 61  on handle for da
1aed0 74 61 62 61 73 65 20 5c 22 22 20 5c 0d 0a 20 20  tabase \"" \..  
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 24 64 62 20              $db 
1aef0 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e  "\", error: " \n
1af00 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
1af10 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1af20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20   }....      #.. 
1af30 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 61 69       # NOTE: Fai
1af40 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  lure, return an 
1af50 6f 62 76 69 6f 75 73 6c 79 20 69 6e 76 61 6c 69  obviously invali
1af60 64 20 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20  d opaque object 
1af70 68 61 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 23  handle...      #
1af80 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  ..      return "
1af90 22 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  "..    }.....   
1afa0 20 70 72 6f 63 20 66 72 65 65 44 62 43 6f 6e 6e   proc freeDbConn
1afb0 65 63 74 69 6f 6e 20 7b 20 7b 76 61 72 4e 61 6d  ection { {varNam
1afc0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 7d 20  e connection} } 
1afd0 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
1afe0 20 20 23 20 4e 4f 54 45 3a 20 52 65 66 65 72 20    # NOTE: Refer 
1aff0 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
1b000 20 76 61 72 69 61 62 6c 65 20 28 65 2e 67 2e 20   variable (e.g. 
1b010 22 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 20 69 6e  "connection") in
1b020 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
1b030 20 20 20 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f      context of o
1b040 75 72 20 63 61 6c 6c 65 72 2e 20 20 54 68 65 20  ur caller.  The 
1b050 6f 70 61 71 75 65 20 6f 62 6a 65 63 74 20 68 61  opaque object ha
1b060 6e 64 6c 65 20 66 6f 72 20 61 6e 20 41 44 4f 2e  ndle for an ADO.
1b070 4e 45 54 0d 0a 20 20 20 20 20 20 23 20 20 20 20  NET..      #    
1b080 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72     connection pr
1b090 65 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65  eviously returne
1b0a0 64 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65  d by [getDbConne
1b0b0 63 74 69 6f 6e 5d 20 73 68 6f 75 6c 64 20 62 65  ction] should be
1b0c0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1b0d0 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a 20  stored there... 
1b0e0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70       #..      up
1b0f0 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63  var 1 $varName c
1b100 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 0d 0a 20 20 20  onnection....   
1b110 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
1b120 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 72  TE: Attempt to r
1b130 65 6d 6f 76 65 20 74 68 65 20 6f 70 61 71 75 65  emove the opaque
1b140 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 66   object handle f
1b150 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 70 72 65  rom the interpre
1b160 74 65 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20  ter..      #    
1b170 20 20 20 6e 6f 77 2e 20 20 54 68 69 73 20 5b 6f     now.  This [o
1b180 62 6a 65 63 74 20 64 69 73 70 6f 73 65 5d 20 63  bject dispose] c
1b190 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  all will not act
1b1a0 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 20 6f 66  ually dispose of
1b1b0 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20 20   the..      #   
1b1c0 20 20 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f      underlying o
1b1d0 62 6a 65 63 74 20 62 65 63 61 75 73 65 20 74 68  bject because th
1b1e0 65 20 2b 4e 6f 44 69 73 70 6f 73 65 20 66 6c 61  e +NoDispose fla
1b1f0 67 20 77 61 73 20 73 65 74 20 6f 6e 20 69 74 0d  g was set on it.
1b200 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64  .      #       d
1b210 75 72 69 6e 67 20 63 72 65 61 74 69 6f 6e 20 6f  uring creation o
1b220 66 20 74 68 65 20 6f 70 61 71 75 65 20 6f 62 6a  f the opaque obj
1b230 65 63 74 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20  ect handle...   
1b240 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20 7b     #..      if {
1b250 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 6f 6e  [info exists con
1b260 6e 65 63 74 69 6f 6e 5d 20 26 26 20 5c 0d 0a 20  nection] && \.. 
1b270 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68 20           [catch 
1b280 7b 6f 62 6a 65 63 74 20 64 69 73 70 6f 73 65 20  {object dispose 
1b290 24 63 6f 6e 6e 65 63 74 69 6f 6e 7d 20 65 72 72  $connection} err
1b2a0 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  or]} then {..   
1b2b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b2c0 23 20 4e 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68  # NOTE: We someh
1b2d0 6f 77 20 66 61 69 6c 65 64 20 74 6f 20 72 65 6d  ow failed to rem
1b2e0 6f 76 65 20 74 68 65 20 68 61 6e 64 6c 65 2c 20  ove the handle, 
1b2f0 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20 20 20  report why...   
1b300 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1b310 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
1b320 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
1b330 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
1b340 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20   "==== WARNING: 
1b350 66 61 69 6c 65 64 20 74 6f 20 72 65 6d 6f 76 65  failed to remove
1b360 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   connection hand
1b370 6c 65 20 5c 22 22 20 24 63 6f 6e 6e 65 63 74 69  le \"" $connecti
1b380 6f 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  on \..          
1b390 20 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20    "\", error: " 
1b3a0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1b3b0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
1b3c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 61 64 64  ....    proc add
1b3d0 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 7b 20 63  DbConnection { c
1b3e0 6f 6e 6e 65 63 74 69 6f 6e 20 7b 76 61 72 4e 61  onnection {varNa
1b3f0 6d 65 20 64 62 7d 20 7d 20 7b 0d 0a 20 20 20 20  me db} } {..    
1b400 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1b410 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68 65 20  E: Refer to the 
1b420 73 70 65 63 69 66 69 65 64 20 76 61 72 69 61 62  specified variab
1b430 6c 65 20 28 65 2e 67 2e 20 22 64 62 22 29 20 69  le (e.g. "db") i
1b440 6e 20 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  n the context of
1b450 20 6f 75 72 0d 0a 20 20 20 20 20 20 23 20 20 20   our..      #   
1b460 20 20 20 20 63 61 6c 6c 65 72 2e 0d 0a 20 20 20      caller...   
1b470 20 20 20 23 0d 0a 20 20 20 20 20 20 75 70 76 61     #..      upva
1b480 72 20 31 20 24 76 61 72 4e 61 6d 65 20 64 62 0d  r 1 $varName db.
1b490 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1b4a0 20 20 23 20 4e 4f 54 45 3a 20 43 72 65 61 74 65    # NOTE: Create
1b4b0 20 61 20 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   a correctly for
1b4c0 6d 61 74 74 65 64 20 6e 61 6d 65 20 66 6f 72 20  matted name for 
1b4d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1b4e0 6e 65 63 74 69 6f 6e 20 74 6f 0d 0a 20 20 20 20  nection to..    
1b4f0 20 20 23 20 20 20 20 20 20 20 62 65 20 61 64 64    #       be add
1b500 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6d  ed to the list m
1b510 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 45 61  anaged by the Ea
1b520 67 6c 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  gle interpreter.
1b530 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1b540 20 73 65 74 20 64 62 20 5b 6f 62 6a 65 63 74 20   set db [object 
1b550 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
1b560 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20  onPublic \..    
1b570 20 20 20 20 20 20 45 61 67 6c 65 2e 5f 43 6f 6d        Eagle._Com
1b580 70 6f 6e 65 6e 74 73 2e 50 72 69 76 61 74 65 2e  ponents.Private.
1b590 46 6f 72 6d 61 74 4f 70 73 20 44 61 74 61 62 61  FormatOps Databa
1b5a0 73 65 4f 62 6a 65 63 74 4e 61 6d 65 20 24 63 6f  seObjectName $co
1b5b0 6e 6e 65 63 74 69 6f 6e 20 5c 0d 0a 20 20 20 20  nnection \..    
1b5c0 20 20 20 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e        SQLiteConn
1b5d0 65 63 74 69 6f 6e 20 5b 6f 62 6a 65 63 74 20 69  ection [object i
1b5e0 6e 76 6f 6b 65 20 49 6e 74 65 72 70 72 65 74 65  nvoke Interprete
1b5f0 72 2e 47 65 74 41 63 74 69 76 65 20 4e 65 78 74  r.GetActive Next
1b600 49 64 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  Id]]....      #.
1b610 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 41  .      # NOTE: A
1b620 64 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  dd the database 
1b630 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 76 69  connection provi
1b640 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
1b650 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0d 0a 20  r to the list.. 
1b660 20 20 20 20 20 23 20 20 20 20 20 20 20 6f 66 20       #       of 
1b670 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f 20 74  those known to t
1b680 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72 70 72  he Eagle interpr
1b690 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  eter...      #..
1b6a0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76        object inv
1b6b0 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50  oke -flags +NonP
1b6c0 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65 74 65  ublic Interprete
1b6d0 72 2e 47 65 74 41 63 74 69 76 65 2e 63 6f 6e 6e  r.GetActive.conn
1b6e0 65 63 74 69 6f 6e 73 20 41 64 64 20 5c 0d 0a 20  ections Add \.. 
1b6f0 20 20 20 20 20 20 20 20 20 24 64 62 20 24 63 6f           $db $co
1b700 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 7d 0d  nnection..    }.
1b710 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65 6d  ....    proc rem
1b720 6f 76 65 44 62 54 72 61 6e 73 61 63 74 69 6f 6e  oveDbTransaction
1b730 20 7b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7d   { transaction }
1b740 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1b750 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 6d 6f 76     # NOTE: Remov
1b760 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1b770 72 61 6e 73 61 63 74 69 6f 6e 20 70 72 6f 76 69  ransaction provi
1b780 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
1b790 72 20 66 72 6f 6d 20 74 68 65 0d 0a 20 20 20 20  r from the..    
1b7a0 20 20 23 20 20 20 20 20 20 20 6c 69 73 74 20 6f    #       list o
1b7b0 66 20 74 68 6f 73 65 20 6b 6e 6f 77 6e 20 74 6f  f those known to
1b7c0 20 74 68 65 20 45 61 67 6c 65 20 69 6e 74 65 72   the Eagle inter
1b7d0 70 72 65 74 65 72 2e 0d 0a 20 20 20 20 20 20 23  preter...      #
1b7e0 0d 0a 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69  ..      object i
1b7f0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
1b800 6e 50 75 62 6c 69 63 20 49 6e 74 65 72 70 72 65  nPublic Interpre
1b810 74 65 72 2e 47 65 74 41 63 74 69 76 65 2e 74 72  ter.GetActive.tr
1b820 61 6e 73 61 63 74 69 6f 6e 73 20 5c 0d 0a 20 20  ansactions \..  
1b830 20 20 20 20 20 20 20 20 52 65 6d 6f 76 65 20 24          Remove $
1b840 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20  transaction..   
1b850 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1b860 67 65 74 52 6f 77 73 46 72 6f 6d 44 61 74 61 54  getRowsFromDataT
1b870 61 62 6c 65 20 7b 20 64 61 74 61 54 61 62 6c 65  able { dataTable
1b880 20 7b 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b 20   {valueCallback 
1b890 22 22 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 73  ""} } {..      s
1b8a0 65 74 20 72 6f 77 73 20 5b 6c 69 73 74 5d 0d 0a  et rows [list]..
1b8b0 20 20 20 20 20 20 73 65 74 20 63 6f 75 6e 74 20        set count 
1b8c0 5b 24 64 61 74 61 54 61 62 6c 65 20 43 6f 6c 75  [$dataTable Colu
1b8d0 6d 6e 73 2e 43 6f 75 6e 74 5d 0d 0a 0d 0a 20 20  mns.Count]....  
1b8e0 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 6e 64      for {set ind
1b8f0 65 78 20 30 7d 20 7b 24 69 6e 64 65 78 20 3c 20  ex 0} {$index < 
1b900 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20 69 6e  $count} {incr in
1b910 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20 20 20  dex} {..        
1b920 73 65 74 20 64 61 74 61 43 6f 6c 75 6d 6e 20 5b  set dataColumn [
1b930 24 64 61 74 61 54 61 62 6c 65 20 2d 61 6c 69 61  $dataTable -alia
1b940 73 20 43 6f 6c 75 6d 6e 73 2e 67 65 74 5f 49 74  s Columns.get_It
1b950 65 6d 20 24 69 6e 64 65 78 5d 0d 0a 20 20 20 20  em $index]..    
1b960 20 20 20 20 73 65 74 20 6e 61 6d 65 73 28 24 69      set names($i
1b970 6e 64 65 78 29 20 5b 24 64 61 74 61 43 6f 6c 75  ndex) [$dataColu
1b980 6d 6e 20 43 6f 6c 75 6d 6e 4e 61 6d 65 5d 0d 0a  mn ColumnName]..
1b990 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b9a0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1b9b0 3a 20 53 65 74 75 70 20 73 6f 6d 65 20 54 63 6c  : Setup some Tcl
1b9c0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 63 6f 6e   return code con
1b9d0 73 74 61 6e 74 73 2e 0d 0a 20 20 20 20 20 20 23  stants...      #
1b9e0 0d 0a 20 20 20 20 20 20 73 65 74 20 4f 6b 20 30  ..      set Ok 0
1b9f0 3b 20 73 65 74 20 45 72 72 6f 72 20 31 3b 20 73  ; set Error 1; s
1ba00 65 74 20 52 65 74 75 72 6e 20 32 3b 20 73 65 74  et Return 2; set
1ba10 20 42 72 65 61 6b 20 33 3b 20 73 65 74 20 43 6f   Break 3; set Co
1ba20 6e 74 69 6e 75 65 20 34 0d 0a 0d 0a 20 20 20 20  ntinue 4....    
1ba30 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
1ba40 20 2d 61 6c 69 61 73 20 64 61 74 61 52 6f 77 20   -alias dataRow 
1ba50 5b 73 65 74 20 64 61 74 61 52 6f 77 73 20 5b 24  [set dataRows [$
1ba60 64 61 74 61 54 61 62 6c 65 20 52 6f 77 73 5d 5d  dataTable Rows]]
1ba70 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1ba80 72 6f 77 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20  row [list]....  
1ba90 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69        for {set i
1baa0 6e 64 65 78 20 30 7d 20 7b 24 69 6e 64 65 78 20  ndex 0} {$index 
1bab0 3c 20 24 63 6f 75 6e 74 7d 20 7b 69 6e 63 72 20  < $count} {incr 
1bac0 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20 20 20 20  index} {..      
1bad0 20 20 20 20 73 65 74 20 76 61 6c 75 65 20 5b 24      set value [$
1bae0 64 61 74 61 52 6f 77 20 2d 63 72 65 61 74 65 20  dataRow -create 
1baf0 2d 61 6c 69 61 73 20 67 65 74 5f 49 74 65 6d 20  -alias get_Item 
1bb00 24 69 6e 64 65 78 5d 0d 0a 0d 0a 20 20 20 20 20  $index]....     
1bb10 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1bb20 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65 43 61   length $valueCa
1bb30 6c 6c 62 61 63 6b 5d 20 3e 20 30 7d 20 74 68 65  llback] > 0} the
1bb40 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bb50 20 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68   set code [catch
1bb60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1bb70 20 20 24 76 61 6c 75 65 43 61 6c 6c 62 61 63 6b    $valueCallback
1bb80 20 24 64 61 74 61 54 61 62 6c 65 20 24 64 61 74   $dataTable $dat
1bb90 61 52 6f 77 20 24 69 6e 64 65 78 20 24 76 61 6c  aRow $index $val
1bba0 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
1bbb0 7d 20 6e 65 77 56 61 6c 75 65 5d 0d 0a 0d 0a 20  } newValue].... 
1bbc0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
1bbd0 63 6f 64 65 20 3d 3d 20 24 4f 6b 7d 20 74 68 65  code == $Ok} the
1bbe0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bbf0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bc00 20 20 20 20 23 20 4e 4f 54 45 3a 20 55 73 65 20      # NOTE: Use 
1bc10 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28 6e  the specified (n
1bc20 65 77 3f 29 20 72 6f 77 20 76 61 6c 75 65 2e 0d  ew?) row value..
1bc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bc40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bc50 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73  lappend row [lis
1bc60 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  t $names($index)
1bc70 20 24 6e 65 77 56 61 6c 75 65 5d 0d 0a 20 20 20   $newValue]..   
1bc80 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
1bc90 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 45 72 72  f {$code == $Err
1bca0 6f 72 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  or} then {..    
1bcb0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1bcc0 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
1bcd0 45 3a 20 55 73 65 20 74 68 65 20 28 6e 65 77 3f  E: Use the (new?
1bce0 29 20 4e 55 4c 4c 20 72 6f 77 20 76 61 6c 75 65  ) NULL row value
1bcf0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1bd00 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1bd10 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c    lappend row [l
1bd20 69 73 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65  ist $names($inde
1bd30 78 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x)]..           
1bd40 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f 64 65   } elseif {$code
1bd50 20 3d 3d 20 24 52 65 74 75 72 6e 7d 20 74 68 65   == $Return} the
1bd60 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1bd70 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1bd80 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
1bd90 20 72 65 6d 61 69 6e 69 6e 67 20 76 61 6c 75 65   remaining value
1bda0 73 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 0d  s for this row..
1bdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bdc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1bdd0 62 72 65 61 6b 0d 0a 20 20 20 20 20 20 20 20 20  break..         
1bde0 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 6f     } elseif {$co
1bdf0 64 65 20 3d 3d 20 24 42 72 65 61 6b 7d 20 74 68  de == $Break} th
1be00 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1be10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1be20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69       # NOTE: Ski
1be30 70 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 69  p processing thi
1be40 73 20 72 6f 77 20 76 61 6c 75 65 2e 0d 0a 20 20  s row value...  
1be50 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1be60 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
1be70 65 69 66 20 7b 24 63 6f 64 65 20 3d 3d 20 24 43  eif {$code == $C
1be80 6f 6e 74 69 6e 75 65 7d 20 74 68 65 6e 20 7b 0d  ontinue} then {.
1be90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
1bea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1beb0 23 20 4e 4f 54 45 3a 20 55 73 65 20 64 65 66 61  # NOTE: Use defa
1bec0 75 6c 74 20 72 6f 77 20 76 61 6c 75 65 20 68 61  ult row value ha
1bed0 6e 64 6c 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20  ndling...       
1bee0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1bef0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1bf00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1bf10 20 20 20 20 20 20 20 20 20 73 65 74 20 63 6f 64           set cod
1bf20 65 20 24 43 6f 6e 74 69 6e 75 65 0d 0a 20 20 20  e $Continue..   
1bf30 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1bf40 20 20 20 20 20 20 69 66 20 7b 24 63 6f 64 65 20        if {$code 
1bf50 3d 3d 20 24 43 6f 6e 74 69 6e 75 65 7d 20 74 68  == $Continue} th
1bf60 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1bf70 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
1bf80 6e 67 74 68 20 24 76 61 6c 75 65 5d 20 3e 20 30  ngth $value] > 0
1bf90 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   && \..         
1bfa0 20 20 20 20 20 20 20 21 5b 6f 62 6a 65 63 74 20         ![object 
1bfb0 69 6e 76 6f 6b 65 20 43 6f 6e 76 65 72 74 20 49  invoke Convert I
1bfc0 73 44 42 4e 75 6c 6c 20 24 76 61 6c 75 65 5d 7d  sDBNull $value]}
1bfd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1bfe0 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72         lappend r
1bff0 6f 77 20 5b 6c 69 73 74 20 24 6e 61 6d 65 73 28  ow [list $names(
1c000 24 69 6e 64 65 78 29 20 5b 24 76 61 6c 75 65 20  $index) [$value 
1c010 54 6f 53 74 72 69 6e 67 5d 5d 0d 0a 20 20 20 20  ToString]]..    
1c020 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1c030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c040 6c 61 70 70 65 6e 64 20 72 6f 77 20 5b 6c 69 73  lappend row [lis
1c050 74 20 24 6e 61 6d 65 73 28 24 69 6e 64 65 78 29  t $names($index)
1c060 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ]..            }
1c070 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1c080 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1c090 20 20 20 20 6c 61 70 70 65 6e 64 20 72 6f 77 73      lappend rows
1c0a0 20 24 72 6f 77 0d 0a 20 20 20 20 20 20 7d 0d 0a   $row..      }..
1c0b0 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 24  ..      return $
1c0c0 72 6f 77 73 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a  rows..    }.....
1c0d0 20 20 20 20 70 72 6f 63 20 64 75 6d 70 52 6f 77      proc dumpRow
1c0e0 73 46 72 6f 6d 44 61 74 61 54 61 62 6c 65 20 7b  sFromDataTable {
1c0f0 20 63 68 61 6e 6e 65 6c 20 72 6f 77 73 20 7d 20   channel rows } 
1c100 7b 0d 0a 20 20 20 20 20 20 73 65 74 20 73 65 71  {..      set seq
1c110 75 65 6e 63 65 20 31 0d 0a 0d 0a 20 20 20 20 20  uence 1....     
1c120 20 66 6f 72 65 61 63 68 20 72 6f 77 20 24 72 6f   foreach row $ro
1c130 77 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70  ws {..        tp
1c140 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
1c150 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1c160 20 20 20 20 20 20 20 20 5b 65 78 70 72 20 7b 24          [expr {$
1c170 73 65 71 75 65 6e 63 65 20 3e 20 31 20 3f 20 22  sequence > 1 ? "
1c180 5c 6e 22 20 3a 20 22 22 7d 5d 20 22 2d 2d 2d 2d  \n" : ""}] "----
1c190 20 52 4f 57 20 23 22 20 24 73 65 71 75 65 6e 63   ROW #" $sequenc
1c1a0 65 20 3a 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e :\n]....      
1c1b0 20 20 66 6f 72 65 61 63 68 20 70 61 69 72 20 24    foreach pair $
1c1c0 72 6f 77 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  row {..         
1c1d0 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70   if {[llength $p
1c1e0 61 69 72 5d 20 3e 3d 20 32 7d 20 74 68 65 6e 20  air] >= 2} then 
1c1f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
1c200 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
1c210 70 70 65 6e 64 41 72 67 73 20 5c 74 20 5c 0d 0a  ppendArgs \t \..
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 5b 6c 69 73 74 20 5b 6c 69 6e 64 65 78 20 24 70  [list [lindex $p
1c240 61 69 72 20 30 5d 5d 20 22 3a 20 22 20 5b 6c 69  air 0]] ": " [li
1c250 73 74 20 5b 6c 69 6e 64 65 78 20 24 70 61 69 72  st [lindex $pair
1c260 20 31 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20   1]] \n]..      
1c270 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c      } elseif {[l
1c280 6c 65 6e 67 74 68 20 24 70 61 69 72 5d 20 3d 3d  length $pair] ==
1c290 20 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   1} then {..    
1c2a0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
1c2b0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1c2c0 67 73 20 5c 74 20 5c 0d 0a 20 20 20 20 20 20 20  gs \t \..       
1c2d0 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20 5b           [list [
1c2e0 6c 69 6e 64 65 78 20 24 70 61 69 72 20 30 5d 5d  lindex $pair 0]]
1c2f0 20 22 3a 20 3c 6e 75 6c 6c 3e 5c 6e 22 5d 0d 0a   ": <null>\n"]..
1c300 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1c310 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c320 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c  tputs $channel \
1c330 74 3c 65 6d 70 74 79 3e 5c 6e 3b 20 23 20 4e 4f  t<empty>\n; # NO
1c340 54 45 3a 20 4e 6f 20 64 61 74 61 3f 0d 0a 20 20  TE: No data?..  
1c350 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1c360 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1c370 69 6e 63 72 20 73 65 71 75 65 6e 63 65 0d 0a 20  incr sequence.. 
1c380 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1c390 0d 0a 20 20 20 20 70 72 6f 63 20 63 6c 65 61 6e  ..    proc clean
1c3a0 75 70 44 62 20 7b 20 66 69 6c 65 4e 61 6d 65 20  upDb { fileName 
1c3b0 7b 76 61 72 4e 61 6d 65 20 64 62 7d 20 7b 63 6f  {varName db} {co
1c3c0 6c 6c 65 63 74 20 74 72 75 65 7d 20 7b 71 75 61  llect true} {qua
1c3d0 6c 69 66 79 20 74 72 75 65 7d 0d 0a 20 20 20 20  lify true}..    
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 7b 64 65 6c 65 74 65 20 74 72 75 65 7d 20 7d   {delete true} }
1c400 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20   {..      #..   
1c410 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
1c420 70 74 20 74 6f 20 66 6f 72 63 65 20 61 6c 6c 20  pt to force all 
1c430 70 65 6e 64 69 6e 67 20 22 67 61 72 62 61 67 65  pending "garbage
1c440 22 20 6f 62 6a 65 63 74 73 20 74 6f 20 62 65 20  " objects to be 
1c450 63 6f 6c 6c 65 63 74 65 64 2c 0d 0a 20 20 20 20  collected,..    
1c460 20 20 23 20 20 20 20 20 20 20 69 6e 63 6c 75 64    #       includ
1c470 69 6e 67 20 53 51 4c 69 74 65 20 73 74 61 74 65  ing SQLite state
1c480 6d 65 6e 74 73 20 61 6e 64 20 62 61 63 6b 75 70  ments and backup
1c490 20 6f 62 6a 65 63 74 73 3b 20 74 68 69 73 20 73   objects; this s
1c4a0 68 6f 75 6c 64 20 61 6c 6c 6f 77 0d 0a 20 20 20  hould allow..   
1c4b0 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 75     #       the u
1c4c0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1c4d0 73 65 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65  se file to be de
1c4e0 6c 65 74 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d  leted...      #.
1c4f0 0a 20 20 20 20 20 20 69 66 20 7b 24 63 6f 6c 6c  .      if {$coll
1c500 65 63 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ect} then {..   
1c510 20 20 20 20 20 63 6f 6c 6c 65 63 74 47 61 72 62       collectGarb
1c520 61 67 65 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  age $::test_chan
1c530 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  nel..      }....
1c540 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23        #..      #
1c550 20 4e 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20   NOTE: Refer to 
1c560 74 68 65 20 73 70 65 63 69 66 69 65 64 20 76 61  the specified va
1c570 72 69 61 62 6c 65 20 28 65 2e 67 2e 20 22 64 62  riable (e.g. "db
1c580 22 29 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 78  ") in the contex
1c590 74 20 6f 66 20 6f 75 72 0d 0a 20 20 20 20 20 20  t of our..      
1c5a0 23 20 20 20 20 20 20 20 63 61 6c 6c 65 72 2e 20  #       caller. 
1c5b0 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 74   The handle to t
1c5c0 68 65 20 64 61 74 61 62 61 73 65 20 70 72 65 76  he database prev
1c5d0 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 76 69  iously opened vi
1c5e0 61 20 74 68 65 0d 0a 20 20 20 20 20 20 23 20 20  a the..      #  
1c5f0 20 20 20 20 20 5b 73 65 74 75 70 44 62 5d 20 70       [setupDb] p
1c600 72 6f 63 65 64 75 72 65 20 73 68 6f 75 6c 64 20  rocedure should 
1c610 62 65 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e  be stored there.
1c620 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
1c630 20 75 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d   upvar 1 $varNam
1c640 65 20 64 62 0d 0a 0d 0a 20 20 20 20 20 20 23 0d  e db....      #.
1c650 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
1c660 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  lose the connect
1c670 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
1c680 61 73 65 20 6e 6f 77 2e 20 20 54 68 69 73 20 73  ase now.  This s
1c690 68 6f 75 6c 64 20 61 6c 6c 6f 77 20 75 73 0d 0a  hould allow us..
1c6a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f        #       to
1c6b0 20 64 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   delete the unde
1c6c0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
1c6d0 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  file...      #..
1c6e0 20 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20        if {[info 
1c6f0 65 78 69 73 74 73 20 64 62 5d 20 26 26 20 5b 63  exists db] && [c
1c700 61 74 63 68 20 7b 73 71 6c 20 63 6c 6f 73 65 20  atch {sql close 
1c710 24 64 62 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65  $db} error]} the
1c720 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
1c730 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1c740 57 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65  We somehow faile
1c750 64 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 64  d to close the d
1c760 61 74 61 62 61 73 65 2c 20 72 65 70 6f 72 74 20  atabase, report 
1c770 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  why...        #.
1c780 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
1c790 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1c7a0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1c7b0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1c7c0 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20  WARNING: failed 
1c7d0 74 6f 20 63 6c 6f 73 65 20 64 61 74 61 62 61 73  to close databas
1c7e0 65 20 5c 22 22 20 24 64 62 20 22 5c 22 2c 20 65  e \"" $db "\", e
1c7f0 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20  rror: " \..     
1c800 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72 72         \n\t $err
1c810 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d  or \n]..      }.
1c820 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  ...      #..    
1c830 20 20 23 20 4e 4f 54 45 3a 20 46 69 72 73 74 2c    # NOTE: First,
1c840 20 73 65 65 20 69 66 20 6f 75 72 20 63 61 6c 6c   see if our call
1c850 65 72 20 68 61 73 20 72 65 71 75 65 73 74 65 64  er has requested
1c860 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1c870 74 61 62 61 73 65 2e 0d 0a 20 20 20 20 20 20 23  tabase...      #
1c880 0d 0a 20 20 20 20 20 20 73 65 74 20 69 73 4d 65  ..      set isMe
1c890 6d 6f 72 79 20 5b 69 73 4d 65 6d 6f 72 79 44 62  mory [isMemoryDb
1c8a0 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d 0a 20   $fileName].... 
1c8b0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
1c8c0 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65 20  NOTE: Build the 
1c8d0 66 75 6c 6c 20 70 61 74 68 20 74 6f 20 74 68 65  full path to the
1c8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
1c8f0 61 6d 65 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 61  ame.  For now, a
1c900 6c 6c 20 74 65 73 74 0d 0a 20 20 20 20 20 20 23  ll test..      #
1c910 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1c920 66 69 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64  files are stored
1c930 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
1c940 79 20 64 69 72 65 63 74 6f 72 79 2e 0d 0a 20 20  y directory...  
1c950 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
1c960 7b 21 24 69 73 4d 65 6d 6f 72 79 20 26 26 20 24  {!$isMemory && $
1c970 71 75 61 6c 69 66 79 7d 20 74 68 65 6e 20 7b 0d  qualify} then {.
1c980 0a 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c  .        set fil
1c990 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  eName [file join
1c9a0 20 5b 67 65 74 44 61 74 61 62 61 73 65 44 69 72   [getDatabaseDir
1c9b0 65 63 74 6f 72 79 5d 20 5b 66 69 6c 65 20 74 61  ectory] [file ta
1c9c0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 5d 0d 0a  il $fileName]]..
1c9d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1c9e0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1c9f0 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 66  : Check if the f
1ca00 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
1ca10 3b 20 69 6e 69 74 69 61 6c 6c 79 2c 20 61 73 73  ; initially, ass
1ca20 75 6d 65 20 61 6c 6c 20 66 69 6c 65 73 20 77 69  ume all files wi
1ca30 6c 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ll..      #     
1ca40 20 20 62 65 20 64 65 6c 65 74 65 64 20 73 75 63    be deleted suc
1ca50 63 65 73 73 66 75 6c 6c 79 2c 20 69 66 20 6e 65  cessfully, if ne
1ca60 63 65 73 73 61 72 79 2e 0d 0a 20 20 20 20 20 20  cessary...      
1ca70 23 0d 0a 20 20 20 20 20 20 73 65 74 20 73 75 63  #..      set suc
1ca80 63 65 73 73 20 74 72 75 65 0d 0a 0d 0a 20 20 20  cess true....   
1ca90 20 20 20 69 66 20 7b 21 24 69 73 4d 65 6d 6f 72     if {!$isMemor
1caa0 79 20 26 26 20 24 64 65 6c 65 74 65 20 26 26 20  y && $delete && 
1cab0 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 69  [file exists $fi
1cac0 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d  leName]} then {.
1cad0 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
1cae0 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
1caf0 20 64 65 6c 65 74 69 6e 67 20 64 61 74 61 62 61   deleting databa
1cb00 73 65 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65  se files if some
1cb10 62 6f 64 79 20 73 65 74 73 20 74 68 65 20 67 6c  body sets the gl
1cb20 6f 62 61 6c 0d 0a 20 20 20 20 20 20 20 20 23 20  obal..        # 
1cb30 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 74        variable t
1cb40 6f 20 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20  o prevent it... 
1cb50 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1cb60 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
1cb70 73 74 73 20 3a 3a 6e 6f 28 63 6c 65 61 6e 75 70  sts ::no(cleanup
1cb80 44 62 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  DbFiles)]} then 
1cb90 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
1cba0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1cbb0 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c  : Attempt to del
1cbc0 65 74 65 20 74 68 65 20 74 65 73 74 20 57 41 4c  ete the test WAL
1cbd0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c 20 6e   file, if any, n
1cbe0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  ow...          #
1cbf0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
1cc00 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5b 61 70 70  walFileName [app
1cc10 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e 61 6d  endArgs $fileNam
1cc20 65 20 2d 77 61 6c 5d 0d 0a 0d 0a 20 20 20 20 20  e -wal]....     
1cc30 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65       if {[file e
1cc40 78 69 73 74 73 20 24 77 61 6c 46 69 6c 65 4e 61  xists $walFileNa
1cc50 6d 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  me]} then {..   
1cc60 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1cc70 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1cc80 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
1cc90 4c 20 66 69 6c 65 2c 20 69 74 20 73 68 6f 75 6c  L file, it shoul
1cca0 64 20 62 65 20 7a 65 72 6f 20 62 79 74 65 73 20  d be zero bytes 
1ccb0 61 74 20 74 68 69 73 0d 0a 20 20 20 20 20 20 20  at this..       
1ccc0 20 20 20 20 20 23 20 20 20 20 20 20 20 70 6f 69       #       poi
1ccd0 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt...           
1cce0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
1ccf0 69 66 20 7b 5b 73 65 74 20 73 69 7a 65 20 5b 66  if {[set size [f
1cd00 69 6c 65 20 73 69 7a 65 20 24 77 61 6c 46 69 6c  ile size $walFil
1cd10 65 4e 61 6d 65 5d 5d 20 3d 3d 20 30 7d 20 74 68  eName]] == 0} th
1cd20 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1cd30 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1cd40 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20       # NOTE: We 
1cd50 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74  somehow failed t
1cd60 6f 20 64 65 6c 65 74 65 20 74 68 65 20 57 41 4c  o delete the WAL
1cd70 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20 77 68   file, report wh
1cd80 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y...            
1cd90 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1cda0 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 66     if {[catch {f
1cdb0 69 6c 65 20 64 65 6c 65 74 65 20 24 77 61 6c 46  ile delete $walF
1cdc0 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d  ileName} error]}
1cdd0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1cde0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
1cdf0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
1ce00 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1ce30 20 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74   failed to delet
1ce40 65 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20 24  e WAL file \"" $
1ce50 77 61 6c 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  walFileName \.. 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1ce80 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1ce90 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1cea0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1ceb0 20 20 20 73 65 74 20 73 75 63 63 65 73 73 20 66     set success f
1cec0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  alse..          
1ced0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1cee0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
1cef0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
1cf00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1cf10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
1cf40 20 57 41 4c 20 66 69 6c 65 20 5c 22 22 20 24 77   WAL file \"" $w
1cf50 61 6c 46 69 6c 65 4e 61 6d 65 20 22 5c 22 20 69  alFileName "\" i
1cf60 73 20 22 20 24 73 69 7a 65 20 5c 0d 0a 20 20 20  s " $size \..   
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cf80 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
1cf90 73 6b 69 70 70 69 6e 67 20 61 6c 6c 20 66 69 6c  skipping all fil
1cfa0 65 20 64 65 6c 65 74 69 6f 6e 73 2e 2e 2e 5c 6e  e deletions...\n
1cfb0 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  "]....          
1cfc0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 23 20      return 1; # 
1cfd0 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
1cfe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1cff0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  }....          #
1d000 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
1d010 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 64  TE: Attempt to d
1d020 65 6c 65 74 65 20 74 68 65 20 74 65 73 74 20 53  elete the test S
1d030 48 4d 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c  HM file, if any,
1d040 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20   now...         
1d050 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   #..          se
1d060 74 20 73 68 6d 46 69 6c 65 4e 61 6d 65 20 5b 61  t shmFileName [a
1d070 70 70 65 6e 64 41 72 67 73 20 24 66 69 6c 65 4e  ppendArgs $fileN
1d080 61 6d 65 20 2d 73 68 6d 5d 0d 0a 0d 0a 20 20 20  ame -shm]....   
1d090 20 20 20 20 20 20 20 69 66 20 7b 5b 66 69 6c 65         if {[file
1d0a0 20 65 78 69 73 74 73 20 24 73 68 6d 46 69 6c 65   exists $shmFile
1d0b0 4e 61 6d 65 5d 20 26 26 20 5c 0d 0a 20 20 20 20  Name] && \..    
1d0c0 20 20 20 20 20 20 20 20 20 20 5b 63 61 74 63 68            [catch
1d0d0 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 73   {file delete $s
1d0e0 68 6d 46 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f  hmFileName} erro
1d0f0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
1d100 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1d110 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 57         # NOTE: W
1d120 65 20 73 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64  e somehow failed
1d130 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 53   to delete the S
1d140 48 4d 20 66 69 6c 65 2c 20 72 65 70 6f 72 74 20  HM file, report 
1d150 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  why...          
1d160 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20    #..           
1d170 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1d180 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1d190 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1d1a0 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1d1b0 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 64  ING: failed to d
1d1c0 65 6c 65 74 65 20 53 48 4d 20 66 69 6c 65 20 5c  elete SHM file \
1d1d0 22 22 20 24 73 68 6d 46 69 6c 65 4e 61 6d 65 20  "" $shmFileName 
1d1e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1d1f0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1d200 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1d210 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1d220 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ...            s
1d230 65 74 20 73 75 63 63 65 73 73 20 66 61 6c 73 65  et success false
1d240 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
1d250 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
1d260 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
1d270 41 74 74 65 6d 70 74 20 74 6f 20 64 65 6c 65 74  Attempt to delet
1d280 65 20 74 68 65 20 74 65 73 74 20 64 61 74 61 62  e the test datab
1d290 61 73 65 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20  ase file now... 
1d2a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1d2b0 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
1d2c0 20 7b 66 69 6c 65 20 64 65 6c 65 74 65 20 24 66   {file delete $f
1d2d0 69 6c 65 4e 61 6d 65 7d 20 65 72 72 6f 72 5d 7d  ileName} error]}
1d2e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d2f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1d300 20 20 20 20 23 20 4e 4f 54 45 3a 20 57 65 20 73      # NOTE: We s
1d310 6f 6d 65 68 6f 77 20 66 61 69 6c 65 64 20 74 6f  omehow failed to
1d320 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
1d330 2c 20 72 65 70 6f 72 74 20 77 68 79 2e 0d 0a 20  , report why... 
1d340 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1d350 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
1d360 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
1d370 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1d390 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
1d3a0 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65 20 64  iled to delete d
1d3b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22  atabase file \""
1d3c0 20 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20   $fileName \..  
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 5c                "\
1d3e0 22 20 64 75 72 69 6e 67 20 63 6c 65 61 6e 75 70  " during cleanup
1d3f0 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  , error: " \n\t 
1d400 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 0d 0a 20 20  $error \n]....  
1d410 20 20 20 20 20 20 20 20 20 20 73 65 74 20 73 75            set su
1d420 63 63 65 73 73 20 66 61 6c 73 65 0d 0a 20 20 20  ccess false..   
1d430 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1d440 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1d450 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1d460 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20     # NOTE: Show 
1d470 74 68 61 74 20 77 65 20 73 6b 69 70 70 65 64 20  that we skipped 
1d480 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
1d490 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
1d4a0 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
1d4b0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
1d4c0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
1d4e0 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 73 6b 69  === WARNING: ski
1d4f0 70 70 65 64 20 64 65 6c 65 74 69 6e 67 20 64 61  pped deleting da
1d500 74 61 62 61 73 65 20 66 69 6c 65 20 5c 22 22 20  tabase file \"" 
1d510 24 66 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20 20 20  $fileName \..   
1d520 20 20 20 20 20 20 20 20 20 20 20 22 5c 22 20 64             "\" d
1d530 75 72 69 6e 67 20 63 6c 65 61 6e 75 70 5c 6e 22  uring cleanup\n"
1d540 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ]..        }..  
1d550 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72      }....      r
1d560 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 73 75  eturn [expr {$su
1d570 63 63 65 73 73 20 3f 20 30 20 3a 20 31 7d 5d 0d  ccess ? 0 : 1}].
1d580 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1d590 72 6f 63 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d  roc saveEnvironm
1d5a0 65 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e  entVariables { n
1d5b0 61 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22  ames {varName ""
1d5c0 7d 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a  } } {..      #..
1d5d0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f        # NOTE: Fo
1d5e0 72 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65  r each name, doe
1d5f0 73 20 74 68 65 20 6c 69 76 65 20 65 6e 76 69 72  s the live envir
1d600 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
1d610 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
1d620 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 73 61    #       so, sa
1d630 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  ve the value for
1d640 20 6c 61 74 65 72 3b 20 6f 74 68 65 72 77 69 73   later; otherwis
1d650 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
1d660 20 73 61 76 65 64 0d 0a 20 20 20 20 20 20 23 20   saved..      # 
1d670 20 20 20 20 20 20 76 61 6c 75 65 20 64 6f 65 73        value does
1d680 20 6e 6f 74 20 65 78 69 73 74 20 65 69 74 68 65   not exist eithe
1d690 72 2e 20 20 54 68 65 20 6c 69 76 65 20 65 6e 76  r.  The live env
1d6a0 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
1d6b0 65 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  es..      #     
1d6c0 20 20 41 52 45 20 4e 4f 54 20 63 68 61 6e 67 65    ARE NOT change
1d6d0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
1d6e0 75 72 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ure...      #.. 
1d6f0 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
1d700 20 6c 65 6e 67 74 68 20 24 76 61 72 4e 61 6d 65   length $varName
1d710 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1d720 20 20 20 20 20 20 20 20 73 65 74 20 76 61 72 4e          set varN
1d730 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  ame savedEnv..  
1d740 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 75      }....      u
1d750 70 76 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20  pvar 1 $varName 
1d760 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1d770 20 20 66 6f 72 65 61 63 68 20 6e 61 6d 65 20 24    foreach name $
1d780 6e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  names {..       
1d790 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
1d7a0 73 20 3a 3a 65 6e 76 28 24 6e 61 6d 65 29 5d 7d  s ::env($name)]}
1d7b0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1d7c0 20 20 20 73 65 74 20 73 61 76 65 64 45 6e 76 28     set savedEnv(
1d7d0 24 6e 61 6d 65 29 20 24 3a 3a 65 6e 76 28 24 6e  $name) $::env($n
1d7e0 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 20  ame)..        } 
1d7f0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1d800 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
1d810 61 69 6e 20 73 61 76 65 64 45 6e 76 28 24 6e 61  ain savedEnv($na
1d820 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  me)..        }..
1d830 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d840 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1d850 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d 63  : This is self-c
1d860 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f 20  leaning.  If no 
1d870 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  saved environmen
1d880 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77 0d  t variables now.
1d890 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65  .      #       e
1d8a0 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  xist, remove the
1d8b0 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20 23   array...      #
1d8c0 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72 72  ..      if {[arr
1d8d0 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e 76  ay size savedEnv
1d8e0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
1d8f0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
1d900 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45  ocomplain savedE
1d910 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  nv..      }..   
1d920 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1d930 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65  restoreEnvironme
1d940 6e 74 56 61 72 69 61 62 6c 65 73 20 7b 20 6e 61  ntVariables { na
1d950 6d 65 73 20 7b 76 61 72 4e 61 6d 65 20 22 22 7d  mes {varName ""}
1d960 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
1d970 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 46 6f 72       # NOTE: For
1d980 20 65 61 63 68 20 6e 61 6d 65 2c 20 64 6f 65 73   each name, does
1d990 20 74 68 65 20 73 61 76 65 64 20 65 6e 76 69 72   the saved envir
1d9a0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
1d9b0 65 78 69 73 74 3f 20 20 49 66 0d 0a 20 20 20 20  exist?  If..    
1d9c0 20 20 23 20 20 20 20 20 20 20 73 6f 2c 20 72 65    #       so, re
1d9d0 73 74 6f 72 65 20 74 68 65 20 73 61 76 65 64 20  store the saved 
1d9e0 76 61 6c 75 65 20 61 6e 64 20 75 6e 73 65 74 20  value and unset 
1d9f0 69 74 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 6d  it; otherwise, m
1da00 61 6b 65 20 73 75 72 65 0d 0a 20 20 20 20 20 20  ake sure..      
1da10 23 20 20 20 20 20 20 20 74 68 65 20 6c 69 76 65  #       the live
1da20 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72   environment var
1da30 69 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65  iable does not e
1da40 78 69 73 74 20 65 69 74 68 65 72 20 28 69 2e 65  xist either (i.e
1da50 2e 20 69 74 0d 0a 20 20 20 20 20 20 23 20 20 20  . it..      #   
1da60 20 20 20 20 77 61 73 20 6e 6f 74 20 73 65 74 20      was not set 
1da70 74 6f 20 62 65 67 69 6e 20 77 69 74 68 29 2e 20  to begin with). 
1da80 20 42 6f 74 68 20 73 61 76 65 64 20 61 6e 64 20   Both saved and 
1da90 6c 69 76 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  live environment
1daa0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1dab0 76 61 72 69 61 62 6c 65 73 20 41 52 45 20 63 68  variables ARE ch
1dac0 61 6e 67 65 64 20 62 79 20 74 68 69 73 20 70 72  anged by this pr
1dad0 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20 20 20 20  ocedure...      
1dae0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  #..      if {[st
1daf0 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 72  ring length $var
1db00 4e 61 6d 65 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  Name] == 0} then
1db10 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
1db20 76 61 72 4e 61 6d 65 20 73 61 76 65 64 45 6e 76  varName savedEnv
1db30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
1db40 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1db50 61 6d 65 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  ame savedEnv....
1db60 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61        foreach na
1db70 6d 65 20 24 6e 61 6d 65 73 20 7b 0d 0a 20 20 20  me $names {..   
1db80 20 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65       if {[info e
1db90 78 69 73 74 73 20 73 61 76 65 64 45 6e 76 28 24  xists savedEnv($
1dba0 6e 61 6d 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  name)]} then {..
1dbb0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
1dbc0 65 6e 76 28 24 6e 61 6d 65 29 20 24 73 61 76 65  env($name) $save
1dbd0 64 45 6e 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20  dEnv($name)..   
1dbe0 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f         unset -no
1dbf0 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64 45 6e  complain savedEn
1dc00 76 28 24 6e 61 6d 65 29 0d 0a 20 20 20 20 20 20  v($name)..      
1dc10 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
1dc20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
1dc30 6f 6d 70 6c 61 69 6e 20 3a 3a 65 6e 76 28 24 6e  omplain ::env($n
1dc40 61 6d 65 29 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ame)..        }.
1dc50 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1dc60 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
1dc70 45 3a 20 54 68 69 73 20 69 73 20 73 65 6c 66 2d  E: This is self-
1dc80 63 6c 65 61 6e 69 6e 67 2e 20 20 49 66 20 6e 6f  cleaning.  If no
1dc90 20 73 61 76 65 64 20 65 6e 76 69 72 6f 6e 6d 65   saved environme
1dca0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 6e 6f 77  nt variables now
1dcb0 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
1dcc0 65 78 69 73 74 2c 20 72 65 6d 6f 76 65 20 74 68  exist, remove th
1dcd0 65 20 61 72 72 61 79 2e 0d 0a 20 20 20 20 20 20  e array...      
1dce0 23 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 61 72  #..      if {[ar
1dcf0 72 61 79 20 73 69 7a 65 20 73 61 76 65 64 45 6e  ray size savedEn
1dd00 76 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  v] == 0} then {.
1dd10 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
1dd20 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
1dd30 45 6e 76 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  Env..      }..  
1dd40 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1dd50 20 73 61 76 65 45 61 67 6c 65 53 68 65 6c 6c 45   saveEagleShellE
1dd60 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d  nvironment {} {.
1dd70 0a 20 20 20 20 20 20 75 70 76 61 72 20 31 20 73  .      upvar 1 s
1dd80 61 76 65 64 45 6e 76 20 73 61 76 65 64 45 6e 76  avedEnv savedEnv
1dd90 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76 65 45 6e  ....      saveEn
1dda0 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
1ddb0 65 73 20 5b 6c 69 73 74 20 4e 6f 4d 75 74 65 78  es [list NoMutex
1ddc0 65 73 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20  es] savedEnv..  
1ddd0 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63    }.....    proc
1dde0 20 72 65 73 74 6f 72 65 45 61 67 6c 65 53 68 65   restoreEagleShe
1ddf0 6c 6c 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  llEnvironment {}
1de00 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
1de10 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
1de20 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72 65 73  Env....      res
1de30 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  toreEnvironmentV
1de40 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 4e  ariables [list N
1de50 6f 4d 75 74 65 78 65 73 5d 20 73 61 76 65 64 45  oMutexes] savedE
1de60 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  nv..    }.....  
1de70 20 20 70 72 6f 63 20 73 61 76 65 4d 64 61 43 6f    proc saveMdaCo
1de80 6e 66 69 67 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  nfigEnvironment 
1de90 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1dea0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1deb0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73  edEnv....      s
1dec0 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  aveEnvironmentVa
1ded0 72 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 43 4f  riables [list CO
1dee0 4d 50 4c 55 53 5f 4d 44 41 5d 20 73 61 76 65 64  MPLUS_MDA] saved
1def0 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  Env..    }..... 
1df00 20 20 20 70 72 6f 63 20 72 65 73 74 6f 72 65 4d     proc restoreM
1df10 64 61 43 6f 6e 66 69 67 45 6e 76 69 72 6f 6e 6d  daConfigEnvironm
1df20 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20  ent {} {..      
1df30 75 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76  upvar 1 savedEnv
1df40 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20   savedEnv....   
1df50 20 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f     restoreEnviro
1df60 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5b  nmentVariables [
1df70 6c 69 73 74 20 43 4f 4d 50 4c 55 53 5f 4d 44 41  list COMPLUS_MDA
1df80 5d 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20  ] savedEnv..    
1df90 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 73  }.....    proc s
1dfa0 61 76 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c  aveGetSettingVal
1dfb0 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 7b 7d  ueEnvironment {}
1dfc0 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20   {..      upvar 
1dfd0 31 20 73 61 76 65 64 45 6e 76 20 73 61 76 65 64  1 savedEnv saved
1dfe0 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 73 61 76  Env....      sav
1dff0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1e000 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
1e010 20 20 20 20 20 20 20 20 20 4e 6f 5f 45 78 70 61           No_Expa
1e020 6e 64 20 4e 6f 5f 53 51 4c 69 74 65 47 65 74 53  nd No_SQLiteGetS
1e030 65 74 74 69 6e 67 56 61 6c 75 65 20 4e 6f 5f 53  ettingValue No_S
1e040 51 4c 69 74 65 58 6d 6c 43 6f 6e 66 69 67 46 69  QLiteXmlConfigFi
1e050 6c 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  le] \..         
1e060 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d   savedEnv..    }
1e070 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 72 65  .....    proc re
1e080 73 74 6f 72 65 47 65 74 53 65 74 74 69 6e 67 56  storeGetSettingV
1e090 61 6c 75 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  alueEnvironment 
1e0a0 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1e0b0 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1e0c0 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
1e0d0 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1e0e0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1e0f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 4e 6f   \..          No
1e100 5f 45 78 70 61 6e 64 20 4e 6f 5f 53 51 4c 69 74  _Expand No_SQLit
1e110 65 47 65 74 53 65 74 74 69 6e 67 56 61 6c 75 65  eGetSettingValue
1e120 20 4e 6f 5f 53 51 4c 69 74 65 58 6d 6c 43 6f 6e   No_SQLiteXmlCon
1e130 66 69 67 46 69 6c 65 5d 20 5c 0d 0a 20 20 20 20  figFile] \..    
1e140 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d 0a        savedEnv..
1e150 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72      }.....    pr
1e160 6f 63 20 73 61 76 65 53 51 4c 69 74 65 43 6f 6e  oc saveSQLiteCon
1e170 6e 65 63 74 69 6f 6e 45 6e 76 69 72 6f 6e 6d 65  nectionEnvironme
1e180 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75  nt {} {..      u
1e190 70 76 61 72 20 31 20 73 61 76 65 64 45 6e 76 20  pvar 1 savedEnv 
1e1a0 73 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20  savedEnv....    
1e1b0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
1e1c0 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1e1d0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 44 65   \..          De
1e1e0 66 61 75 6c 74 46 6c 61 67 73 5f 53 51 4c 69 74  faultFlags_SQLit
1e1f0 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 4e 6f 5f 53  eConnection No_S
1e200 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 4e  QLiteConnectionN
1e210 65 77 50 61 72 73 65 72 5d 20 5c 0d 0a 20 20 20  ewParser] \..   
1e220 20 20 20 20 20 20 20 73 61 76 65 64 45 6e 76 0d         savedEnv.
1e230 0a 0d 0a 20 20 20 20 20 20 75 70 76 61 72 20 31  ...      upvar 1
1e240 20 73 61 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e   savedConnection
1e250 46 6c 61 67 73 20 73 61 76 65 64 43 6f 6e 6e 65  Flags savedConne
1e260 63 74 69 6f 6e 46 6c 61 67 73 0d 0a 0d 0a 20 20  ctionFlags....  
1e270 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
1e280 69 73 74 73 20 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ists ::connectio
1e290 6e 5f 66 6c 61 67 73 5d 7d 20 74 68 65 6e 20 7b  n_flags]} then {
1e2a0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 73 61  ..        set sa
1e2b0 76 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61  vedConnectionFla
1e2c0 67 73 20 24 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  gs $::connection
1e2d0 5f 66 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d 20  _flags..      } 
1e2e0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
1e2f0 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
1e300 6e 20 73 61 76 65 64 43 6f 6e 6e 65 63 74 69 6f  n savedConnectio
1e310 6e 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 7d 0d  nFlags..      }.
1e320 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
1e330 72 6f 63 20 72 65 73 74 6f 72 65 53 51 4c 69 74  roc restoreSQLit
1e340 65 43 6f 6e 6e 65 63 74 69 6f 6e 45 6e 76 69 72  eConnectionEnvir
1e350 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20 20  onment {} {..   
1e360 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65 64     upvar 1 saved
1e370 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d 0a  Env savedEnv....
1e380 20 20 20 20 20 20 72 65 73 74 6f 72 65 45 6e 76        restoreEnv
1e390 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
1e3a0 73 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  s [list \..     
1e3b0 20 20 20 20 20 44 65 66 61 75 6c 74 46 6c 61 67       DefaultFlag
1e3c0 73 5f 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  s_SQLiteConnecti
1e3d0 6f 6e 20 4e 6f 5f 53 51 4c 69 74 65 43 6f 6e 6e  on No_SQLiteConn
1e3e0 65 63 74 69 6f 6e 4e 65 77 50 61 72 73 65 72 5d  ectionNewParser]
1e3f0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1e400 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20  vedEnv....      
1e410 75 70 76 61 72 20 31 20 73 61 76 65 64 43 6f 6e  upvar 1 savedCon
1e420 6e 65 63 74 69 6f 6e 46 6c 61 67 73 20 73 61 76  nectionFlags sav
1e430 65 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67  edConnectionFlag
1e440 73 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  s....      if {[
1e450 69 6e 66 6f 20 65 78 69 73 74 73 20 73 61 76 65  info exists save
1e460 64 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73  dConnectionFlags
1e470 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
1e480 20 20 20 73 65 74 20 3a 3a 63 6f 6e 6e 65 63 74     set ::connect
1e490 69 6f 6e 5f 66 6c 61 67 73 20 24 73 61 76 65 64  ion_flags $saved
1e4a0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 0d  ConnectionFlags.
1e4b0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
1e4c0 6e 6f 63 6f 6d 70 6c 61 69 6e 20 73 61 76 65 64  nocomplain saved
1e4d0 43 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 0d  ConnectionFlags.
1e4e0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
1e4f0 0a 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d  .        unset -
1e500 6e 6f 63 6f 6d 70 6c 61 69 6e 20 3a 3a 63 6f 6e  nocomplain ::con
1e510 6e 65 63 74 69 6f 6e 5f 66 6c 61 67 73 0d 0a 20  nection_flags.. 
1e520 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c       }..    }...
1e530 0d 0a 20 20 20 20 70 72 6f 63 20 73 61 76 65 53  ..    proc saveS
1e540 51 4c 69 74 65 43 6f 6e 76 65 72 74 45 6e 76 69  QLiteConvertEnvi
1e550 72 6f 6e 6d 65 6e 74 20 7b 7d 20 7b 0d 0a 20 20  ronment {} {..  
1e560 20 20 20 20 75 70 76 61 72 20 31 20 73 61 76 65      upvar 1 save
1e570 64 45 6e 76 20 73 61 76 65 64 45 6e 76 0d 0a 0d  dEnv savedEnv...
1e580 0a 20 20 20 20 20 20 73 61 76 65 45 6e 76 69 72  .      saveEnvir
1e590 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20  onmentVariables 
1e5a0 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20  [list \..       
1e5b0 20 20 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e     Use_SQLiteCon
1e5c0 76 65 72 74 5f 44 65 66 61 75 6c 74 44 62 54 79  vert_DefaultDbTy
1e5d0 70 65 20 55 73 65 5f 53 51 4c 69 74 65 43 6f 6e  pe Use_SQLiteCon
1e5e0 76 65 72 74 5f 44 65 66 61 75 6c 74 54 79 70 65  vert_DefaultType
1e5f0 4e 61 6d 65 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Name] \..       
1e600 20 20 20 73 61 76 65 64 45 6e 76 0d 0a 20 20 20     savedEnv..   
1e610 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
1e620 72 65 73 74 6f 72 65 53 51 4c 69 74 65 43 6f 6e  restoreSQLiteCon
1e630 76 65 72 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 20  vertEnvironment 
1e640 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 76 61  {} {..      upva
1e650 72 20 31 20 73 61 76 65 64 45 6e 76 20 73 61 76  r 1 savedEnv sav
1e660 65 64 45 6e 76 0d 0a 0d 0a 20 20 20 20 20 20 72  edEnv....      r
1e670 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e 6d 65 6e  estoreEnvironmen
1e680 74 56 61 72 69 61 62 6c 65 73 20 5b 6c 69 73 74  tVariables [list
1e690 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 55 73   \..          Us
1e6a0 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
1e6b0 44 65 66 61 75 6c 74 44 62 54 79 70 65 20 55 73  DefaultDbType Us
1e6c0 65 5f 53 51 4c 69 74 65 43 6f 6e 76 65 72 74 5f  e_SQLiteConvert_
1e6d0 44 65 66 61 75 6c 74 54 79 70 65 4e 61 6d 65 5d  DefaultTypeName]
1e6e0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 73 61   \..          sa
1e6f0 76 65 64 45 6e 76 0d 0a 20 20 20 20 7d 0d 0a 0c  vedEnv..    }...
1e700 0d 0a 20 20 20 20 70 72 6f 63 20 73 65 74 75 70  ..    proc setup
1e710 44 62 49 6e 74 65 72 72 75 70 74 43 61 6c 6c 62  DbInterruptCallb
1e720 61 63 6b 20 7b 20 63 68 61 6e 6e 65 6c 20 6c 6f  ack { channel lo
1e730 67 20 7d 20 7b 0d 0a 20 20 20 20 20 20 74 70 75  g } {..      tpu
1e740 74 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d  ts $channel "---
1e750 2d 20 73 65 74 74 69 6e 67 20 75 70 20 64 65 62  - setting up deb
1e760 75 67 67 65 72 20 69 6e 74 65 72 72 75 70 74 20  ugger interrupt 
1e770 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20 22 0d 0a 0d  callback... "...
1e780 0a 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63  .      if {[catc
1e790 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 61 76  h {..        sav
1e7a0 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  eEnvironmentVari
1e7b0 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a 20  ables [list \.. 
1e7c0 20 20 20 20 20 20 20 20 20 20 20 71 75 69 65 74             quiet
1e7d0 46 69 6e 64 49 6e 74 65 72 70 72 65 74 65 72 54  FindInterpreterT
1e7e0 65 73 74 50 61 74 68 20 71 75 69 65 74 53 65 74  estPath quietSet
1e7f0 75 70 49 6e 74 65 72 70 72 65 74 65 72 54 65 73  upInterpreterTes
1e800 74 50 61 74 68 5d 0d 0a 0d 0a 20 20 20 20 20 20  tPath]....      
1e810 20 20 74 72 79 20 7b 0d 0a 20 20 20 20 20 20 20    try {..       
1e820 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e830 23 20 4e 4f 54 45 3a 20 50 72 65 76 65 6e 74 20  # NOTE: Prevent 
1e840 74 68 65 20 76 65 6e 64 6f 72 20 73 63 72 69 70  the vendor scrip
1e850 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 6e 6f 69  t from being noi
1e860 73 79 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  sy when creating
1e870 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
1e880 20 20 20 20 74 68 65 20 69 73 6f 6c 61 74 65 64      the isolated
1e890 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1e8a0 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1e8b0 20 20 20 20 20 20 73 65 74 20 3a 3a 65 6e 76 28        set ::env(
1e8c0 71 75 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72  quietFindInterpr
1e8d0 65 74 65 72 54 65 73 74 50 61 74 68 29 20 31 0d  eterTestPath) 1.
1e8e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a  .          set :
1e8f0 3a 65 6e 76 28 71 75 69 65 74 53 65 74 75 70 49  :env(quietSetupI
1e900 6e 74 65 72 70 72 65 74 65 72 54 65 73 74 50 61  nterpreterTestPa
1e910 74 68 29 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20  th) 1....       
1e920 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1e930 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75 72  # NOTE: Make sur
1e940 65 20 74 68 65 20 73 63 72 69 70 74 20 64 65 62  e the script deb
1e950 75 67 67 65 72 20 61 6e 64 20 74 68 65 20 69 73  ugger and the is
1e960 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
1e970 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20  er..          # 
1e980 20 20 20 20 20 20 61 72 65 20 73 65 74 75 70 20        are setup 
1e990 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75 73  and ready for us
1e9a0 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  e...          #.
1e9b0 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67  .          debug
1e9c0 20 73 65 74 75 70 20 74 72 75 65 20 74 72 75 65   setup true true
1e9d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d  ....          #.
1e9e0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
1e9f0 45 3a 20 4c 6f 61 64 20 74 68 65 20 6e 65 63 65  E: Load the nece
1ea00 73 73 61 72 79 20 70 61 63 6b 61 67 65 73 20 69  ssary packages i
1ea10 6e 74 6f 20 74 68 65 20 69 73 6f 6c 61 74 65 64  nto the isolated
1ea20 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20   interpreter... 
1ea30 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ea40 20 20 20 20 20 20 64 65 62 75 67 20 65 76 61 6c        debug eval
1ea50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ea60 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
1ea70 45 61 67 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  Eagle..         
1ea80 20 20 20 70 61 63 6b 61 67 65 20 72 65 71 75 69     package requi
1ea90 72 65 20 45 61 67 6c 65 2e 4c 69 62 72 61 72 79  re Eagle.Library
1eaa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ..            pa
1eab0 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 45 61  ckage require Ea
1eac0 67 6c 65 2e 54 65 73 74 0d 0a 20 20 20 20 20 20  gle.Test..      
1ead0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1eae0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
1eaf0 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
1eb00 20 6e 65 63 65 73 73 61 72 79 20 76 61 72 69 61   necessary varia
1eb10 62 6c 65 73 20 69 6e 74 6f 20 74 68 65 20 69 73  bles into the is
1eb20 6f 6c 61 74 65 64 20 69 6e 74 65 72 70 72 65 74  olated interpret
1eb30 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  er...          #
1eb40 0d 0a 20 20 20 20 20 20 20 20 20 20 64 65 62 75  ..          debu
1eb50 67 20 69 6e 76 6f 6b 65 20 30 20 73 65 74 20 3a  g invoke 0 set :
1eb60 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 63  :test_channel $c
1eb70 68 61 6e 6e 65 6c 3b 20 23 20 4e 4f 54 45 3a 20  hannel; # NOTE: 
1eb80 46 6f 72 20 5b 74 70 75 74 73 5d 2e 0d 0a 20 20  For [tputs]...  
1eb90 20 20 20 20 20 20 20 20 64 65 62 75 67 20 69 6e          debug in
1eba0 76 6f 6b 65 20 30 20 73 65 74 20 3a 3a 74 65 73  voke 0 set ::tes
1ebb0 74 5f 6c 6f 67 20 24 6c 6f 67 3b 20 23 20 4e 4f  t_log $log; # NO
1ebc0 54 45 3a 20 46 6f 72 20 5b 74 6c 6f 67 5d 2e 0d  TE: For [tlog]..
1ebd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1ebe0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1ebf0 3a 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 63 61  : Install the ca
1ec00 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 74 6f  llback script to
1ec10 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e   be evaluated in
1ec20 20 74 68 65 20 69 73 6f 6c 61 74 65 64 0d 0a 20   the isolated.. 
1ec30 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
1ec40 20 69 6e 74 65 72 70 72 65 74 65 72 20 77 68 65   interpreter whe
1ec50 6e 20 74 68 69 73 20 69 6e 74 65 72 70 72 65 74  n this interpret
1ec60 65 72 20 69 73 20 69 6e 74 65 72 72 75 70 74 65  er is interrupte
1ec70 64 20 62 79 20 73 63 72 69 70 74 0d 0a 20 20 20  d by script..   
1ec80 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63         #       c
1ec90 61 6e 63 65 6c 6c 61 74 69 6f 6e 2c 20 65 74 63  ancellation, etc
1eca0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
1ecb0 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 20            debug 
1ecc0 63 61 6c 6c 62 61 63 6b 20 61 70 70 6c 79 20 7b  callback apply {
1ecd0 7b 73 65 6e 64 65 72 20 65 7d 20 7b 0d 0a 20 20  {sender e} {..  
1ece0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1ecf0 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
1ed00 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 64   Check if this d
1ed10 65 62 75 67 67 65 72 20 63 61 6c 6c 62 61 63 6b  ebugger callback
1ed20 20 69 73 20 6f 6e 65 20 74 68 61 74 20 77 65 20   is one that we 
1ed30 63 61 72 65 20 61 62 6f 75 74 2e 0d 0a 20 20 20  care about...   
1ed40 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20           #..    
1ed50 20 20 20 20 20 20 20 20 73 65 74 20 69 6e 74 65          set inte
1ed60 72 72 75 70 74 54 79 70 65 73 20 5b 73 70 6c 69  rruptTypes [spli
1ed70 74 20 5b 24 65 20 49 6e 74 65 72 72 75 70 74 54  t [$e InterruptT
1ed80 79 70 65 5d 20 22 2c 20 22 5d 0d 0a 0d 0a 20 20  ype] ", "]....  
1ed90 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 22 43            if {"C
1eda0 61 6e 63 65 6c 65 64 22 20 69 6e 20 24 69 6e 74  anceled" in $int
1edb0 65 72 72 75 70 74 54 79 70 65 73 20 7c 7c 20 5c  erruptTypes || \
1edc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1edd0 20 20 22 55 6e 77 6f 75 6e 64 22 20 69 6e 20 24    "Unwound" in $
1ede0 69 6e 74 65 72 72 75 70 74 54 79 70 65 73 7d 20  interruptTypes} 
1edf0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1ee00 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
1ee10 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d         # NOTE: M
1ee20 61 6b 65 20 73 75 72 65 20 74 68 65 20 5b 6f 62  ake sure the [ob
1ee30 6a 65 63 74 5d 20 63 6f 6d 6d 61 6e 64 20 69 73  ject] command is
1ee40 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 53 69 6e   available.  Sin
1ee50 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce..            
1ee60 20 20 23 20 20 20 20 20 20 20 74 68 69 73 20 69    #       this i
1ee70 73 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 69 6e  s an isolated in
1ee80 74 65 72 70 72 65 74 65 72 2c 20 63 68 65 63 6b  terpreter, check
1ee90 20 66 6f 72 20 69 74 20 74 68 65 20 68 61 72 64   for it the hard
1eea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1eeb0 23 20 20 20 20 20 20 20 77 61 79 2e 0d 0a 20 20  #       way...  
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1eee0 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66 6f 20  {[llength [info 
1eef0 63 6f 6d 6d 61 6e 64 73 20 6f 62 6a 65 63 74 5d  commands object]
1ef00 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ef20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ef30 20 20 23 20 4e 4f 54 45 3a 20 49 74 65 72 61 74    # NOTE: Iterat
1ef40 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 64 61  e through all da
1ef50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ef60 6e 73 20 6b 6e 6f 77 6e 20 74 6f 20 74 68 65 0d  ns known to the.
1ef70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef80 20 23 20 20 20 20 20 20 20 70 61 72 65 6e 74 20   #       parent 
1ef90 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20  interpreter...  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
1efb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1efc0 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68 20   object foreach 
1efd0 2d 61 6c 69 61 73 20 70 61 69 72 20 5b 6f 62 6a  -alias pair [obj
1efe0 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67  ect invoke -flag
1eff0 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a  s +NonPublic \..
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 20 20 20 20 24 65 20 49 6e 74 65 72 70 72 65 74      $e Interpret
1f020 65 72 2e 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d 20  er.connections] 
1f030 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f040 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f050 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
1f060 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 63 61 6e  : Attempt to can
1f070 63 65 6c 20 61 6e 79 20 53 51 4c 20 71 75 65 72  cel any SQL quer
1f080 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  ies in progress 
1f090 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  on..            
1f0a0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
1f0b0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
1f0c0 65 63 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20  ection...       
1f0d0 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20             #..  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 69 66 20 7b 5b 63 61 74 63 68 20 7b 24 70 61 69  if {[catch {$pai
1f100 72 20 56 61 6c 75 65 2e 43 61 6e 63 65 6c 7d 20  r Value.Cancel} 
1f110 65 72 72 6f 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a  error]} then {..
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1f140 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1f150 64 41 72 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20  dArgs \n \..    
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e      "==== WARNIN
1f180 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6e  G: failed to can
1f190 63 65 6c 20 71 75 65 72 79 20 66 6f 72 20 22 20  cel query for " 
1f1a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f1b0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 6e             "conn
1f1c0 65 63 74 69 6f 6e 20 5c 22 22 20 5b 24 70 61 69  ection \"" [$pai
1f1d0 72 20 4b 65 79 5d 20 22 5c 22 2c 20 65 72 72 6f  r Key] "\", erro
1f1e0 72 3a 20 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20  r: " \n\t \..   
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 20 24 65 72 72 6f 72 20 5c 6e 5d 0d       $error \n].
1f210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f220 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1f230 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1f240 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d         } else {.
1f250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f260 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1f270 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1f280 67 73 20 5c 6e 20 5c 0d 0a 20 20 20 20 20 20 20  gs \n \..       
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
1f2a0 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 63 61 6e 6e  == WARNING: cann
1f2b0 6f 74 20 63 61 6e 63 65 6c 20 61 6e 79 20 71 75  ot cancel any qu
1f2c0 65 72 69 65 73 3a 20 22 20 5c 0d 0a 20 20 20 20  eries: " \..    
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 22 74 68 65 20 5c 22 6f 62 6a 65 63 74 5c 22 20  "the \"object\" 
1f2f0 63 6f 6d 6d 61 6e 64 20 69 73 20 6e 6f 74 20 61  command is not a
1f300 76 61 69 6c 61 62 6c 65 5c 6e 22 5d 0d 0a 20 20  vailable\n"]..  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1f320 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1f330 20 20 20 20 20 20 20 20 7d 7d 0d 0a 20 20 20 20          }}..    
1f340 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0d      } finally {.
1f350 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f  .          resto
1f360 72 65 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  reEnvironmentVar
1f370 69 61 62 6c 65 73 20 5b 6c 69 73 74 20 5c 0d 0a  iables [list \..
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75                qu
1f390 69 65 74 46 69 6e 64 49 6e 74 65 72 70 72 65 74  ietFindInterpret
1f3a0 65 72 54 65 73 74 50 61 74 68 20 71 75 69 65 74  erTestPath quiet
1f3b0 53 65 74 75 70 49 6e 74 65 72 70 72 65 74 65 72  SetupInterpreter
1f3c0 54 65 73 74 50 61 74 68 5d 0d 0a 20 20 20 20 20  TestPath]..     
1f3d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 72     }..      } er
1f3e0 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ror] == 0} then 
1f3f0 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
1f400 6e 73 74 72 61 69 6e 74 20 69 6e 74 65 72 72 75  nstraint interru
1f410 70 74 43 61 6c 6c 62 61 63 6b 2e 73 71 6c 69 74  ptCallback.sqlit
1f420 65 33 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70  e3....        tp
1f430 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 79 65 73  uts $channel yes
1f440 5c 6e 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  \n..      } else
1f450 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
1f460 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
1f470 6e 64 41 72 67 73 20 22 6e 6f 2c 20 65 72 72 6f  ndArgs "no, erro
1f480 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72  r: " \n\t $error
1f490 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20   \n]..      }.. 
1f4a0 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f     }.....    pro
1f4b0 63 20 63 6c 65 61 6e 75 70 46 69 6c 65 20 7b 20  c cleanupFile { 
1f4c0 66 69 6c 65 4e 61 6d 65 20 7b 63 6f 6c 6c 65 63  fileName {collec
1f4d0 74 20 74 72 75 65 7d 20 7b 66 6f 72 63 65 20 66  t true} {force f
1f4e0 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20 20 20  alse} } {..     
1f4f0 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
1f500 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f 72  : Attempt to for
1f510 63 65 20 61 6c 6c 20 70 65 6e 64 69 6e 67 20 22  ce all pending "
1f520 67 61 72 62 61 67 65 22 20 6f 62 6a 65 63 74 73  garbage" objects
1f530 20 74 6f 20 62 65 20 63 6f 6c 6c 65 63 74 65 64   to be collected
1f540 2c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  ,..      #      
1f550 20 69 6e 63 6c 75 64 69 6e 67 20 53 51 4c 69 74   including SQLit
1f560 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6e 64  e statements and
1f570 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 3b   backup objects;
1f580 20 74 68 69 73 20 73 68 6f 75 6c 64 20 61 6c 6c   this should all
1f590 6f 77 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20  ow..      #     
1f5a0 20 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67    the underlying
1f5b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1f5c0 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 0d 0a 20  o be deleted... 
1f5d0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1f5e0 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74 68 65 6e   {$collect} then
1f5f0 20 7b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6c 6c   {..        coll
1f600 65 63 74 47 61 72 62 61 67 65 20 24 3a 3a 74 65  ectGarbage $::te
1f610 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20 20 20  st_channel..    
1f620 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a    }....      #..
1f630 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68        # NOTE: Ch
1f640 65 63 6b 20 69 66 20 74 68 65 20 66 69 6c 65 20  eck if the file 
1f650 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0d 0a 20  still exists... 
1f660 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
1f670 20 7b 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24   {[file exists $
1f680 66 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20  fileName]} then 
1f690 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
1f6a0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
1f6b0 69 70 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74  ip deleting test
1f6c0 20 66 69 6c 65 73 20 69 66 20 73 6f 6d 65 62 6f   files if somebo
1f6d0 64 79 20 73 65 74 73 20 74 68 65 20 67 6c 6f 62  dy sets the glob
1f6e0 61 6c 20 76 61 72 69 61 62 6c 65 0d 0a 20 20 20  al variable..   
1f6f0 20 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20       #       to 
1f700 70 72 65 76 65 6e 74 20 69 74 2e 0d 0a 20 20 20  prevent it...   
1f710 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
1f720 69 66 20 7b 24 66 6f 72 63 65 20 7c 7c 20 21 5b  if {$force || ![
1f730 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
1f740 28 63 6c 65 61 6e 75 70 46 69 6c 65 29 5d 7d 20  (cleanupFile)]} 
1f750 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1f760 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
1f770 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74 20 74   NOTE: Attempt t
1f780 6f 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 73  o delete the tes
1f790 74 20 66 69 6c 65 20 6e 6f 77 2e 0d 0a 20 20 20  t file now...   
1f7a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
1f7b0 20 20 20 20 69 66 20 7b 5b 73 65 74 20 63 6f 64      if {[set cod
1f7c0 65 20 5b 63 61 74 63 68 20 7b 66 69 6c 65 20 64  e [catch {file d
1f7d0 65 6c 65 74 65 20 24 66 69 6c 65 4e 61 6d 65 7d  elete $fileName}
1f7e0 20 65 72 72 6f 72 5d 5d 7d 20 74 68 65 6e 20 7b   error]]} then {
1f7f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d  ..            #.
1f800 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e  .            # N
1f810 4f 54 45 3a 20 57 65 20 73 6f 6d 65 68 6f 77 20  OTE: We somehow 
1f820 66 61 69 6c 65 64 20 74 6f 20 64 65 6c 65 74 65  failed to delete
1f830 20 74 68 65 20 66 69 6c 65 2c 20 72 65 70 6f 72   the file, repor
1f840 74 20 77 68 79 2e 0d 0a 20 20 20 20 20 20 20 20  t why...        
1f850 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
1f860 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
1f870 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
1f880 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
1f890 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
1f8a0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
1f8b0 20 64 65 6c 65 74 65 20 74 65 73 74 20 66 69 6c   delete test fil
1f8c0 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d 65 20  e \"" $fileName 
1f8d0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
1f8e0 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1f8f0 65 61 6e 75 70 2c 20 65 72 72 6f 72 3a 20 22 20  eanup, error: " 
1f900 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
1f910 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
1f920 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
1f930 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
1f940 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53         # NOTE: S
1f950 68 6f 77 20 74 68 61 74 20 77 65 20 73 6b 69 70  how that we skip
1f960 70 65 64 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ped deleting the
1f970 20 66 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20   file...        
1f980 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73    #..          s
1f990 65 74 20 63 6f 64 65 20 30 0d 0a 0d 0a 20 20 20  et code 0....   
1f9a0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
1f9b0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
1f9c0 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
1f9d0 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20            "==== 
1f9e0 57 41 52 4e 49 4e 47 3a 20 73 6b 69 70 70 65 64  WARNING: skipped
1f9f0 20 64 65 6c 65 74 69 6e 67 20 74 65 73 74 20 66   deleting test f
1fa00 69 6c 65 20 5c 22 22 20 24 66 69 6c 65 4e 61 6d  ile \"" $fileNam
1fa10 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
1fa20 20 20 20 22 5c 22 20 64 75 72 69 6e 67 20 63 6c     "\" during cl
1fa30 65 61 6e 75 70 5c 6e 22 5d 0d 0a 20 20 20 20 20  eanup\n"]..     
1fa40 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c     }..      } el
1fa50 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  se {..        #.
1fa60 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
1fa70 20 54 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   The file does n
1fa80 6f 74 20 65 78 69 73 74 2c 20 73 75 63 63 65 73  ot exist, succes
1fa90 73 21 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s!..        #.. 
1faa0 20 20 20 20 20 20 20 73 65 74 20 63 6f 64 65 20         set code 
1fab0 30 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  0..      }....  
1fac0 20 20 20 20 72 65 74 75 72 6e 20 24 63 6f 64 65      return $code
1fad0 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
1fae0 70 72 6f 63 20 63 6c 65 61 6e 75 70 4d 65 6d 6f  proc cleanupMemo
1faf0 72 79 20 7b 20 76 61 72 4e 61 6d 65 20 7b 71 75  ry { varName {qu
1fb00 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
1fb10 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
1fb20 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
1fb30 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
1fb40 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67      [string leng
1fb50 74 68 20 24 76 61 72 4e 61 6d 65 5d 20 3e 20 30  th $varName] > 0
1fb60 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
1fb70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
1fb80 4f 54 45 3a 20 52 65 66 65 72 20 74 6f 20 74 68  OTE: Refer to th
1fb90 65 20 73 70 65 63 69 66 69 65 64 20 76 61 72 69  e specified vari
1fba0 61 62 6c 65 20 28 65 2e 67 2e 20 22 63 6f 6e 6e  able (e.g. "conn
1fbb0 65 63 74 69 6f 6e 22 29 20 69 6e 20 74 68 65 0d  ection") in the.
1fbc0 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
1fbd0 20 63 6f 6e 74 65 78 74 20 6f 66 20 6f 75 72 20   context of our 
1fbe0 63 61 6c 6c 65 72 2e 20 20 54 68 65 20 6f 70 61  caller.  The opa
1fbf0 71 75 65 20 6f 62 6a 65 63 74 20 68 61 6e 64 6c  que object handl
1fc00 65 20 66 6f 72 20 61 6e 0d 0a 20 20 20 20 20 20  e for an..      
1fc10 20 20 23 20 20 20 20 20 20 20 41 44 4f 2e 4e 45    #       ADO.NE
1fc20 54 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 65  T connection pre
1fc30 76 69 6f 75 73 6c 79 20 72 65 74 75 72 6e 65 64  viously returned
1fc40 20 62 79 20 5b 67 65 74 44 62 43 6f 6e 6e 65 63   by [getDbConnec
1fc50 74 69 6f 6e 5d 0d 0a 20 20 20 20 20 20 20 20 23  tion]..        #
1fc60 20 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65         should be
1fc70 20 73 74 6f 72 65 64 20 74 68 65 72 65 2e 0d 0a   stored there...
1fc80 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
1fc90 20 20 20 75 70 76 61 72 20 31 20 24 76 61 72 4e     upvar 1 $varN
1fca0 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a  ame connection..
1fcb0 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
1fcc0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
1fcd0 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
1fce0 24 63 6f 6e 6e 65 63 74 69 6f 6e 20 52 65 6c 65  $connection Rele
1fcf0 61 73 65 4d 65 6d 6f 72 79 0d 0a 20 20 20 20 20  aseMemory..     
1fd00 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74 68     } result]} th
1fd10 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1fd20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
1fd30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
1fd40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
1fd50 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
1fd60 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
1fd70 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
1fd80 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
1fd90 65 6c 65 61 73 65 20 64 61 74 61 62 61 73 65 20  elease database 
1fda0 6d 65 6d 6f 72 79 2c 20 65 72 72 6f 72 3a 20 22  memory, error: "
1fdb0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
1fdc0 20 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74      \n\t $result
1fdd0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
1fde0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  }..        }..  
1fdf0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69      }....      i
1fe00 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 69 6e 66  f {[llength [inf
1fe10 6f 20 63 6f 6d 6d 61 6e 64 73 20 64 65 62 75 67  o commands debug
1fe20 5d 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ]] > 0} then {..
1fe30 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74          if {[cat
1fe40 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
1fe50 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20  uplevel 1 [list 
1fe60 64 65 62 75 67 20 70 75 72 67 65 5d 0d 0a 20 20  debug purge]..  
1fe70 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d        } result]}
1fe80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
1fe90 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
1fea0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
1feb0 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
1fec0 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
1fed0 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
1fee0 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
1fef0 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
1ff00 6f 20 70 75 72 67 65 20 63 61 6c 6c 20 66 72 61  o purge call fra
1ff10 6d 65 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a  me, error: " \..
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d  \n\t $result \n]
1ff40 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
1ff50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1ff60 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
1ff70 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c 65  ..          uple
1ff80 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62 75  vel 1 [list debu
1ff90 67 20 63 6c 65 61 6e 75 70 5d 0d 0a 20 20 20 20  g cleanup]..    
1ffa0 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20 74      } result]} t
1ffb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
1ffc0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
1ffd0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
1ffe0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
1fff0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20000 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20010 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
20020 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
20030 63 6c 65 61 6e 75 70 20 69 6e 74 65 72 70 72 65  cleanup interpre
20040 74 65 72 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d  ter, error: " \.
20050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20060 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e   \n\t $result \n
20070 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
20080 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20090 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
200a0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 70 6c  {..          upl
200b0 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 64 65 62  evel 1 [list deb
200c0 75 67 20 63 6f 6c 6c 65 63 74 5d 0d 0a 20 20 20  ug collect]..   
200d0 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 7d 20       } result]} 
200e0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
200f0 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
20100 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
20110 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
20120 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
20130 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
20140 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
20150 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
20160 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
20170 2c 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  , error: " \..  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
20190 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
201a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
201b0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
201c0 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70  .    }.....    p
201d0 72 6f 63 20 73 65 74 75 70 4d 65 6d 6f 72 79 43  roc setupMemoryC
201e0 6f 75 6e 74 65 72 73 20 7b 20 76 61 72 4e 61 6d  ounters { varNam
201f0 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20  e } {..      if 
20200 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
20210 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
20220 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76 61   {..        upva
20230 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f 75  r 1 $varName cou
20240 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nter....        
20250 73 65 74 20 63 6f 75 6e 74 65 72 28 31 29 20 5b  set counter(1) [
20260 6f 62 6a 65 63 74 20 63 72 65 61 74 65 20 2d 61  object create -a
20270 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  lias \..        
20280 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e      System.Diagn
20290 6f 73 74 69 63 73 2e 50 65 72 66 6f 72 6d 61 6e  ostics.Performan
202a0 63 65 43 6f 75 6e 74 65 72 20 50 72 6f 63 65 73  ceCounter Proces
202b0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
202c0 20 22 57 6f 72 6b 69 6e 67 20 53 65 74 22 20 5b   "Working Set" [
202d0 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66  file rootname [f
202e0 69 6c 65 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f  ile tail $::bin_
202f0 66 69 6c 65 5d 5d 5d 0d 0a 0d 0a 20 20 20 20 20  file]]]....     
20300 20 20 20 73 65 74 20 63 6f 75 6e 74 65 72 28 32     set counter(2
20310 29 20 5b 6f 62 6a 65 63 74 20 63 72 65 61 74 65  ) [object create
20320 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20 20   -alias \..     
20330 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69         System.Di
20340 61 67 6e 6f 73 74 69 63 73 2e 50 65 72 66 6f 72  agnostics.Perfor
20350 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 50 72 6f  manceCounter Pro
20360 63 65 73 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  cess \..        
20370 20 20 20 20 22 57 6f 72 6b 69 6e 67 20 53 65 74      "Working Set
20380 20 50 65 61 6b 22 20 5b 66 69 6c 65 20 72 6f 6f   Peak" [file roo
20390 74 6e 61 6d 65 20 5b 66 69 6c 65 20 74 61 69 6c  tname [file tail
203a0 20 24 3a 3a 62 69 6e 5f 66 69 6c 65 5d 5d 5d 0d   $::bin_file]]].
203b0 0a 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63  ...        set c
203c0 6f 75 6e 74 65 72 28 33 29 20 5b 6f 62 6a 65 63  ounter(3) [objec
203d0 74 20 63 72 65 61 74 65 20 2d 61 6c 69 61 73 20  t create -alias 
203e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
203f0 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63  ystem.Diagnostic
20400 73 2e 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  s.PerformanceCou
20410 6e 74 65 72 20 50 72 6f 63 65 73 73 20 5c 0d 0a  nter Process \..
20420 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
20430 76 61 74 65 20 42 79 74 65 73 22 20 5b 66 69 6c  vate Bytes" [fil
20440 65 20 72 6f 6f 74 6e 61 6d 65 20 5b 66 69 6c 65  e rootname [file
20450 20 74 61 69 6c 20 24 3a 3a 62 69 6e 5f 66 69 6c   tail $::bin_fil
20460 65 5d 5d 5d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e]]]..      }...
20470 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22  .      return ""
20480 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20 20  ..    }.....    
20490 70 72 6f 63 20 72 65 70 6f 72 74 4d 65 6d 6f 72  proc reportMemor
204a0 79 43 6f 75 6e 74 65 72 73 20 7b 20 63 68 61 6e  yCounters { chan
204b0 6e 65 6c 20 76 61 72 4e 61 6d 65 20 70 72 65 66  nel varName pref
204c0 69 78 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  ix } {..      if
204d0 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a   {[haveSQLiteObj
204e0 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65  ectCommand]} the
204f0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75 70 76  n {..        upv
20500 61 72 20 31 20 24 76 61 72 4e 61 6d 65 20 63 6f  ar 1 $varName co
20510 75 6e 74 65 72 0d 0a 0d 0a 20 20 20 20 20 20 20  unter....       
20520 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
20530 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
20540 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
20550 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f 75   " $prefix " cou
20560 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20 20  nter \"" \..    
20570 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74 20          [object 
20580 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72 28  invoke $counter(
20590 31 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d 20  1) CounterName] 
205a0 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20 5c  "\" value is " \
205b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6f  ..            [o
205c0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63 6f  bject invoke $co
205d0 75 6e 74 65 72 28 31 29 20 52 61 77 56 61 6c 75  unter(1) RawValu
205e0 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  e] \n]....      
205f0 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
20600 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
20610 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
20620 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63 6f  - " $prefix " co
20630 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20 20  unter \"" \..   
20640 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63 74           [object
20650 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65 72   invoke $counter
20660 28 32 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65 5d  (2) CounterName]
20670 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22 20   "\" value is " 
20680 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
20690 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24 63  object invoke $c
206a0 6f 75 6e 74 65 72 28 32 29 20 52 61 77 56 61 6c  ounter(2) RawVal
206b0 75 65 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  ue] \n]....     
206c0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
206d0 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
206e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
206f0 2d 2d 20 22 20 24 70 72 65 66 69 78 20 22 20 63  -- " $prefix " c
20700 6f 75 6e 74 65 72 20 5c 22 22 20 5c 0d 0a 20 20  ounter \"" \..  
20710 20 20 20 20 20 20 20 20 20 20 5b 6f 62 6a 65 63            [objec
20720 74 20 69 6e 76 6f 6b 65 20 24 63 6f 75 6e 74 65  t invoke $counte
20730 72 28 33 29 20 43 6f 75 6e 74 65 72 4e 61 6d 65  r(3) CounterName
20740 5d 20 22 5c 22 20 76 61 6c 75 65 20 69 73 20 22  ] "\" value is "
20750 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
20760 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 24  [object invoke $
20770 63 6f 75 6e 74 65 72 28 33 29 20 52 61 77 56 61  counter(3) RawVa
20780 6c 75 65 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  lue] \n]..      
20790 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
207a0 20 70 72 6f 63 20 63 6f 6c 6c 65 63 74 47 61 72   proc collectGar
207b0 62 61 67 65 20 7b 20 63 68 61 6e 6e 65 6c 20 7b  bage { channel {
207c0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 31 30 30  milliseconds 100
207d0 30 7d 20 7b 71 75 69 65 74 20 74 72 75 65 7d 20  0} {quiet true} 
207e0 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b  } {..      if {[
207f0 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65 63 74  haveSQLiteObject
20800 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b  Command]} then {
20810 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63  ..        if {[c
20820 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
20830 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
20840 47 43 20 47 65 74 54 6f 74 61 6c 4d 65 6d 6f 72  GC GetTotalMemor
20850 79 20 66 61 6c 73 65 0d 0a 20 20 20 20 20 20 20  y false..       
20860 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
20870 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
20880 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
20890 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
208a0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
208b0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
208c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
208d0 20 20 22 2d 2d 2d 2d 20 6d 65 6d 6f 72 79 20 69    "---- memory i
208e0 6e 20 75 73 65 20 62 79 20 74 68 65 20 43 4c 52  n use by the CLR
208f0 20 62 65 66 6f 72 65 20 63 6f 6c 6c 65 63 74 69   before collecti
20900 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20 20 20 20 20  on... " \..     
20910 20 20 20 20 20 20 20 20 20 20 20 24 72 65 73 75             $resu
20920 6c 74 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a  lt " bytes\n"]..
20930 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
20940 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
20950 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
20960 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
20970 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
20980 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
20990 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
209a0 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41          "==== WA
209b0 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f  RNING: failed to
209c0 20 67 65 74 20 43 4c 52 20 6d 65 6d 6f 72 79 20   get CLR memory 
209d0 75 73 61 67 65 2c 20 65 72 72 6f 72 3a 20 22 20  usage, error: " 
209e0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
209f0 20 20 20 5c 6e 5c 74 20 24 72 65 73 75 6c 74 20     \n\t $result 
20a00 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
20a10 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
20a20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23     }....      ##
20a30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20a40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20a50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20a60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20a70 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20  #######....     
20a80 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
20a90 3a 20 52 65 70 65 61 74 65 64 6c 79 20 61 74 74  : Repeatedly att
20aa0 65 6d 70 74 20 74 6f 20 63 6f 6c 6c 65 63 74 20  empt to collect 
20ab0 67 61 72 62 61 67 65 20 75 6e 74 69 6c 20 74 68  garbage until th
20ac0 65 20 61 6c 6c 6f 74 74 65 64 20 6e 75 6d 62 65  e allotted numbe
20ad0 72 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  r..      #      
20ae0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
20af0 20 68 61 73 20 65 6c 61 70 73 65 64 2e 20 20 41   has elapsed.  A
20b00 6c 77 61 79 73 20 61 74 74 65 6d 70 74 20 74 6f  lways attempt to
20b10 20 63 6f 6c 6c 65 63 74 20 67 61 72 62 61 67 65   collect garbage
20b20 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20 20  ..      #       
20b30 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0d 0a  at least once...
20b40 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69        #..      i
20b50 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62  f {[haveSQLiteOb
20b60 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68  jectCommand]} th
20b70 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65  en {..        se
20b80 74 20 73 74 61 72 74 20 5b 63 6c 6f 63 6b 20 73  t start [clock s
20b90 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20 20  econds]..       
20ba0 20 73 65 74 20 73 74 6f 70 20 5b 65 78 70 72 20   set stop [expr 
20bb0 7b 24 73 74 61 72 74 20 2b 20 28 24 6d 69 6c 6c  {$start + ($mill
20bc0 69 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 29  iseconds / 1000)
20bd0 7d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 64 6f  }]....        do
20be0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d   {..          #.
20bf0 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54  .          # NOT
20c00 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6f  E: Attempt to fo
20c10 72 63 65 20 61 20 66 75 6c 6c 20 67 61 72 62 61  rce a full garba
20c20 67 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6e 6f  ge collection no
20c30 77 2e 20 20 52 65 70 6f 72 74 20 61 6e 79 0d 0a  w.  Report any..
20c40 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
20c50 20 20 65 72 72 6f 72 20 74 68 61 74 20 69 73 20    error that is 
20c60 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 77  encountered if w
20c70 65 20 66 61 69 6c 2e 0d 0a 20 20 20 20 20 20 20  e fail...       
20c80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
20c90 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20  if {[catch {..  
20ca0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
20cb0 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
20cc0 74 61 6c 4d 65 6d 6f 72 79 20 74 72 75 65 0d 0a  talMemory true..
20cd0 20 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f            } erro
20ce0 72 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  r]} then {..    
20cf0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20d00 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20d10 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
20d20 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
20d30 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
20d40 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d             "====
20d50 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64   WARNING: failed
20d60 20 66 75 6c 6c 20 67 61 72 62 61 67 65 20 63 6f   full garbage co
20d70 6c 6c 65 63 74 69 6f 6e 2c 20 65 72 72 6f 72 3a  llection, error:
20d80 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
20d90 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 65 72          \n\t $er
20da0 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ror \n]..       
20db0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
20dc0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20dd0 20 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20   set now [clock 
20de0 73 65 63 6f 6e 64 73 5d 0d 0a 20 20 20 20 20 20  seconds]..      
20df0 20 20 7d 20 77 68 69 6c 65 20 7b 24 73 74 61 72    } while {$star
20e00 74 20 3c 3d 20 24 6e 6f 77 20 26 26 20 24 6e 6f  t <= $now && $no
20e10 77 20 3c 20 24 73 74 6f 70 7d 0d 0a 20 20 20 20  w < $stop}..    
20e20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 23 23    }....      ###
20e30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
20e70 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
20e80 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f  if {[haveSQLiteO
20e90 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74  bjectCommand]} t
20ea0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69  hen {..        i
20eb0 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
20ec0 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e         object in
20ed0 76 6f 6b 65 20 47 43 20 47 65 74 54 6f 74 61 6c  voke GC GetTotal
20ee0 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d 0a 20 20  Memory false..  
20ef0 20 20 20 20 20 20 7d 20 72 65 73 75 6c 74 5d 20        } result] 
20f00 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
20f10 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
20f20 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
20f30 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
20f40 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
20f50 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
20f60 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6d 65 6d         "---- mem
20f70 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 74 68  ory in use by th
20f80 65 20 43 4c 52 20 61 66 74 65 72 20 63 6f 6c 6c  e CLR after coll
20f90 65 63 74 69 6f 6e 2e 2e 2e 20 22 20 5c 0d 0a 20  ection... " \.. 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
20fb0 72 65 73 75 6c 74 20 22 20 62 79 74 65 73 5c 6e  result " bytes\n
20fc0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
20fd0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
20fe0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
20ff0 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b  {!$quiet} then {
21000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70  ..            tp
21010 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
21020 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
21030 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d 3d              "===
21040 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65  = WARNING: faile
21050 64 20 74 6f 20 67 65 74 20 43 4c 52 20 6d 65 6d  d to get CLR mem
21060 6f 72 79 20 75 73 61 67 65 2c 20 65 72 72 6f 72  ory usage, error
21070 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  : " \..         
21080 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72 65 73         \n\t $res
21090 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
210a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
210b0 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
210c0 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67 65 74  ....    proc get
210d0 53 51 4c 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e  SQLiteHandleCoun
210e0 74 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 71 75  ts { channel {qu
210f0 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  iet false} } {..
21100 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
21110 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20 20 20   [list]....     
21120 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65   if {[haveSQLite
21130 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d 20 26  ObjectCommand] &
21140 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 5b  & \..          [
21150 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e 65  haveSQLiteDefine
21160 43 6f 6e 73 74 61 6e 74 20 43 4f 55 4e 54 5f 48  Constant COUNT_H
21170 41 4e 44 4c 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ANDLE]} then {..
21180 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
21190 20 20 20 23 20 4e 4f 54 45 3a 20 41 64 64 20 65     # NOTE: Add e
211a0 61 63 68 20 63 72 69 74 69 63 61 6c 20 68 61 6e  ach critical han
211b0 64 6c 65 20 63 6f 75 6e 74 20 74 6f 20 74 68 65  dle count to the
211c0 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 2e   resulting list.
211d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
211e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 6e 61 6d       foreach nam
211f0 65 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  e [list \..     
21200 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
21210 6e 43 6f 75 6e 74 20 73 74 61 74 65 6d 65 6e 74  nCount statement
21220 43 6f 75 6e 74 20 62 61 63 6b 75 70 43 6f 75 6e  Count backupCoun
21230 74 20 62 6c 6f 62 43 6f 75 6e 74 5d 20 7b 0d 0a  t blobCount] {..
21240 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
21250 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
21260 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
21270 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
21280 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
21290 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
212a0 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
212b0 61 74 61 20 24 6e 61 6d 65 0d 0a 20 20 20 20 20  ata $name..     
212c0 20 20 20 20 20 7d 20 76 61 6c 75 65 5d 20 3d 3d       } value] ==
212d0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
212e0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
212f0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
21300 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
21310 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
21320 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
21330 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
21340 20 63 72 69 74 69 63 61 6c 20 68 61 6e 64 6c 65   critical handle
21350 20 63 6f 75 6e 74 20 5c 22 22 20 24 6e 61 6d 65   count \"" $name
21360 20 22 5c 22 20 69 73 20 22 20 24 76 61 6c 75 65   "\" is " $value
21370 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
21380 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21390 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 75 6c     lappend resul
213a0 74 20 24 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  t $value..      
213b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
213c0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
213d0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
213f0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
21400 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d 3d               "==
21420 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69 6c  == WARNING: fail
21430 65 64 20 74 6f 20 67 65 74 20 63 72 69 74 69 63  ed to get critic
21440 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75 6e 74 20  al handle count 
21450 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
21460 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 20 22           $name "
21470 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
21480 74 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a 20 20  t $value \n]..  
21490 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
214a0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
214b0 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
214c0 65 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68  eif {!$quiet} th
214d0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
214e0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
214f0 20 54 68 65 20 61 63 74 75 61 6c 20 68 61 6e 64   The actual hand
21500 6c 65 20 63 6f 75 6e 74 73 20 61 72 65 20 6e 6f  le counts are no
21510 74 20 61 76 61 69 6c 61 62 6c 65 3b 20 74 68 65  t available; the
21520 72 65 66 6f 72 65 2c 20 6a 75 73 74 0d 0a 20 20  refore, just..  
21530 20 20 20 20 20 20 23 20 20 20 20 20 20 20 72 65        #       re
21540 74 75 72 6e 20 61 6e 20 65 6d 70 74 79 20 6c 69  turn an empty li
21550 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  st...        #..
21560 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
21570 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 72 69  hannel "---- cri
21580 74 69 63 61 6c 20 68 61 6e 64 6c 65 20 63 6f 75  tical handle cou
21590 6e 74 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 5c  nts unavailable\
215a0 6e 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  n"..      }.... 
215b0 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 73       return $res
215c0 75 6c 74 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20  ult..    }..... 
215d0 20 20 20 70 72 6f 63 20 73 68 75 74 64 6f 77 6e     proc shutdown
215e0 53 51 4c 69 74 65 20 7b 20 63 68 61 6e 6e 65 6c  SQLite { channel
215f0 20 7b 66 6f 72 63 65 20 66 61 6c 73 65 7d 20 7b   {force false} {
21600 71 75 69 65 74 20 66 61 6c 73 65 7d 20 7d 20 7b  quiet false} } {
21610 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
21620 20 23 20 4e 4f 54 45 3a 20 4d 61 6b 65 20 73 75   # NOTE: Make su
21630 72 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 63  re that SQLite c
21640 6f 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 63  ore library is c
21650 6f 6d 70 6c 65 74 65 6c 79 20 73 68 75 74 64 6f  ompletely shutdo
21660 77 6e 2e 20 20 54 68 69 73 0d 0a 20 20 20 20 20  wn.  This..     
21670 20 23 20 20 20 20 20 20 20 69 73 20 75 73 65 64   #       is used
21680 20 62 79 20 74 65 73 74 73 20 74 68 61 74 20 63   by tests that c
21690 68 61 6e 67 65 20 63 6f 6e 66 69 67 75 72 61 74  hange configurat
216a0 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 6e 64 2f  ion options and/
216b0 6f 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20  or those..      
216c0 23 20 20 20 20 20 20 20 74 68 61 74 20 6e 65 65  #       that nee
216d0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 6c  d to make sure l
216e0 6f 67 67 69 6e 67 20 69 73 20 69 6e 69 74 69 61  ogging is initia
216f0 6c 69 7a 65 64 20 28 69 2e 65 2e 20 6a 75 73 74  lized (i.e. just
21700 20 69 6e 20 63 61 73 65 0d 0a 20 20 20 20 20 20   in case..      
21710 23 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69  #       the SQLi
21720 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
21730 77 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  was initialized 
21740 69 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 70  in the process p
21750 72 69 6f 72 20 74 6f 0d 0a 20 20 20 20 20 20 23  rior to..      #
21760 20 20 20 20 20 20 20 74 68 65 20 53 51 4c 69 74         the SQLit
21770 65 4c 6f 67 20 63 6c 61 73 73 20 62 65 69 6e 67  eLog class being
21780 20 61 62 6c 65 20 74 6f 20 73 65 74 75 70 20 69   able to setup i
21790 74 73 20 6c 6f 67 67 69 6e 67 20 63 61 6c 6c 62  ts logging callb
217a0 61 63 6b 29 2e 0d 0a 20 20 20 20 20 20 23 20 20  ack)...      #  
217b0 20 20 20 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74       Normally, t
217c0 68 69 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  his should only 
217d0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
217e0 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
217f0 20 61 6e 64 0d 0a 20 20 20 20 20 20 23 20 20 20   and..      #   
21800 20 20 20 20 72 65 61 64 79 20 66 6f 72 20 75 73      ready for us
21810 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73 75  e by the test su
21820 69 74 65 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ite...      #.. 
21830 20 20 20 20 20 69 66 20 7b 24 66 6f 72 63 65 20       if {$force 
21840 7c 7c 20 5b 69 73 53 51 4c 69 74 65 52 65 61 64  || [isSQLiteRead
21850 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
21860 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
21870 20 42 55 47 46 49 58 3a 20 4d 61 6b 65 20 73 75   BUGFIX: Make su
21880 72 65 20 74 68 61 74 20 61 6e 79 20 22 6c 65 61  re that any "lea
21890 6b 65 64 22 20 74 72 61 6e 73 61 63 74 69 6f 6e  ked" transaction
218a0 73 20 61 6e 64 2f 6f 72 20 63 6f 6e 6e 65 63 74  s and/or connect
218b0 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20 23 20  ions..        # 
218c0 20 20 20 20 20 20 20 20 61 72 65 20 63 6c 65 61          are clea
218d0 6e 65 64 20 75 70 20 62 65 66 6f 72 65 20 63 61  ned up before ca
218e0 6c 6c 69 6e 67 20 74 68 65 20 6e 61 74 69 76 65  lling the native
218f0 20 73 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69   shutdown functi
21900 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  on...        #..
21910 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
21920 74 72 61 6e 73 61 63 74 69 6f 6e 20 5b 69 6e 66  transaction [inf
21930 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 5d 20  o transactions] 
21940 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
21950 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 5c  {[string match \
21960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21970 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c 69  System#Data#SQLi
21980 74 65 23 53 51 4c 69 74 65 54 72 61 6e 73 61 63  te#SQLiteTransac
21990 74 69 6f 6e 23 2a 20 24 74 72 61 6e 73 61 63 74  tion#* $transact
219a0 69 6f 6e 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  ion]} then {..  
219b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
219c0 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20  atch {..        
219d0 20 20 20 20 20 20 73 71 6c 20 74 72 61 6e 73 61        sql transa
219e0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 24  ction rollback $
219f0 74 72 61 6e 73 61 63 74 69 6f 6e 0d 0a 20 20 20  transaction..   
21a00 20 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72           } error
21a10 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21a30 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21a40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21a50 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21a60 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a80 20 20 20 20 20 22 2d 2d 2d 2d 20 72 6f 6c 6c 65       "---- rolle
21a90 64 20 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  d back leaked tr
21aa0 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
21ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21ac0 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
21ad0 6e 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  n \"\n]..       
21ae0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21af0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21b10 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
21b20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21b30 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
21b40 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
21b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21b60 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
21b70 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 6f  NG: failed to ro
21b80 6c 6c 62 61 63 6b 20 6c 65 61 6b 65 64 20 74 72  llback leaked tr
21b90 61 6e 73 61 63 74 69 6f 6e 20 5c 22 22 20 5c 0d  ansaction \"" \.
21ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21bb0 20 20 20 20 20 24 74 72 61 6e 73 61 63 74 69 6f       $transactio
21bc0 6e 20 22 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20  n "\", error: " 
21bd0 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d  \n\t $error \n].
21be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21bf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
21c00 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
21c10 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
21c20 20 20 20 66 6f 72 65 61 63 68 20 64 62 20 5b 69     foreach db [i
21c30 6e 66 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 5d  nfo connections]
21c40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
21c50 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
21c60 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
21c70 20 53 79 73 74 65 6d 23 44 61 74 61 23 53 51 4c   System#Data#SQL
21c80 69 74 65 23 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ite#SQLiteConnec
21c90 74 69 6f 6e 23 2a 20 24 64 62 5d 7d 20 74 68 65  tion#* $db]} the
21ca0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
21cb0 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 73 71 6c   if {[catch {sql
21cc0 20 63 6c 6f 73 65 20 24 64 62 7d 20 65 72 72 6f   close $db} erro
21cd0 72 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  r] == 0} then {.
21ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21cf0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
21d00 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
21d10 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
21d20 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
21d30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d40 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6c 6f 73        "---- clos
21d50 65 64 20 6c 65 61 6b 65 64 20 64 61 74 61 62 61  ed leaked databa
21d60 73 65 20 5c 22 22 20 24 64 62 20 5c 22 5c 6e 5d  se \"" $db \"\n]
21d70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d80 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
21d90 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
21da0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
21db0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
21dd0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
21de0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3d                "=
21e00 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61 69  === WARNING: fai
21e10 6c 65 64 20 74 6f 20 63 6c 6f 73 65 20 6c 65 61  led to close lea
21e20 6b 65 64 20 64 61 74 61 62 61 73 65 20 5c 22 22  ked database \""
21e30 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21e40 20 20 20 20 20 20 20 20 24 64 62 20 22 5c 22 2c          $db "\",
21e50 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
21e60 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
21e70 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21e80 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
21e90 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
21ea0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  }....        #..
21eb0 20 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58          # BUGFIX
21ec0 3a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  : Before calling
21ed0 20 74 68 65 20 6e 61 74 69 76 65 20 73 68 75 74   the native shut
21ee0 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 6d  down function, m
21ef0 61 6b 65 20 73 75 72 65 20 62 6f 74 68 0d 0a 20  ake sure both.. 
21f00 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 20         #        
21f10 20 6f 66 20 74 68 65 20 50 52 41 47 4d 41 20 72   of the PRAGMA r
21f20 65 6c 61 74 65 64 20 64 69 72 65 63 74 6f 72 79  elated directory
21f30 20 6e 61 6d 65 73 20 61 72 65 20 66 72 65 65 64   names are freed
21f40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
21f50 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
21f60 4c 69 74 65 44 69 72 65 63 74 6f 72 69 65 73 20  LiteDirectories 
21f70 24 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d  $channel true...
21f80 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
21f90 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
21fa0 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
21fb0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
21fc0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
21fd0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
21fe0 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76  Lite.UnsafeNativ
21ff0 65 4d 65 74 68 6f 64 73 20 73 71 6c 69 74 65 33  eMethods sqlite3
22000 5f 73 68 75 74 64 6f 77 6e 0d 0a 20 20 20 20 20  _shutdown..     
22010 20 20 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20     } result] == 
22020 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
22030 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74       if {!$quiet
22040 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22050 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
22060 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22070 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22080 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73      "---- call s
22090 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
220a0 29 2e 2e 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75  )... ok: " $resu
220b0 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  lt \n]..        
220c0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65    }..        } e
220d0 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  lse {..         
220e0 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
220f0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
22100 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
22110 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71 6c 69 74  "---- call sqlit
22140 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 2e 2e 2e  e3_shutdown()...
22150 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
22160 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20  result \n]..    
22170 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22180 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20   }..      }..   
22190 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
221a0 67 65 74 53 65 74 74 69 6e 67 52 65 61 64 43 6f  getSettingReadCo
221b0 75 6e 74 20 7b 20 6e 61 6d 65 20 7b 76 69 61 46  unt { name {viaF
221c0 69 6c 65 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a  ile false} } {..
221d0 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 43        if {[haveC
221e0 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 43  onstraint buildC
221f0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 65 62  onfiguration.Deb
22200 75 67 5d 20 26 26 20 5b 63 61 74 63 68 20 7b 0d  ug] && [catch {.
22210 0a 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20  .        object 
22220 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e  invoke -flags +N
22230 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61 73 20  onPublic -alias 
22240 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  \..            S
22250 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
22260 65 2e 44 65 62 75 67 44 61 74 61 20 47 65 74 53  e.DebugData GetS
22270 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73  ettingReadCounts
22280 20 24 76 69 61 46 69 6c 65 0d 0a 20 20 20 20 20   $viaFile..     
22290 20 7d 20 73 65 74 74 69 6e 67 52 65 61 64 43 6f   } settingReadCo
222a0 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  unts] == 0} then
222b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
222c0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
222d0 6e 61 6d 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20  name] > 0} then 
222e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  {..          if 
222f0 7b 5b 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f  {[$settingReadCo
22300 75 6e 74 73 20 54 72 79 47 65 74 56 61 6c 75 65  unts TryGetValue
22310 20 24 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74   $name value]} t
22320 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22330 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
22340 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
22350 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
22360 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65          "---- se
22370 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65 20  tting \"" $name 
22380 22 5c 22 20 77 61 73 20 72 65 61 64 20 22 20 24  "\" was read " $
22390 76 61 6c 75 65 20 22 20 74 69 6d 65 73 22 20 5c  value " times" \
223a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
223b0 20 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c    [expr {$viaFil
223c0 65 20 3f 20 22 20 66 72 6f 6d 20 74 68 65 20 63  e ? " from the c
223d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
223e0 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 0d  e" : ""}] \n]...
223f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22400 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20 20  urn $value..    
22410 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22420 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
22430 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f 75       set nameCou
22440 6e 74 20 5b 24 73 65 74 74 69 6e 67 52 65 61 64  nt [$settingRead
22450 43 6f 75 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20  Counts Count].. 
22460 20 20 20 20 20 20 20 20 20 73 65 74 20 76 61 6c           set val
22470 75 65 43 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20  ueCount 0....   
22480 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 66 6f         object fo
22490 72 65 61 63 68 20 2d 61 6c 69 61 73 20 70 61 69  reach -alias pai
224a0 72 20 24 73 65 74 74 69 6e 67 52 65 61 64 43 6f  r $settingReadCo
224b0 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  unts {..        
224c0 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43 6f      incr valueCo
224d0 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75 65  unt [$pair Value
224e0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ]....           
224f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22500 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22510 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22520 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74        "---- sett
22530 69 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b  ing \"" [$pair K
22540 65 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64  ey] "\" was read
22550 20 22 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d   " [$pair Value]
22560 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22570 20 20 20 20 22 20 74 69 6d 65 73 22 20 5b 65 78      " times" [ex
22580 70 72 20 7b 24 76 69 61 46 69 6c 65 20 3f 20 22  pr {$viaFile ? "
22590 20 66 72 6f 6d 20 74 68 65 20 63 6f 6e 66 69 67   from the config
225a0 75 72 61 74 69 6f 6e 20 66 69 6c 65 22 20 3a 20  uration file" : 
225b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
225c0 20 20 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20 20 20     ""}] \n]..   
225d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
225e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69        return [li
225f0 73 74 20 24 6e 61 6d 65 43 6f 75 6e 74 20 24 76  st $nameCount $v
22600 61 6c 75 65 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  alueCount]..    
22610 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a      }..      }..
22620 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72  ..      if {[str
22630 69 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 6d 65  ing length $name
22640 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
22650 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
22660 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
22670 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
22680 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65          "---- se
22690 74 74 69 6e 67 20 5c 22 22 20 24 6e 61 6d 65 20  tting \"" $name 
226a0 22 5c 22 20 77 61 73 20 6e 6f 74 20 72 65 61 64  "\" was not read
226b0 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46 69 6c  " [expr {$viaFil
226c0 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  e ? \..         
226d0 20 20 20 22 20 66 72 6f 6d 20 74 68 65 20 63 6f     " from the co
226e0 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
226f0 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a 20 20  " : ""}] \n]..  
22700 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
22710 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22720 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22730 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22740 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6e 6f 20         "---- no 
22750 73 65 74 74 69 6e 67 73 20 77 65 72 65 20 72 65  settings were re
22760 61 64 22 20 5b 65 78 70 72 20 7b 24 76 69 61 46  ad" [expr {$viaF
22770 69 6c 65 20 3f 20 5c 0d 0a 20 20 20 20 20 20 20  ile ? \..       
22780 20 20 20 20 20 22 20 66 72 6f 6d 20 74 68 65 20       " from the 
22790 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69  configuration fi
227a0 6c 65 22 20 3a 20 22 22 7d 5d 20 5c 6e 5d 0d 0a  le" : ""}] \n]..
227b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
227c0 20 72 65 74 75 72 6e 20 2d 31 0d 0a 20 20 20 20   return -1..    
227d0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 67  }.....    proc g
227e0 65 74 4f 74 68 65 72 43 6f 75 6e 74 20 7b 20 6e  etOtherCount { n
227f0 61 6d 65 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69  ame } {..      i
22800 66 20 7b 5b 68 61 76 65 43 6f 6e 73 74 72 61 69  f {[haveConstrai
22810 6e 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72  nt buildConfigur
22820 61 74 69 6f 6e 2e 44 65 62 75 67 5d 20 26 26 20  ation.Debug] && 
22830 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
22840 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
22850 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
22860 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  c -alias \..    
22870 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
22880 61 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67  ata.SQLite.Debug
22890 44 61 74 61 20 47 65 74 4f 74 68 65 72 43 6f 75  Data GetOtherCou
228a0 6e 74 73 0d 0a 20 20 20 20 20 20 7d 20 6f 74 68  nts..      } oth
228b0 65 72 43 6f 75 6e 74 73 5d 20 3d 3d 20 30 7d 20  erCounts] == 0} 
228c0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
228d0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
228e0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
228f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
22900 20 69 66 20 7b 5b 24 6f 74 68 65 72 43 6f 75 6e   if {[$otherCoun
22910 74 73 20 54 72 79 47 65 74 56 61 6c 75 65 20 24  ts TryGetValue $
22920 6e 61 6d 65 20 76 61 6c 75 65 5d 7d 20 74 68 65  name value]} the
22930 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
22940 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
22950 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22960 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22970 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6f 74 68 65        "---- othe
22980 72 20 63 6f 75 6e 74 65 72 20 5c 22 22 20 24 6e  r counter \"" $n
22990 61 6d 65 20 22 5c 22 20 68 61 73 20 76 61 6c 75  ame "\" has valu
229a0 65 20 22 20 24 76 61 6c 75 65 20 5c 6e 5d 0d 0a  e " $value \n]..
229b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
229c0 74 75 72 6e 20 24 76 61 6c 75 65 0d 0a 20 20 20  turn $value..   
229d0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
229e0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
229f0 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65 43 6f        set nameCo
22a00 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75 6e 74  unt [$otherCount
22a10 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20 20 20  s Count]..      
22a20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43 6f 75      set valueCou
22a30 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nt 0....        
22a40 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63 68    object foreach
22a50 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24 6f 74   -alias pair $ot
22a60 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20 20 20  herCounts {..   
22a70 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 61           incr va
22a80 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72 20  lueCount [$pair 
22a90 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  Value]....      
22aa0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
22ab0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
22ac0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
22ad0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
22ae0 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c   other counter \
22af0 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
22b00 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c  \" has value " \
22b10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22b20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65 5d 20    [$pair Value] 
22b30 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
22b40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
22b50 74 75 72 6e 20 5b 6c 69 73 74 20 24 6e 61 6d 65  turn [list $name
22b60 43 6f 75 6e 74 20 24 76 61 6c 75 65 43 6f 75 6e  Count $valueCoun
22b70 74 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  t]..        }.. 
22b80 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22b90 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
22ba0 74 68 20 24 6e 61 6d 65 5d 20 3e 20 30 7d 20 74  th $name] > 0} t
22bb0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  hen {..        t
22bc0 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
22bd0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
22be0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
22bf0 22 2d 2d 2d 2d 20 6f 74 68 65 72 20 63 6f 75 6e  "---- other coun
22c00 74 65 72 20 5c 22 22 20 24 6e 61 6d 65 20 22 5c  ter \"" $name "\
22c10 22 20 68 61 73 20 6e 6f 20 76 61 6c 75 65 5c 6e  " has no value\n
22c20 22 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  "]..      } else
22c30 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
22c40 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
22c50 6c 20 22 2d 2d 2d 2d 20 74 68 65 72 65 20 61 72  l "---- there ar
22c60 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 75 6e 74  e no other count
22c70 65 72 73 5c 6e 22 0d 0a 20 20 20 20 20 20 7d 0d  ers\n"..      }.
22c80 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ...      return 
22c90 2d 31 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20  -1..    }.....  
22ca0 20 20 70 72 6f 63 20 72 65 70 6f 72 74 53 51 4c    proc reportSQL
22cb0 69 74 65 52 65 73 6f 75 72 63 65 73 20 7b 0d 0a  iteResources {..
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 6e              chan
22cd0 6e 65 6c 20 7b 71 75 69 65 74 20 66 61 6c 73 65  nel {quiet false
22ce0 7d 20 7b 72 65 73 65 74 20 74 72 75 65 7d 20 7b  } {reset true} {
22cf0 63 6f 6c 6c 65 63 74 20 74 72 75 65 7d 20 7d 20  collect true} } 
22d00 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20  {..      #..    
22d10 20 20 23 20 4e 4f 54 45 3a 20 49 66 20 70 6f 73    # NOTE: If pos
22d20 73 69 62 6c 65 2c 20 61 6c 77 61 79 73 20 72 65  sible, always re
22d30 73 65 74 20 74 68 65 20 63 61 63 68 65 64 20 61  set the cached a
22d40 73 73 65 6d 62 6c 79 20 64 69 72 65 63 74 6f 72  ssembly director
22d50 79 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  y..      #      
22d60 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 64 20   and the cached 
22d70 58 4d 4c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  XML configuratio
22d80 6e 20 66 69 6c 65 20 6e 61 6d 65 2e 0d 0a 20 20  n file name...  
22d90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66 20      #..      if 
22da0 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
22db0 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
22dc0 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   {..        if {
22dd0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
22de0 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
22df0 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
22e00 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  lic \..         
22e10 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61       System.Data
22e20 2e 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61  .SQLite.UnsafeNa
22e30 74 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20  tiveMethods \.. 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 73               Res
22e50 65 74 43 61 63 68 65 64 41 73 73 65 6d 62 6c 79  etCachedAssembly
22e60 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20  Directory..     
22e70 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30     } error] == 0
22e80 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
22e90 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
22ea0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
22eb0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
22ec0 6e 65 6c 20 22 2d 2d 2d 2d 20 72 65 73 65 74 20  nel "---- reset 
22ed0 63 61 63 68 65 64 20 61 73 73 65 6d 62 6c 79 20  cached assembly 
22ee0 64 69 72 65 63 74 6f 72 79 5c 6e 22 0d 0a 20 20  directory\n"..  
22ef0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
22f00 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
22f10 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
22f20 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
22f30 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
22f40 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
22f50 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
22f60 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e        "==== WARN
22f70 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72  ING: failed to r
22f80 65 73 65 74 20 63 61 63 68 65 64 20 61 73 73 65  eset cached asse
22f90 6d 62 6c 79 20 64 69 72 65 63 74 6f 72 79 2c 20  mbly directory, 
22fa0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
22fb0 20 20 20 20 20 22 65 72 72 6f 72 3a 20 22 20 5c       "error: " \
22fc0 6e 5c 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a  n\t $error \n]..
22fd0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
22fe0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
22ff0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
23000 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
23010 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b   invoke -flags +
23020 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20  NonPublic \..   
23030 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
23040 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 55 6e  m.Data.SQLite.Un
23050 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68 6f 64  safeNativeMethod
23060 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
23070 20 20 20 52 65 73 65 74 43 61 63 68 65 64 58 6d     ResetCachedXm
23080 6c 43 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 0d  lConfigFileName.
23090 0a 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72  .        } error
230a0 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
230b0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
230c0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
230d0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
230e0 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20   $channel "---- 
230f0 72 65 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c  reset cached XML
23100 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
23110 69 6c 65 20 6e 61 6d 65 5c 6e 22 0d 0a 20 20 20  ile name\n"..   
23120 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23130 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
23140 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
23150 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
23160 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
23170 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
23180 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
23190 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49       "==== WARNI
231a0 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65  NG: failed to re
231b0 73 65 74 20 63 61 63 68 65 64 20 58 4d 4c 20 63  set cached XML c
231c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 20 5c  onfiguration " \
231d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
231e0 20 20 22 66 69 6c 65 20 6e 61 6d 65 2c 20 65 72    "file name, er
231f0 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 65 72 72  ror: " \n\t $err
23200 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  or \n]..        
23210 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
23220 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
23230 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45   #..      # NOTE
23240 3a 20 49 66 20 61 76 61 69 6c 61 62 6c 65 2c 20  : If available, 
23250 72 65 70 6f 72 74 20 6f 6e 20 28 61 6e 64 20 70  report on (and p
23260 6f 73 73 69 62 6c 79 20 72 65 73 65 74 29 20 74  ossibly reset) t
23270 68 65 20 72 75 6e 74 69 6d 65 0d 0a 20 20 20 20  he runtime..    
23280 20 20 23 20 20 20 20 20 20 20 63 6f 6e 66 69 67    #       config
23290 75 72 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69  uration statisti
232a0 63 73 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  cs...      #..  
232b0 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c      if {[haveSQL
232c0 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64  iteObjectCommand
232d0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
232e0 20 20 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e    [haveConstrain
232f0 74 20 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  t buildConfigura
23300 74 69 6f 6e 2e 44 65 62 75 67 5d 7d 20 74 68 65  tion.Debug]} the
23310 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  n {..        if 
23320 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
23330 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
23340 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
23350 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
23370 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
23380 44 65 62 75 67 44 61 74 61 20 47 65 74 53 65 74  DebugData GetSet
23390 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 66  tingReadCounts f
233a0 61 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 7d 20  alse..        } 
233b0 73 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  settingReadCount
233c0 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  s] == 0} then {.
233d0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e  .          set n
233e0 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65 74 74 69  ameCount [$setti
233f0 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 43 6f 75  ngReadCounts Cou
23400 6e 74 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 73  nt]..          s
23410 65 74 20 76 61 6c 75 65 43 6f 75 6e 74 20 30 0d  et valueCount 0.
23420 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a  ...          obj
23430 65 63 74 20 66 6f 72 65 61 63 68 20 2d 61 6c 69  ect foreach -ali
23440 61 73 20 70 61 69 72 20 24 73 65 74 74 69 6e 67  as pair $setting
23450 52 65 61 64 43 6f 75 6e 74 73 20 7b 0d 0a 20 20  ReadCounts {..  
23460 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76            incr v
23470 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69 72  alueCount [$pair
23480 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20 20   Value]....     
23490 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
234a0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
234b0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
234c0 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
234d0 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
234e0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
234f0 73 65 74 74 69 6e 67 20 5c 22 22 20 5b 24 70 61  setting \"" [$pa
23500 69 72 20 4b 65 79 5d 20 22 5c 22 20 77 61 73 20  ir Key] "\" was 
23510 72 65 61 64 20 22 20 5c 0d 0a 20 20 20 20 20 20  read " \..      
23520 20 20 20 20 20 20 20 20 20 20 20 20 5b 24 70 61              [$pa
23530 69 72 20 56 61 6c 75 65 5d 20 22 20 74 69 6d 65  ir Value] " time
23540 73 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  s\n"]..         
23550 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
23560 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
23570 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
23580 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
23590 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
235a0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
235b0 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
235c0 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
235d0 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
235e0 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
235f0 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
23600 61 74 61 20 43 6c 65 61 72 53 65 74 74 69 6e 67  ata ClearSetting
23610 52 65 61 64 43 6f 75 6e 74 73 20 66 61 6c 73 65  ReadCounts false
23620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ..            } 
23630 65 72 72 6f 72 5d 20 3d 3d 20 30 7d 20 74 68 65  error] == 0} the
23640 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23650 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
23660 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
23670 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
23680 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
23690 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
236a0 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
236b0 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74  reset setting st
236c0 61 74 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  atistics for the
236d0 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20   previous " \.. 
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20     $nameCount " 
23700 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c  names and " $val
23710 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73  ueCount " values
23720 20 72 65 61 64 5c 6e 22 5d 0d 0a 20 20 20 20 20   read\n"]..     
23730 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23740 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
23750 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23760 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
23770 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
23780 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23790 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
237a0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
237b0 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57 41 52         "==== WAR
237c0 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74 6f 20  NING: failed to 
237d0 72 65 73 65 74 20 73 65 74 74 69 6e 67 20 73 74  reset setting st
237e0 61 74 69 73 74 69 63 73 20 66 6f 72 20 22 20 5c  atistics for " \
237f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23800 20 20 20 20 20 20 22 74 68 65 20 70 72 65 76 69        "the previ
23810 6f 75 73 20 22 20 24 6e 61 6d 65 43 6f 75 6e 74  ous " $nameCount
23820 20 22 20 6e 61 6d 65 73 20 61 6e 64 20 22 20 24   " names and " $
23830 76 61 6c 75 65 43 6f 75 6e 74 20 5c 0d 0a 20 20  valueCount \..  
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 22 20 76 61 6c 75 65 73 20 72 65 61 64 2c    " values read,
23860 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24   error: " \n\t $
23870 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20  error \n]..     
23880 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
23890 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
238a0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
238b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20  }....        if 
238c0 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20  {[catch {..     
238d0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
238e0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
238f0 62 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20  blic -alias \.. 
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
23910 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
23920 44 65 62 75 67 44 61 74 61 20 47 65 74 53 65 74  DebugData GetSet
23930 74 69 6e 67 52 65 61 64 43 6f 75 6e 74 73 20 74  tingReadCounts t
23940 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 20 73  rue..        } s
23950 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f  ettingFileReadCo
23960 75 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  unts] == 0} then
23970 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
23980 74 20 6e 61 6d 65 43 6f 75 6e 74 20 5b 24 73 65  t nameCount [$se
23990 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43 6f 75  ttingFileReadCou
239a0 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
239b0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
239c0 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
239d0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
239e0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
239f0 73 65 74 74 69 6e 67 46 69 6c 65 52 65 61 64 43  settingFileReadC
23a00 6f 75 6e 74 73 20 7b 0d 0a 20 20 20 20 20 20 20  ounts {..       
23a10 20 20 20 20 20 69 6e 63 72 20 76 61 6c 75 65 43       incr valueC
23a20 6f 75 6e 74 20 5b 24 70 61 69 72 20 56 61 6c 75  ount [$pair Valu
23a30 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e]....          
23a40 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
23a50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
23a60 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
23a70 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
23a80 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
23a90 20 20 20 20 20 22 2d 2d 2d 2d 20 73 65 74 74 69       "---- setti
23aa0 6e 67 20 5c 22 22 20 5b 24 70 61 69 72 20 4b 65  ng \"" [$pair Ke
23ab0 79 5d 20 22 5c 22 20 77 61 73 20 72 65 61 64 20  y] "\" was read 
23ac0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
23ad0 20 20 20 20 20 20 20 5b 24 70 61 69 72 20 56 61         [$pair Va
23ae0 6c 75 65 5d 20 22 20 74 69 6d 65 73 20 66 72 6f  lue] " times fro
23af0 6d 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  m the configurat
23b00 69 6f 6e 20 66 69 6c 65 5c 6e 22 5d 0d 0a 20 20  ion file\n"]..  
23b10 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
23b20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23b30 20 20 20 20 20 20 69 66 20 7b 24 72 65 73 65 74        if {$reset
23b40 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
23b50 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
23b60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23b70 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20    object invoke 
23b80 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69  -flags +NonPubli
23b90 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20 20 20  c -alias \..    
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79                Sy
23bb0 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
23bc0 2e 44 65 62 75 67 44 61 74 61 20 43 6c 65 61 72  .DebugData Clear
23bd0 53 65 74 74 69 6e 67 52 65 61 64 43 6f 75 6e 74  SettingReadCount
23be0 73 20 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20  s true..        
23bf0 20 20 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20      } error] == 
23c00 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
23c10 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71           if {!$q
23c20 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
23c40 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70  uts $channel [ap
23c50 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 22 2d 2d 2d 2d 20 72 65 73 65 74 20 73 65 74 74  "---- reset sett
23c80 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 20 66  ing statistics f
23c90 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
23ca0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
23cb0 20 20 20 20 20 20 20 20 20 24 6e 61 6d 65 43 6f           $nameCo
23cc0 75 6e 74 20 22 20 6e 61 6d 65 73 20 61 6e 64 20  unt " names and 
23cd0 22 20 24 76 61 6c 75 65 43 6f 75 6e 74 20 22 20  " $valueCount " 
23ce0 76 61 6c 75 65 73 20 72 65 61 64 20 22 20 5c 0d  values read " \.
23cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d00 20 20 20 20 20 22 66 72 6f 6d 20 74 68 65 20 63       "from the c
23d10 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c  onfiguration fil
23d20 65 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20  e\n"]..         
23d30 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23d40 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
23d50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
23d60 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
23d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d80 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
23d90 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 20 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47     "==== WARNING
23dc0 3a 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65  : failed to rese
23dd0 74 20 73 65 74 74 69 6e 67 20 73 74 61 74 69 73  t setting statis
23de0 74 69 63 73 20 66 6f 72 20 22 20 5c 0d 0a 20 20  tics for " \..  
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 22 74 68 65 20 70 72 65 76 69 6f 75 73 20    "the previous 
23e10 22 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20 6e  " $nameCount " n
23e20 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c 75  ames and " $valu
23e30 65 43 6f 75 6e 74 20 5c 0d 0a 20 20 20 20 20 20  eCount \..      
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
23e50 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
23e60 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
23e70 6f 6e 20 66 69 6c 65 2c 20 65 72 72 6f 72 3a 20  on file, error: 
23e80 22 20 5c 6e 5c 74 20 5c 0d 0a 20 20 20 20 20 20  " \n\t \..      
23e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 65                $e
23ea0 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  rror \n]..      
23eb0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
23ec0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
23ed0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
23ee0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b  ....        if {
23ef0 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20  [catch {..      
23f00 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b      object invok
23f10 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62  e -flags +NonPub
23f20 6c 69 63 20 2d 61 6c 69 61 73 20 5c 0d 0a 20 20  lic -alias \..  
23f30 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74              Syst
23f40 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 44  em.Data.SQLite.D
23f50 65 62 75 67 44 61 74 61 20 47 65 74 4f 74 68 65  ebugData GetOthe
23f60 72 43 6f 75 6e 74 73 0d 0a 20 20 20 20 20 20 20  rCounts..       
23f70 20 7d 20 6f 74 68 65 72 43 6f 75 6e 74 73 5d 20   } otherCounts] 
23f80 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
23f90 20 20 20 20 20 20 20 20 73 65 74 20 6e 61 6d 65          set name
23fa0 43 6f 75 6e 74 20 5b 24 6f 74 68 65 72 43 6f 75  Count [$otherCou
23fb0 6e 74 73 20 43 6f 75 6e 74 5d 0d 0a 20 20 20 20  nts Count]..    
23fc0 20 20 20 20 20 20 73 65 74 20 76 61 6c 75 65 43        set valueC
23fd0 6f 75 6e 74 20 30 0d 0a 0d 0a 20 20 20 20 20 20  ount 0....      
23fe0 20 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61      object forea
23ff0 63 68 20 2d 61 6c 69 61 73 20 70 61 69 72 20 24  ch -alias pair $
24000 6f 74 68 65 72 43 6f 75 6e 74 73 20 7b 0d 0a 20  otherCounts {.. 
24010 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72 20             incr 
24020 76 61 6c 75 65 43 6f 75 6e 74 20 5b 24 70 61 69  valueCount [$pai
24030 72 20 56 61 6c 75 65 5d 0d 0a 0d 0a 20 20 20 20  r Value]....    
24040 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
24050 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
24060 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24070 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
24080 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
24090 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
240a0 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 20 5c   other counter \
240b0 22 22 20 5b 24 70 61 69 72 20 4b 65 79 5d 20 22  "" [$pair Key] "
240c0 5c 22 20 68 61 73 20 76 61 6c 75 65 20 22 20 5c  \" has value " \
240d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
240e0 20 20 20 20 5b 24 70 61 69 72 20 56 61 6c 75 65      [$pair Value
240f0 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  ] \n]..         
24100 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
24110 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
24120 66 20 7b 24 72 65 73 65 74 7d 20 74 68 65 6e 20  f {$reset} then 
24130 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
24140 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  f {[catch {..   
24150 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
24160 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20  t invoke -flags 
24170 2b 4e 6f 6e 50 75 62 6c 69 63 20 2d 61 6c 69 61  +NonPublic -alia
24180 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
24190 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 61         System.Da
241a0 74 61 2e 53 51 4c 69 74 65 2e 44 65 62 75 67 44  ta.SQLite.DebugD
241b0 61 74 61 20 43 6c 65 61 72 4f 74 68 65 72 43 6f  ata ClearOtherCo
241c0 75 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20  unts..          
241d0 20 20 7d 20 65 72 72 6f 72 5d 20 3d 3d 20 30 7d    } error] == 0}
241e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
241f0 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69         if {!$qui
24200 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
24210 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
24220 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
24230 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
24250 2d 2d 2d 20 72 65 73 65 74 20 6f 74 68 65 72 20  --- reset other 
24260 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 74 68 65  counters for the
24270 20 70 72 65 76 69 6f 75 73 20 22 20 5c 0d 0a 20   previous " \.. 
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 24 6e 61 6d 65 43 6f 75 6e 74 20 22 20     $nameCount " 
242a0 6e 61 6d 65 73 20 61 6e 64 20 22 20 24 76 61 6c  names and " $val
242b0 75 65 43 6f 75 6e 74 20 22 20 76 61 6c 75 65 73  ueCount " values
242c0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
242d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
242e0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
242f0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
24300 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a  $quiet} then {..
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
24330 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 20 20 22 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a    "==== WARNING:
24360 20 66 61 69 6c 65 64 20 74 6f 20 72 65 73 65 74   failed to reset
24370 20 6f 74 68 65 72 20 63 6f 75 6e 74 65 72 73 20   other counters 
24380 66 6f 72 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  for " \..       
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
243a0 65 20 70 72 65 76 69 6f 75 73 20 22 20 24 6e 61  e previous " $na
243b0 6d 65 43 6f 75 6e 74 20 22 20 6e 61 6d 65 73 20  meCount " names 
243c0 61 6e 64 20 22 20 24 76 61 6c 75 65 43 6f 75 6e  and " $valueCoun
243d0 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t \..           
243e0 20 20 20 20 20 20 20 20 20 22 20 76 61 6c 75 65           " value
243f0 73 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74  s, error: " \n\t
24400 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20 20   $error \n]..   
24410 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
24420 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
24430 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24440 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
24450 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53        if {[haveS
24460 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61  QLiteObjectComma
24470 6e 64 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20  nd] && \..      
24480 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65 44      [haveSQLiteD
24490 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 49 4e  efineConstant IN
244a0 54 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41  TEROP_VIRTUAL_TA
244b0 42 4c 45 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20  BLE] && \..     
244c0 20 20 20 20 20 5b 68 61 76 65 53 51 4c 69 74 65       [haveSQLite
244d0 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e 74 20 54  DefineConstant T
244e0 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f 42 59 54 45  RACK_MEMORY_BYTE
244f0 53 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  S]} then {..    
24500 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
24510 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24520 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
24530 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65 6e 74 20  l "---- current 
24540 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  memory in use by
24550 20 53 51 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e   SQLiteMemory...
24560 20 22 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   "..        }...
24570 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61  .        if {[ca
24580 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
24590 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
245a0 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
245b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
245c0 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
245d0 4c 69 74 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72  Lite.SQLiteMemor
245e0 79 20 62 79 74 65 73 41 6c 6c 6f 63 61 74 65 64  y bytesAllocated
245f0 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f  ..        } memo
24600 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b  ry] == 0} then {
24610 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
24620 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
24630 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75  .            tpu
24640 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
24650 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
24660 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20  " bytes\n"]..   
24670 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
24680 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
24690 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f 72 79        set memory
246a0 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20   unknown....    
246b0 20 20 20 20 20 20 69 66 20 7b 21 24 71 75 69 65        if {!$quie
246c0 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  t} then {..     
246d0 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
246e0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
246f0 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20  s $memory \n].. 
24700 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24710 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
24720 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68   if {!$quiet} th
24730 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24740 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 22  tputs $channel "
24750 2d 2d 2d 2d 20 6d 61 78 69 6d 75 6d 20 6d 65 6d  ---- maximum mem
24760 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 53 51  ory in use by SQ
24770 4c 69 74 65 4d 65 6d 6f 72 79 2e 2e 2e 20 22 0d  LiteMemory... ".
24780 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
24790 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68        if {[catch
247a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62   {..          ob
247b0 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61  ject invoke -fla
247c0 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d  gs +NonPublic \.
247d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
247e0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
247f0 65 2e 53 51 4c 69 74 65 4d 65 6d 6f 72 79 20 6d  e.SQLiteMemory m
24800 61 78 69 6d 75 6d 42 79 74 65 73 41 6c 6c 6f 63  aximumBytesAlloc
24810 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 7d 20  ated..        } 
24820 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68  memory] == 0} th
24830 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
24840 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65  if {!$quiet} the
24850 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
24860 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
24870 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d  [appendArgs $mem
24880 6f 72 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d  ory " bytes\n"].
24890 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
248a0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
248b0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
248c0 6d 6f 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a  mory unknown....
248d0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 24            if {!$
248e0 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
248f0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
24900 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
24910 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e  dArgs $memory \n
24920 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ]..          }..
24930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
24940 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   }....      if {
24950 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
24960 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
24970 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75  channel "---- cu
24980 72 72 65 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20  rrent memory in 
24990 75 73 65 20 62 79 20 53 51 4c 69 74 65 2e 2e 2e  use by SQLite...
249a0 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   "..      }.... 
249b0 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51       if {[haveSQ
249c0 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
249d0 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  d]} then {..    
249e0 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
249f0 0d 0a 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65  ..          obje
24a00 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
24a10 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 79 73               Sys
24a30 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
24a40 55 6e 73 61 66 65 4e 61 74 69 76 65 4d 65 74 68  UnsafeNativeMeth
24a50 6f 64 73 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  ods sqlite3_memo
24a60 72 79 5f 75 73 65 64 0d 0a 20 20 20 20 20 20 20  ry_used..       
24a70 20 7d 20 6d 65 6d 6f 72 79 5d 20 3d 3d 20 30 7d   } memory] == 0}
24a80 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
24a90 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24aa0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24ab0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
24ac0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
24ad0 6d 65 6d 6f 72 79 20 22 20 62 79 74 65 73 5c 6e  memory " bytes\n
24ae0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  "]..          }.
24af0 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
24b00 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
24b10 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
24b20 3a 20 4d 61 79 62 65 20 74 68 65 20 53 51 4c 69  : Maybe the SQLi
24b30 74 65 20 63 6f 72 65 20 6c 69 62 72 61 72 79 20  te core library 
24b40 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 3f 0d  is unavailable?.
24b50 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
24b60 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
24b70 72 79 20 75 6e 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20  ry unknown....  
24b80 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
24b90 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
24ba0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
24bb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
24bc0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
24bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  .          }..  
24be0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
24bf0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
24c00 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e 61 76   set memory unav
24c10 61 69 6c 61 62 6c 65 0d 0a 0d 0a 20 20 20 20 20  ailable....     
24c20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24c30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24c40 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
24c50 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65   [appendArgs $me
24c60 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  mory \n]..      
24c70 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
24c80 20 20 20 20 20 20 73 65 74 20 72 65 73 75 6c 74        set result
24c90 20 24 6d 65 6d 6f 72 79 3b 20 23 20 4e 4f 54 45   $memory; # NOTE
24ca0 3a 20 52 65 74 75 72 6e 20 6d 65 6d 6f 72 79 20  : Return memory 
24cb0 69 6e 2d 75 73 65 20 74 6f 20 6f 75 72 20 63 61  in-use to our ca
24cc0 6c 6c 65 72 2e 0d 0a 0d 0a 20 20 20 20 20 20 69  ller.....      i
24cd0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
24ce0 20 7b 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   {..        tput
24cf0 73 20 24 63 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d  s $channel "----
24d00 20 6d 61 78 69 6d 75 6d 20 6d 65 6d 6f 72 79 20   maximum memory 
24d10 69 6e 20 75 73 65 20 62 79 20 53 51 4c 69 74 65  in use by SQLite
24d20 2e 2e 2e 20 22 0d 0a 20 20 20 20 20 20 7d 0d 0a  ... "..      }..
24d30 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76  ..      if {[hav
24d40 65 53 51 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d  eSQLiteObjectCom
24d50 6d 61 6e 64 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  mand]} then {.. 
24d60 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
24d70 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6f  h {..          o
24d80 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
24d90 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
24da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24db0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
24dc0 74 65 2e 55 6e 73 61 66 65 4e 61 74 69 76 65 4d  te.UnsafeNativeM
24dd0 65 74 68 6f 64 73 20 5c 0d 0a 20 20 20 20 20 20  ethods \..      
24de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24df0 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
24e00 20 30 0d 0a 20 20 20 20 20 20 20 20 7d 20 6d 65   0..        } me
24e10 6d 6f 72 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  mory] == 0} then
24e20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
24e30 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
24e40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
24e50 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
24e60 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
24e70 79 20 22 20 62 79 74 65 73 5c 6e 22 5d 0d 0a 20  y " bytes\n"].. 
24e80 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
24e90 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
24ea0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
24eb0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4d 61 79       # NOTE: May
24ec0 62 65 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  be the SQLite co
24ed0 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 75 6e  re library is un
24ee0 61 76 61 69 6c 61 62 6c 65 3f 0d 0a 20 20 20 20  available?..    
24ef0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
24f00 20 20 20 73 65 74 20 6d 65 6d 6f 72 79 20 75 6e     set memory un
24f10 6b 6e 6f 77 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  known....       
24f20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20     if {!$quiet} 
24f30 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
24f40 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
24f50 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 24  el [appendArgs $
24f60 6d 65 6d 6f 72 79 20 5c 6e 5d 0d 0a 20 20 20 20  memory \n]..    
24f70 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
24f80 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65   }..      } else
24f90 20 7b 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20   {..        set 
24fa0 6d 65 6d 6f 72 79 20 75 6e 61 76 61 69 6c 61 62  memory unavailab
24fb0 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20 69 66  le....        if
24fc0 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
24fd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74 70 75  {..          tpu
24fe0 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
24ff0 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20  endArgs $memory 
25000 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  \n]..        }..
25010 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25020 20 69 66 20 7b 24 63 6f 6c 6c 65 63 74 7d 20 74   if {$collect} t
25030 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 63  hen {..        c
25040 6f 6c 6c 65 63 74 47 61 72 62 61 67 65 20 24 63  ollectGarbage $c
25050 68 61 6e 6e 65 6c 0d 0a 20 20 20 20 20 20 7d 0d  hannel..      }.
25060 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 21 24 71  ...      if {!$q
25070 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  uiet} then {..  
25080 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
25090 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 75 72 72 65  nnel "---- curre
250a0 6e 74 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65  nt memory in use
250b0 20 62 79 20 74 68 65 20 43 4c 52 2e 2e 2e 20 22   by the CLR... "
250c0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
250d0 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
250e0 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
250f0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
25100 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
25110 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
25120 20 69 6e 76 6f 6b 65 20 47 43 20 47 65 74 54 6f   invoke GC GetTo
25130 74 61 6c 4d 65 6d 6f 72 79 20 66 61 6c 73 65 0d  talMemory false.
25140 0a 20 20 20 20 20 20 20 20 7d 20 6d 65 6d 6f 72  .        } memor
25150 79 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d  y] == 0} then {.
25160 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
25170 73 74 72 69 6e 67 20 69 73 20 69 6e 74 65 67 65  string is intege
25180 72 20 2d 73 74 72 69 63 74 20 24 6d 65 6d 6f 72  r -strict $memor
25190 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  y]} then {..    
251a0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
251b0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
251c0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
251d0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
251e0 64 41 72 67 73 20 24 6d 65 6d 6f 72 79 20 22 20  dArgs $memory " 
251f0 62 79 74 65 73 5c 6e 22 5d 0d 0a 20 20 20 20 20  bytes\n"]..     
25200 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25210 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
25220 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6d 65            set me
25230 6d 6f 72 79 20 69 6e 76 61 6c 69 64 0d 0a 0d 0a  mory invalid....
25240 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
25250 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d  !$quiet} then {.
25260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
25270 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
25280 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f 72  ppendArgs $memor
25290 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20  y \n]..         
252a0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
252b0 7d 0d 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  }..        } els
252c0 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73  e {..          s
252d0 65 74 20 6d 65 6d 6f 72 79 20 75 6e 6b 6e 6f 77  et memory unknow
252e0 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n....          i
252f0 66 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e  f {!$quiet} then
25300 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
25310 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
25320 61 70 70 65 6e 64 41 72 67 73 20 24 6d 65 6d 6f  appendArgs $memo
25330 72 79 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20  ry \n]..        
25340 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
25350 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a        } else {..
25360 20 20 20 20 20 20 20 20 73 65 74 20 6d 65 6d 6f          set memo
25370 72 79 20 75 6e 61 76 61 69 6c 61 62 6c 65 0d 0a  ry unavailable..
25380 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 21 24  ..        if {!$
25390 71 75 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20  quiet} then {.. 
253a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
253b0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
253c0 72 67 73 20 24 6d 65 6d 6f 72 79 20 5c 6e 5d 0d  rgs $memory \n].
253d0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
253e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74    }....      ret
253f0 75 72 6e 20 24 72 65 73 75 6c 74 0d 0a 20 20 20  urn $result..   
25400 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
25410 72 65 73 65 74 53 51 4c 69 74 65 44 69 72 65 63  resetSQLiteDirec
25420 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e 65 6c  tories { channel
25430 20 6e 61 74 69 76 65 20 7d 20 7b 0d 0a 20 20 20   native } {..   
25440 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
25450 54 45 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 75  TE: Attempt to u
25460 73 65 20 74 68 65 20 6e 61 74 69 76 65 20 41 50  se the native AP
25470 49 20 28 76 69 61 20 74 68 65 20 6d 61 6e 61 67  I (via the manag
25480 65 64 20 61 73 73 65 6d 62 6c 79 29 3f 0d 0a 20  ed assembly)?.. 
25490 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
254a0 20 7b 24 6e 61 74 69 76 65 7d 20 74 68 65 6e 20   {$native} then 
254b0 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  {..        #..  
254c0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f        # NOTE: No
254d0 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  w make sure the 
254e0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 65 6d  database and tem
254f0 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 69  porary directori
25500 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20 20 20  es are..        
25510 23 20 20 20 20 20 20 20 72 65 73 65 74 20 74 68  #       reset th
25520 65 69 72 20 64 65 66 61 75 6c 74 20 76 61 6c 75  eir default valu
25530 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64  es, which should
25540 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62 6f 74   be null for bot
25550 68 2e 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  h...        #   
25560 20 20 20 20 53 69 6e 63 65 20 74 68 65 20 73 71      Since the sq
25570 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
25580 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69  directory functi
25590 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  on is available,
255a0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
255b0 20 20 75 73 65 20 69 74 2e 0d 0a 20 20 20 20 20    use it...     
255c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f     #..        fo
255d0 72 20 7b 73 65 74 20 69 6e 64 65 78 20 31 7d 20  r {set index 1} 
255e0 7b 24 69 6e 64 65 78 20 3c 20 33 7d 20 7b 69 6e  {$index < 3} {in
255f0 63 72 20 69 6e 64 65 78 7d 20 7b 0d 0a 20 20 20  cr index} {..   
25600 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63         if {[catc
25610 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
25620 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d   object invoke -
25630 66 6c 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63  flags +NonPublic
25640 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
25650 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
25660 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
25670 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
25690 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
256a0 64 69 72 65 63 74 6f 72 79 20 24 69 6e 64 65 78  directory $index
256b0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
256c0 20 7d 20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d   } result] == 0}
256d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
256e0 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
256f0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
25700 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
25710 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
25720 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
25730 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
25740 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
25750 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
25760 2e 20 6f 6b 3a 20 22 20 24 72 65 73 75 6c 74 20  . ok: " $result 
25770 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
25780 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
25790 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e       tputs $chan
257a0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
257b0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
257c0 20 20 20 22 2d 2d 2d 2d 20 63 61 6c 6c 20 73 71     "---- call sq
257d0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
257e0 64 69 72 65 63 74 6f 72 79 28 22 20 24 69 6e 64  directory(" $ind
257f0 65 78 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ex \..          
25800 20 20 20 20 20 20 22 2c 20 6e 75 6c 6c 29 2e 2e        ", null)..
25810 2e 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c 74 20  . error: " \n\t 
25820 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20  $result \n]..   
25830 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25840 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73    }..      } els
25850 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  e {..        #..
25860 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25870 4e 6f 77 20 6d 61 6b 65 20 73 75 72 65 20 74 68  Now make sure th
25880 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
25890 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
258a0 72 69 65 73 20 61 72 65 0d 0a 20 20 20 20 20 20  ries are..      
258b0 20 20 23 20 20 20 20 20 20 20 72 65 73 65 74 20    #       reset 
258c0 74 68 65 69 72 20 64 65 66 61 75 6c 74 20 76 61  their default va
258d0 6c 75 65 73 2c 20 77 68 69 63 68 20 73 68 6f 75  lues, which shou
258e0 6c 64 20 62 65 20 6e 75 6c 6c 20 66 6f 72 20 62  ld be null for b
258f0 6f 74 68 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  oth...        # 
25900 20 20 20 20 20 20 53 69 6e 63 65 20 74 68 65 20        Since the 
25910 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
25920 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e 63  t_directory func
25930 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0d 0a 20  tion does not.. 
25940 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 61         #       a
25950 70 70 65 61 72 20 74 6f 20 62 65 20 61 76 61 69  ppear to be avai
25960 6c 61 62 6c 65 2c 20 75 73 65 20 74 68 65 20 61  lable, use the a
25970 73 73 6f 63 69 61 74 65 64 20 50 52 41 47 4d 41  ssociated PRAGMA
25980 20 63 6f 6d 6d 61 6e 64 73 0d 0a 20 20 20 20 20   commands..     
25990 20 20 20 23 20 20 20 20 20 20 20 69 6e 73 74 65     #       inste
259a0 61 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ad...        #..
259b0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
259c0 64 69 72 65 63 74 6f 72 79 20 5b 6c 69 73 74 20  directory [list 
259d0 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
259e0 74 6f 72 79 20 74 65 6d 70 5f 73 74 6f 72 65 5f  tory temp_store_
259f0 64 69 72 65 63 74 6f 72 79 5d 20 7b 0d 0a 20 20  directory] {..  
25a00 20 20 20 20 20 20 20 20 73 65 74 20 73 71 6c 20          set sql 
25a10 5b 61 70 70 65 6e 64 41 72 67 73 20 22 50 52 41  [appendArgs "PRA
25a20 47 4d 41 20 22 20 24 64 69 72 65 63 74 6f 72 79  GMA " $directory
25a30 20 22 20 3d 20 5c 22 5c 22 3b 22 5d 0d 0a 0d 0a   " = \"\";"]....
25a40 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63            if {[c
25a50 61 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c  atch {executeSql
25a60 20 24 73 71 6c 7d 20 72 65 73 75 6c 74 5d 20 3d   $sql} result] =
25a70 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  = 0} then {..   
25a80 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
25a90 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
25aa0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
25ab0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65         "---- exe
25ac0 63 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64  cute PRAGMA " $d
25ad0 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 6f 6b  irectory "... ok
25ae0 3a 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  : \"" \..       
25af0 20 20 20 20 20 20 20 20 20 24 72 65 73 75 6c 74           $result
25b00 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20   \"\n]..        
25b10 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
25b20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
25b30 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
25b40 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
25b50 20 20 20 20 20 20 22 2d 2d 2d 2d 20 65 78 65 63        "---- exec
25b60 75 74 65 20 50 52 41 47 4d 41 20 22 20 24 64 69  ute PRAGMA " $di
25b70 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 65 72 72  rectory "... err
25b80 6f 72 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20  or: " \..       
25b90 20 20 20 20 20 20 20 20 20 5c 6e 5c 74 20 24 72           \n\t $r
25ba0 65 73 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20  esult \n]..     
25bb0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
25bc0 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  }..      }..    
25bd0 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 63  }.....    proc c
25be0 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72  heckForSQLiteDir
25bf0 65 63 74 6f 72 69 65 73 20 7b 20 63 68 61 6e 6e  ectories { chann
25c00 65 6c 20 7b 72 65 73 65 74 20 66 61 6c 73 65 7d  el {reset false}
25c10 20 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20   } {..      #.. 
25c20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
25c30 63 6b 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  ck if the sqlite
25c40 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
25c50 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 69  ctory function i
25c60 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20  s available...  
25c70 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75      #..      tpu
25c80 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  ts $channel \.. 
25c90 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
25ca0 68 65 63 6b 69 6e 67 20 66 6f 72 20 66 75 6e 63  hecking for func
25cb0 74 69 6f 6e 20 73 71 6c 69 74 65 33 5f 77 69 6e  tion sqlite3_win
25cc0 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79  32_set_directory
25cd0 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 23  ... "....      #
25ce0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
25cf0 54 68 69 73 20 63 61 6c 6c 20 74 6f 20 74 68 65  This call to the
25d00 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
25d10 65 74 5f 64 69 72 65 63 74 6f 72 79 20 66 75 6e  et_directory fun
25d20 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65 0d 0a  ction uses the..
25d30 20 20 20 20 20 20 23 20 20 20 20 20 20 20 69 6e        #       in
25d40 76 61 6c 69 64 20 76 61 6c 75 65 20 30 20 66 6f  valid value 0 fo
25d50 72 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  r the first argu
25d60 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 64 65  ment.  This code
25d70 20 69 73 20 64 65 73 69 67 6e 65 64 0d 0a 20 20   is designed..  
25d80 20 20 20 20 23 20 20 20 20 20 20 20 74 6f 20 63      #       to c
25d90 68 65 63 6b 20 69 66 20 63 61 6c 6c 69 6e 67 20  heck if calling 
25da0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  the function wil
25db0 6c 20 72 61 69 73 65 20 61 6e 20 65 78 63 65 70  l raise an excep
25dc0 74 69 6f 6e 20 28 69 2e 65 2e 0d 0a 20 20 20 20  tion (i.e...    
25dd0 20 20 23 20 20 20 20 20 20 20 74 68 65 20 61 63    #       the ac
25de0 74 75 61 6c 20 72 65 73 75 6c 74 20 6f 66 20 74  tual result of t
25df0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
25e00 20 6e 6f 74 20 6d 61 74 74 65 72 20 61 73 20 6c   not matter as l
25e10 6f 6e 67 20 61 73 20 6e 6f 0d 0a 20 20 20 20 20  ong as no..     
25e20 20 23 20 20 20 20 20 20 20 64 69 72 65 63 74 6f   #       directo
25e30 72 79 20 69 73 20 63 68 61 6e 67 65 64 29 2e 0d  ry is changed)..
25e40 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
25e50 69 66 20 7b 5b 69 73 57 69 6e 64 6f 77 73 5d 20  if {[isWindows] 
25e60 26 26 20 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20  && [catch {..   
25e70 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
25e80 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
25e90 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
25ea0 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
25eb0 53 51 4c 69 74 65 2e 55 6e 73 61 66 65 4e 61 74  SQLite.UnsafeNat
25ec0 69 76 65 4d 65 74 68 6f 64 73 20 5c 0d 0a 20 20  iveMethods \..  
25ed0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25ee0 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
25ef0 63 74 6f 72 79 20 30 20 6e 75 6c 6c 0d 0a 20 20  ctory 0 null..  
25f00 20 20 20 20 7d 5d 20 3d 3d 20 30 7d 20 74 68 65      }] == 0} the
25f10 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
25f20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
25f30 43 61 6c 6c 69 6e 67 20 74 68 65 20 73 71 6c 69  Calling the sqli
25f40 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
25f50 72 65 63 74 6f 72 79 20 66 75 6e 63 74 69 6f 6e  rectory function
25f60 20 64 6f 65 73 20 6e 6f 74 0d 0a 20 20 20 20 20   does not..     
25f70 20 20 20 23 20 20 20 20 20 20 20 63 61 75 73 65     #       cause
25f80 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 3b 20 74   an exception; t
25f90 68 65 72 65 66 6f 72 65 2c 20 69 74 20 6d 75 73  herefore, it mus
25fa0 74 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 28  t be available (
25fb0 69 2e 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 20  i.e...        # 
25fc0 20 20 20 20 20 20 65 76 65 6e 20 74 68 6f 75 67        even thoug
25fd0 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 74 75  h it should retu
25fe0 72 6e 20 61 20 66 61 69 6c 75 72 65 20 72 65 74  rn a failure ret
25ff0 75 72 6e 20 63 6f 64 65 20 69 6e 20 74 68 69 73  urn code in this
26000 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
26010 20 20 63 61 73 65 29 2e 0d 0a 20 20 20 20 20 20    case)...      
26020 20 20 23 0d 0a 20 20 20 20 20 20 20 20 61 64 64    #..        add
26030 43 6f 6e 73 74 72 61 69 6e 74 20 73 71 6c 69 74  Constraint sqlit
26040 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
26050 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
26060 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
26070 20 79 65 73 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20   yes\n....      
26080 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
26090 4f 54 45 3a 20 44 6f 65 73 20 6f 75 72 20 63 61  OTE: Does our ca
260a0 6c 6c 65 72 20 77 61 6e 74 20 74 6f 20 72 65 73  ller want to res
260b0 65 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 69  et the directori
260c0 65 73 3f 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  es?..        #..
260d0 20 20 20 20 20 20 20 20 69 66 20 7b 24 72 65 73          if {$res
260e0 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  et} then {..    
260f0 20 20 20 20 20 20 72 65 73 65 74 53 51 4c 69 74        resetSQLit
26100 65 44 69 72 65 63 74 6f 72 69 65 73 20 24 63 68  eDirectories $ch
26110 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 20 20 20 20  annel true..    
26120 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 20 65      }..      } e
26130 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 74  lse {..        t
26140 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 6e 6f  puts $channel no
26150 5c 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d  \n....        #.
26160 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
26170 20 44 6f 65 73 20 6f 75 72 20 63 61 6c 6c 65 72   Does our caller
26180 20 77 61 6e 74 20 74 6f 20 72 65 73 65 74 20 74   want to reset t
26190 68 65 20 64 69 72 65 63 74 6f 72 69 65 73 3f 20  he directories? 
261a0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 0d 0a   This can only..
261b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
261c0 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  be performed if 
261d0 53 51 4c 69 74 65 20 69 73 20 6c 6f 61 64 65 64  SQLite is loaded
261e0 20 61 6e 64 20 72 65 61 64 79 20 66 6f 72 20 75   and ready for u
261f0 73 65 20 62 79 20 74 68 65 20 74 65 73 74 0d 0a  se by the test..
26200 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
26210 73 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20  suite...        
26220 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24  #..        if {$
26230 72 65 73 65 74 20 26 26 20 5b 69 73 53 51 4c 69  reset && [isSQLi
26240 74 65 52 65 61 64 79 5d 7d 20 74 68 65 6e 20 7b  teReady]} then {
26250 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 65  ..          rese
26260 74 53 51 4c 69 74 65 44 69 72 65 63 74 6f 72 69  tSQLiteDirectori
26270 65 73 20 24 63 68 61 6e 6e 65 6c 20 66 61 6c 73  es $channel fals
26280 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  e..        }..  
26290 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23      }....      #
262a0 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20  ..      # NOTE: 
262b0 46 69 6e 61 6c 6c 79 2c 20 73 68 6f 77 20 74 68  Finally, show th
262c0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
262d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
262e0 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 0d 0a 20  and temporary.. 
262f0 20 20 20 20 20 23 20 20 20 20 20 20 20 64 69 72       #       dir
26300 65 63 74 6f 72 69 65 73 2e 20 20 54 68 69 73 20  ectories.  This 
26310 63 61 6e 20 6f 6e 6c 79 20 62 65 20 70 65 72 66  can only be perf
26320 6f 72 6d 65 64 20 69 66 20 53 51 4c 69 74 65 20  ormed if SQLite 
26330 69 73 20 6c 6f 61 64 65 64 0d 0a 20 20 20 20 20  is loaded..     
26340 20 23 20 20 20 20 20 20 20 61 6e 64 20 72 65 61   #       and rea
26350 64 79 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  dy for use by th
26360 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
26370 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
26380 20 7b 5b 69 73 53 51 4c 69 74 65 52 65 61 64 79   {[isSQLiteReady
26390 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
263a0 20 20 20 66 6f 72 65 61 63 68 20 64 69 72 65 63     foreach direc
263b0 74 6f 72 79 20 5b 6c 69 73 74 20 64 61 74 61 5f  tory [list data_
263c0 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 20  store_directory 
263d0 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65 63  temp_store_direc
263e0 74 6f 72 79 5d 20 7b 0d 0a 20 20 20 20 20 20 20  tory] {..       
263f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
26400 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 2d  l [appendArgs "-
26410 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 22 20 24  --- checking " $
26420 64 69 72 65 63 74 6f 72 79 20 22 2e 2e 2e 20 22  directory "... "
26430 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
26440 65 74 20 73 71 6c 20 5b 61 70 70 65 6e 64 41 72  et sql [appendAr
26450 67 73 20 22 50 52 41 47 4d 41 20 22 20 24 64 69  gs "PRAGMA " $di
26460 72 65 63 74 6f 72 79 20 5c 3b 5d 0d 0a 0d 0a 20  rectory \;].... 
26470 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 63 61           if {[ca
26480 74 63 68 20 7b 65 78 65 63 75 74 65 53 71 6c 20  tch {executeSql 
26490 24 73 71 6c 20 73 63 61 6c 61 72 7d 20 72 65 73  $sql scalar} res
264a0 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ult] == 0} then 
264b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
264c0 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61  puts $channel [a
264d0 70 70 65 6e 64 41 72 67 73 20 22 6f 6b 3a 20 5c  ppendArgs "ok: \
264e0 22 22 20 24 72 65 73 75 6c 74 20 5c 22 5c 6e 5d  "" $result \"\n]
264f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
26500 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
26510 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c    tputs $channel
26520 20 5b 61 70 70 65 6e 64 41 72 67 73 20 22 65 72   [appendArgs "er
26530 72 6f 72 3a 20 22 20 5c 6e 5c 74 20 24 72 65 73  ror: " \n\t $res
26540 75 6c 74 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ult \n]..       
26550 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
26560 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d  .      }..    }.
26570 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6c 6f 61  ....    proc loa
26580 64 53 51 4c 69 74 65 54 65 73 74 53 65 74 74 69  dSQLiteTestSetti
26590 6e 67 73 20 7b 20 63 68 61 6e 6e 65 6c 20 7b 73  ngs { channel {s
265a0 75 66 66 69 78 20 22 22 7d 20 7b 71 75 69 65 74  uffix ""} {quiet
265b0 20 66 61 6c 73 65 7d 20 7d 20 7b 0d 0a 20 20 20   false} } {..   
265c0 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f     #..      # NO
265d0 54 45 3a 20 53 6b 69 70 20 6c 6f 61 64 69 6e 67  TE: Skip loading
265e0 20 74 68 65 20 73 65 74 74 69 6e 67 73 20 69 66   the settings if
265f0 20 74 68 65 69 72 20 75 73 61 67 65 20 68 61 73   their usage has
26600 20 62 65 65 6e 20 64 69 73 61 62 6c 65 64 2e 0d   been disabled..
26610 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20  .      #..      
26620 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
26630 73 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 54 65 73  s ::no(sqliteTes
26640 74 53 65 74 74 69 6e 67 73 29 5d 7d 20 74 68 65  tSettings)]} the
26650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  n {..        #..
26660 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
26670 4c 6f 61 64 20 63 75 73 74 6f 6d 20 70 65 72 2d  Load custom per-
26680 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d  user and/or per-
26690 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69 6e  host test settin
266a0 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20  gs now...       
266b0 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
266c0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 74  [info exists ::t
266d0 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75 73 65 72  cl_platform(user
266e0 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
266f0 20 20 20 20 20 20 73 65 74 20 75 73 65 72 53 65        set userSe
26700 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 5b  ttingsFileName [
26710 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 43 6f  file join [getCo
26720 6d 6d 6f 6e 44 69 72 65 63 74 6f 72 79 5d 20 5c  mmonDirectory] \
26730 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26740 5b 61 70 70 65 6e 64 41 72 67 73 20 73 65 74 74  [appendArgs sett
26750 69 6e 67 73 20 24 73 75 66 66 69 78 20 2e 20 24  ings $suffix . $
26760 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 75  ::tcl_platform(u
26770 73 65 72 29 20 2e 65 61 67 6c 65 5d 5d 0d 0a 0d  ser) .eagle]]...
26780 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
26790 66 69 6c 65 20 65 78 69 73 74 73 20 24 75 73 65  file exists $use
267a0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
267b0 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
267c0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
267d0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
267e0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
267f0 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e   $channel [appen
26800 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
26810 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
26820 20 6c 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65   loading per-use
26830 72 20 74 65 73 74 20 73 65 74 74 69 6e 67 73 20  r test settings 
26840 66 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20  file \"" \..    
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 75                $u
26860 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
26870 61 6d 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 20 20  ame \"...\n]..  
26880 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
26890 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
268a0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
268b0 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
268c0 20 5b 6c 69 73 74 20 73 6f 75 72 63 65 20 24 75   [list source $u
268d0 73 65 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e  serSettingsFileN
268e0 61 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  ame]..          
268f0 20 20 7d 20 65 72 72 6f 72 5d 7d 20 74 68 65 6e    } error]} then
26900 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
26910 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d 20 74    if {!$quiet} t
26920 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
26930 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
26940 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26950 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
26960 20 20 20 20 20 20 20 20 20 22 3d 3d 3d 3d 20 57           "==== W
26970 41 52 4e 49 4e 47 3a 20 66 61 69 6c 65 64 20 74  ARNING: failed t
26980 6f 20 6c 6f 61 64 20 70 65 72 2d 75 73 65 72 20  o load per-user 
26990 73 65 74 74 69 6e 67 73 20 66 69 6c 65 20 5c 22  settings file \"
269a0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
269b0 20 20 20 20 20 20 20 20 20 24 75 73 65 72 53 65           $userSe
269c0 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d 65 20 22  ttingsFileName "
269d0 5c 22 2c 20 65 72 72 6f 72 3a 20 22 20 5c 6e 5c  \", error: " \n\
269e0 74 20 24 65 72 72 6f 72 20 5c 6e 5d 0d 0a 20 20  t $error \n]..  
269f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
26a00 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
26a10 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
26a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26a30 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
26a40 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26a50 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
26a60 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 22 2d 2d 2d 2d 20 73 6b 69 70 70 65 64 20 6c   "---- skipped l
26a90 6f 61 64 69 6e 67 20 70 65 72 2d 75 73 65 72 20  oading per-user 
26aa0 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 66 69  test settings fi
26ab0 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20  le \"" \..      
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 24 75 73 65              $use
26ad0 72 53 65 74 74 69 6e 67 73 46 69 6c 65 4e 61 6d  rSettingsFileNam
26ae0 65 20 22 5c 22 2c 20 69 74 20 64 6f 65 73 20 6e  e "\", it does n
26af0 6f 74 20 65 78 69 73 74 5c 6e 22 5d 0d 0a 20 20  ot exist\n"]..  
26b00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
26b10 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26b20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
26b30 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26b40 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26b50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26b60 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
26b70 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20 20 20  ######....      
26b80 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
26b90 74 73 20 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72  ts ::tcl_platfor
26ba0 6d 28 68 6f 73 74 29 5d 7d 20 74 68 65 6e 20 7b  m(host)]} then {
26bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
26bc0 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
26bd0 4e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  Name [file join 
26be0 5b 67 65 74 43 6f 6d 6d 6f 6e 44 69 72 65 63 74  [getCommonDirect
26bf0 6f 72 79 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20  ory] \..        
26c00 20 20 20 20 20 20 5b 61 70 70 65 6e 64 41 72 67        [appendArg
26c10 73 20 73 65 74 74 69 6e 67 73 20 24 73 75 66 66  s settings $suff
26c20 69 78 20 2e 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  ix . $::tcl_plat
26c30 66 6f 72 6d 28 68 6f 73 74 29 20 2e 65 61 67 6c  form(host) .eagl
26c40 65 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e]]....         
26c50 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69 73 74   if {[file exist
26c60 73 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46  s $hostSettingsF
26c70 69 6c 65 4e 61 6d 65 5d 7d 20 74 68 65 6e 20 7b  ileName]} then {
26c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26c90 20 7b 21 24 71 75 69 65 74 7d 20 74 68 65 6e 20   {!$quiet} then 
26ca0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
26cb0 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
26cc0 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 22 2d 2d 2d 2d 20 6c 6f 61 64 69 6e 67 20 70   "---- loading p
26cf0 65 72 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74  er-host test set
26d00 74 69 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c  tings file \"" \
26d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26d20 20 20 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67      $hostSetting
26d30 73 46 69 6c 65 4e 61 6d 65 20 5c 22 2e 2e 2e 5c  sFileName \"...\
26d40 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
26d50 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
26d60 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20   if {[catch {.. 
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70 6c               upl
26d80 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 73 6f 75  evel 1 [list sou
26d90 72 63 65 20 24 68 6f 73 74 53 65 74 74 69 6e 67  rce $hostSetting
26da0 73 46 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20  sFileName]..    
26db0 20 20 20 20 20 20 20 20 7d 20 65 72 72 6f 72 5d          } error]
26dc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
26dd0 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 71 75          if {!$qu
26de0 69 65 74 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  iet} then {..   
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75               tpu
26e00 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70  ts $channel [app
26e10 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26e30 3d 3d 3d 3d 20 57 41 52 4e 49 4e 47 3a 20 66 61  ==== WARNING: fa
26e40 69 6c 65 64 20 74 6f 20 6c 6f 61 64 20 70 65 72  iled to load per
26e50 2d 68 6f 73 74 20 73 65 74 74 69 6e 67 73 20 66  -host settings f
26e60 69 6c 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20  ile \"" \..     
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
26e80 68 6f 73 74 53 65 74 74 69 6e 67 73 46 69 6c 65  hostSettingsFile
26e90 4e 61 6d 65 20 22 5c 22 2c 20 65 72 72 6f 72 3a  Name "\", error:
26ea0 20 22 20 5c 6e 5c 74 20 24 65 72 72 6f 72 20 5c   " \n\t $error \
26eb0 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n]..            
26ec0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
26ed0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20   }..          } 
26ee0 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20  else {..        
26ef0 20 20 20 20 69 66 20 7b 21 24 71 75 69 65 74 7d      if {!$quiet}
26f00 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
26f10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
26f20 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
26f30 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
26f40 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6b 69         "---- ski
26f50 70 70 65 64 20 6c 6f 61 64 69 6e 67 20 70 65 72  pped loading per
26f60 2d 68 6f 73 74 20 74 65 73 74 20 73 65 74 74 69  -host test setti
26f70 6e 67 73 20 66 69 6c 65 20 5c 22 22 20 5c 0d 0a  ngs file \"" \..
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 24 68 6f 73 74 53 65 74 74 69 6e 67 73 46    $hostSettingsF
26fa0 69 6c 65 4e 61 6d 65 20 22 5c 22 2c 20 69 74 20  ileName "\", it 
26fb0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 5c 6e  does not exist\n
26fc0 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
26fd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
26fe0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26ff0 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20   }..    }.....  
27000 20 20 70 72 6f 63 20 63 6f 70 79 53 61 6d 70 6c    proc copySampl
27010 65 44 61 74 61 62 61 73 65 46 69 6c 65 73 20 7b  eDatabaseFiles {
27020 7d 20 7b 0d 0a 20 20 20 20 20 20 75 70 6c 65 76  } {..      uplev
27030 65 6c 20 31 20 7b 0d 0a 20 20 20 20 20 20 20 20  el 1 {..        
27040 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
27050 45 3a 20 43 6f 70 79 20 28 6f 72 20 72 65 2d 63  E: Copy (or re-c
27060 6f 70 79 29 20 74 68 65 20 72 65 66 65 72 65 6e  opy) the referen
27070 63 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ce database file
27080 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 0d 0a   used for this..
27090 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
270a0 75 6e 69 74 20 74 65 73 74 20 74 6f 20 74 68 65  unit test to the
270b0 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79   build directory
270c0 20 69 6e 20 63 61 73 65 20 69 74 20 68 61 73 20   in case it has 
270d0 62 65 65 6e 20 63 68 61 6e 67 65 64 0d 0a 20 20  been changed..  
270e0 20 20 20 20 20 20 23 20 20 20 20 20 20 20 62 79        #       by
270f0 20 61 20 70 72 65 76 69 6f 75 73 20 74 65 73 74   a previous test
27100 20 72 75 6e 2e 0d 0a 20 20 20 20 20 20 20 20 23   run...        #
27110 0d 0a 20 20 20 20 20 20 20 20 66 69 6c 65 20 63  ..        file c
27120 6f 70 79 20 2d 66 6f 72 63 65 20 24 6e 6f 72 74  opy -force $nort
27130 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20 5c 0d  hwindEfDbFile \.
27140 0a 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65  .          [file
27150 20 6a 6f 69 6e 20 5b 67 65 74 42 75 69 6c 64 44   join [getBuildD
27160 69 72 65 63 74 6f 72 79 20 74 72 75 65 5d 20 5b  irectory true] [
27170 66 69 6c 65 20 74 61 69 6c 20 24 6e 6f 72 74 68  file tail $north
27180 77 69 6e 64 45 66 44 62 46 69 6c 65 5d 5d 0d 0a  windEfDbFile]]..
27190 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a        }..    }..
271a0 0c 0d 0a 20 20 20 20 70 72 6f 63 20 6d 6f 76 65  ...    proc move
271b0 54 65 73 74 4c 6f 67 46 69 6c 65 20 7b 20 70 61  TestLogFile { pa
271c0 74 68 20 7d 20 7b 0d 0a 20 20 20 20 20 20 69 66  th } {..      if
271d0 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a   {[info exists :
271e0 3a 74 65 73 74 5f 6c 6f 67 5d 20 26 26 20 5b 66  :test_log] && [f
271f0 69 6c 65 20 65 78 69 73 74 73 20 24 3a 3a 74 65  ile exists $::te
27200 73 74 5f 6c 6f 67 5d 7d 20 74 68 65 6e 20 7b 0d  st_log]} then {.
27210 0a 20 20 20 20 20 20 20 20 73 65 74 20 6f 6c 64  .        set old
27220 5f 74 65 73 74 5f 6c 6f 67 20 24 3a 3a 74 65 73  _test_log $::tes
27230 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20 20 73  t_log..        s
27240 65 74 20 6e 65 77 5f 74 65 73 74 5f 6c 6f 67 20  et new_test_log 
27250 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68  [file join $path
27260 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 6f 6c 64   [file tail $old
27270 5f 74 65 73 74 5f 6c 6f 67 5d 5d 0d 0a 0d 0a 20  _test_log]].... 
27280 20 20 20 20 20 20 20 66 69 6c 65 20 63 6f 70 79         file copy
27290 20 24 6f 6c 64 5f 74 65 73 74 5f 6c 6f 67 20 24   $old_test_log $
272a0 6e 65 77 5f 74 65 73 74 5f 6c 6f 67 3b 20 66 69  new_test_log; fi
272b0 6c 65 20 64 65 6c 65 74 65 20 24 6f 6c 64 5f 74  le delete $old_t
272c0 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
272d0 20 73 65 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 20   set ::test_log 
272e0 24 6e 65 77 5f 74 65 73 74 5f 6c 6f 67 0d 0a 0d  $new_test_log...
272f0 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 69 6e  .        if {[in
27300 66 6f 20 65 78 69 73 74 73 20 3a 3a 74 65 73 74  fo exists ::test
27310 5f 6c 6f 67 5f 70 61 74 68 5d 7d 20 74 68 65 6e  _log_path]} then
27320 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   {..          se
27330 74 20 3a 3a 74 65 73 74 5f 6c 6f 67 5f 70 61 74  t ::test_log_pat
27340 68 20 24 70 61 74 68 0d 0a 20 20 20 20 20 20 20  h $path..       
27350 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 74 70   }....        tp
27360 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
27370 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
27380 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  \..            "
27390 2d 2d 2d 2d 20 6d 6f 76 65 64 20 74 65 73 74 20  ---- moved test 
273a0 6c 6f 67 20 66 72 6f 6d 20 5c 22 22 20 24 6f 6c  log from \"" $ol
273b0 64 5f 74 65 73 74 5f 6c 6f 67 20 22 5c 22 20 74  d_test_log "\" t
273c0 6f 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  o \"" \..       
273d0 20 20 20 20 20 24 6e 65 77 5f 74 65 73 74 5f 6c       $new_test_l
273e0 6f 67 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20  og \"\n]..      
273f0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
27400 20 70 72 6f 63 20 73 68 6f 77 53 51 4c 69 74 65   proc showSQLite
27410 42 75 69 6c 64 50 61 72 61 6d 65 74 65 72 73 20  BuildParameters 
27420 7b 20 63 68 61 6e 6e 65 6c 20 7d 20 7b 0d 0a 20  { channel } {.. 
27430 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 23 20       #..      # 
27440 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
27450 68 65 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20  he native build 
27460 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 66 6f  flag has been fo
27470 72 63 69 62 6c 79 20 73 65 74 2e 0d 0a 20 20 20  rcibly set...   
27480 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74     #..      tput
27490 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20  s $channel \..  
274a0 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
274b0 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
274c0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
274d0 69 6c 64 20 6e 61 74 69 76 65 20 6f 76 65 72 72  ild native overr
274e0 69 64 65 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  ide... "....    
274f0 20 20 73 65 74 20 6e 61 74 69 76 65 20 5b 67 65    set native [ge
27500 74 42 75 69 6c 64 4e 61 74 69 76 65 5d 0d 0a 0d  tBuildNative]...
27510 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
27520 6e 67 20 6c 65 6e 67 74 68 20 24 6e 61 74 69 76  ng length $nativ
27530 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  e] > 0} then {..
27540 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
27550 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
27560 73 20 62 75 69 6c 64 4e 61 74 69 76 65 2e 20 24  s buildNative. $
27570 6e 61 74 69 76 65 5d 0d 0a 20 20 20 20 20 20 20  native]..       
27580 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
27590 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24  [appendArgs \" $
275a0 6e 61 74 69 76 65 20 5c 22 5c 6e 5d 0d 0a 20 20  native \"\n]..  
275b0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20      } else {..  
275c0 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
275d0 69 6e 74 20 62 75 69 6c 64 4e 61 74 69 76 65 2e  int buildNative.
275e0 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70  none..        tp
275f0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f  uts $channel <no
27600 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ne>\n..      }..
27610 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
27620 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
27630 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
27640 20 79 65 61 72 2e 20 20 42 61 73 69 63 61 6c 6c   year.  Basicall
27650 79 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  y, this indicate
27660 73 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  s..      #      
27670 20 77 68 69 63 68 20 76 65 72 73 69 6f 6e 20 6f   which version o
27680 66 20 4d 53 42 75 69 6c 64 20 61 6e 64 2f 6f 72  f MSBuild and/or
27690 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 77   Visual Studio w
276a0 61 73 20 75 73 65 64 20 74 6f 0d 0a 20 20 20 20  as used to..    
276b0 20 20 23 20 20 20 20 20 20 20 63 6f 6d 70 69 6c    #       compil
276c0 65 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  e the assembly b
276d0 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
276e0 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  st...      #..  
276f0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27700 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
27710 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
27720 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
27730 51 4c 69 74 65 20 62 75 69 6c 64 20 79 65 61 72  QLite build year
27740 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 73  ... "....      s
27750 65 74 20 79 65 61 72 20 5b 67 65 74 42 75 69 6c  et year [getBuil
27760 64 59 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  dYear]....      
27770 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
27780 74 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20 74  th $year] > 0} t
27790 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
277a0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
277b0 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 59 65  pendArgs buildYe
277c0 61 72 2e 20 24 79 65 61 72 5d 0d 0a 20 20 20 20  ar. $year]..    
277d0 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
277e0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
277f0 22 20 24 79 65 61 72 20 5c 22 5c 6e 5d 0d 0a 20  " $year \"\n].. 
27800 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
27810 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
27820 61 69 6e 74 20 62 75 69 6c 64 59 65 61 72 2e 6e  aint buildYear.n
27830 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70 75  one..        tpu
27840 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e  ts $channel <non
27850 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  e>\n..      }...
27860 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68  .      tputs $ch
27870 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20  annel \..       
27880 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e     "---- checkin
27890 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61 74  g for System.Dat
278a0 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20 6e  a.SQLite build n
278b0 61 74 69 76 65 20 79 65 61 72 2e 2e 2e 20 22 0d  ative year... ".
278c0 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 79 65 61  ...      set yea
278d0 72 20 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76  r [getBuildNativ
278e0 65 59 65 61 72 5d 0d 0a 0d 0a 20 20 20 20 20 20  eYear]....      
278f0 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
27900 74 68 20 24 79 65 61 72 5d 20 3e 20 30 7d 20 74  th $year] > 0} t
27910 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  hen {..        a
27920 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  ddConstraint [ap
27930 70 65 6e 64 41 72 67 73 20 62 75 69 6c 64 4e 61  pendArgs buildNa
27940 74 69 76 65 59 65 61 72 2e 20 24 79 65 61 72 5d  tiveYear. $year]
27950 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20  ..        tputs 
27960 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  $channel [append
27970 41 72 67 73 20 5c 22 20 24 79 65 61 72 20 5c 22  Args \" $year \"
27980 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73  \n]..      } els
27990 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64  e {..        add
279a0 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64  Constraint build
279b0 4e 61 74 69 76 65 59 65 61 72 2e 6e 6f 6e 65 0d  NativeYear.none.
279c0 0a 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24  .        tputs $
279d0 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e  channel <none>\n
279e0 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
279f0 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
27a00 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 22  l \..          "
27a10 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66 6f  ---- checking fo
27a20 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  r System.Data.SQ
27a30 4c 69 74 65 20 62 75 69 6c 64 20 70 6c 61 74 66  Lite build platf
27a40 6f 72 6d 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20  orm... "....    
27a50 20 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b    set platform [
27a60 67 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d  getBuildPlatform
27a70 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
27a80 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67  if {[string leng
27a90 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20  th $platform] > 
27aa0 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
27ab0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
27ac0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
27ad0 6c 64 50 6c 61 74 66 6f 72 6d 2e 20 24 70 6c 61  ldPlatform. $pla
27ae0 74 66 6f 72 6d 5d 0d 0a 20 20 20 20 20 20 20 20  tform]..        
27af0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
27b00 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 70  appendArgs \" $p
27b10 6c 61 74 66 6f 72 6d 20 5c 22 5c 6e 5d 0d 0a 20  latform \"\n].. 
27b20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20       } else {.. 
27b30 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72         addConstr
27b40 61 69 6e 74 20 62 75 69 6c 64 50 6c 61 74 66 6f  aint buildPlatfo
27b50 72 6d 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20  rm.none..       
27b60 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
27b70 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20  <none>\n..      
27b80 7d 0d 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 61  }....      set a
27b90 72 63 68 69 74 65 63 74 75 72 65 20 5b 61 72 63  rchitecture [arc
27ba0 68 69 74 65 63 74 75 72 65 46 6f 72 50 6c 61 74  hitectureForPlat
27bb0 66 6f 72 6d 20 24 70 6c 61 74 66 6f 72 6d 5d 0d  form $platform].
27bc0 0a 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24  ...      tputs $
27bd0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
27be0 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b       "---- check
27bf0 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44  ing for System.D
27c00 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64  ata.SQLite build
27c10 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 2e 2e   architecture...
27c20 20 22 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b   "....      if {
27c30 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
27c40 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e 20  architecture] > 
27c50 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  0} then {..     
27c60 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
27c70 20 5b 61 70 70 65 6e 64 41 72 67 73 20 62 75 69   [appendArgs bui
27c80 6c 64 41 72 63 68 69 74 65 63 74 75 72 65 2e 20  ldArchitecture. 
27c90 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 0d 0a  $architecture]..
27ca0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63          tputs $c
27cb0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
27cc0 67 73 20 5c 22 20 24 61 72 63 68 69 74 65 63 74  gs \" $architect
27cd0 75 72 65 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  ure \"\n]..     
27ce0 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20   } else {..     
27cf0 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74     addConstraint
27d00 20 62 75 69 6c 64 41 72 63 68 69 74 65 63 74 75   buildArchitectu
27d10 72 65 2e 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20  re.none..       
27d20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20   tputs $channel 
27d30 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20  <none>\n..      
27d40 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  }....      #..  
27d50 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63      # NOTE: Chec
27d60 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 75  k the current bu
27d70 69 6c 64 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  ild .NET Framewo
27d80 72 6b 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 20  rk.  Basically, 
27d90 74 68 69 73 0d 0a 20 20 20 20 20 20 23 20 20 20  this..      #   
27da0 20 20 20 20 69 6e 64 69 63 61 74 65 73 20 77 68      indicates wh
27db0 69 63 68 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ich version of t
27dc0 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  he .NET Framewor
27dd0 6b 20 69 73 20 62 65 69 6e 67 0d 0a 20 20 20 20  k is being..    
27de0 20 20 23 20 20 20 20 20 20 20 75 73 65 64 20 62    #       used b
27df0 79 20 74 68 65 20 61 73 73 65 6d 62 6c 79 20 62  y the assembly b
27e00 69 6e 61 72 69 65 73 20 75 6e 64 65 72 20 74 65  inaries under te
27e10 73 74 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  st...      #..  
27e20 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
27e30 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  el \..          
27e40 22 2d 2d 2d 2d 20 63 68 65 63 6b 69 6e 67 20 66  "---- checking f
27e50 6f 72 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  or System.Data.S
27e60 51 4c 69 74 65 20 62 75 69 6c 64 20 2e 4e 45 54  QLite build .NET
27e70 20 46 72 61 6d 65 77 6f 72 6b 2e 2e 2e 20 22 0d   Framework... ".
27e80 0a 0d 0a 20 20 20 20 20 20 73 65 74 20 6e 65 74  ...      set net
27e90 46 78 20 5b 67 65 74 42 75 69 6c 64 4e 65 74 46  Fx [getBuildNetF
27ea0 78 5d 0d 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b  x]....      if {
27eb0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
27ec0 6e 65 74 46 78 5d 20 3e 20 30 7d 20 74 68 65 6e  netFx] > 0} then
27ed0 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
27ee0 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
27ef0 64 41 72 67 73 20 62 75 69 6c 64 46 72 61 6d 65  dArgs buildFrame
27f00 77 6f 72 6b 2e 20 24 6e 65 74 46 78 5d 0d 0a 20  work. $netFx].. 
27f10 20 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68         tputs $ch
27f20 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
27f30 73 20 5c 22 20 24 6e 65 74 46 78 20 5c 22 5c 6e  s \" $netFx \"\n
27f40 5d 0d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  ]..      } else 
27f50 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f  {..        addCo
27f60 6e 73 74 72 61 69 6e 74 20 62 75 69 6c 64 46 72  nstraint buildFr
27f70 61 6d 65 77 6f 72 6b 2e 6e 6f 6e 65 0d 0a 20 20  amework.none..  
27f80 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
27f90 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20  nnel <none>\n.. 
27fa0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27fb0 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  #..      # NOTE:
27fc0 20 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65   Check the curre
27fd0 6e 74 20 62 75 69 6c 64 20 63 6f 6e 66 69 67 75  nt build configu
27fe0 72 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 73 68  ration.  This sh
27ff0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20  ould normally.. 
28000 20 20 20 20 20 23 20 20 20 20 20 20 20 62 65 20       #       be 
28010 65 69 74 68 65 72 20 22 44 65 62 75 67 22 20 6f  either "Debug" o
28020 72 20 22 52 65 6c 65 61 73 65 22 2e 0d 0a 20 20  r "Release"...  
28030 20 20 20 20 23 0d 0a 20 20 20 20 20 20 74 70 75      #..      tpu
28040 74 73 20 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  ts $channel \.. 
28050 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
28060 68 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74  hecking for Syst
28070 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62  em.Data.SQLite b
28080 75 69 6c 64 20 63 6f 6e 66 69 67 75 72 61 74 69  uild configurati
28090 6f 6e 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  on... "....     
280a0 20 73 65 74 20 63 6f 6e 66 69 67 75 72 61 74 69   set configurati
280b0 6f 6e 20 5b 67 65 74 42 75 69 6c 64 43 6f 6e 66  on [getBuildConf
280c0 69 67 75 72 61 74 69 6f 6e 5d 0d 0a 0d 0a 20 20  iguration]....  
280d0 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20      if {[string 
280e0 6c 65 6e 67 74 68 20 24 63 6f 6e 66 69 67 75 72  length $configur
280f0 61 74 69 6f 6e 5d 20 3e 20 30 7d 20 74 68 65 6e  ation] > 0} then
28100 20 7b 0d 0a 20 20 20 20 20 20 20 20 61 64 64 43   {..        addC
28110 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
28120 64 41 72 67 73 20 62 75 69 6c 64 43 6f 6e 66 69  dArgs buildConfi
28130 67 75 72 61 74 69 6f 6e 2e 20 24 63 6f 6e 66 69  guration. $confi
28140 67 75 72 61 74 69 6f 6e 5d 0d 0a 20 20 20 20 20  guration]..     
28150 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e 65     tputs $channe
28160 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 22  l [appendArgs \"
28170 20 24 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20   $configuration 
28180 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d 20 65  \"\n]..      } e
28190 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 61  lse {..        a
281a0 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62 75 69  ddConstraint bui
281b0 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  ldConfiguration.
281c0 6e 6f 6e 65 0d 0a 20 20 20 20 20 20 20 20 74 70  none..        tp
281d0 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f  uts $channel <no
281e0 6e 65 3e 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a  ne>\n..      }..
281f0 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20  ..      #..     
28200 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74   # NOTE: Check t
28210 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
28220 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
28230 75 66 66 69 78 2e 20 20 54 68 69 73 20 77 69 6c  uffix.  This wil
28240 6c 0d 0a 20 20 20 20 20 20 23 20 20 20 20 20 20  l..      #      
28250 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 65 69 74   normally be eit
28260 68 65 72 20 22 4e 65 74 53 74 61 6e 64 61 72 64  her "NetStandard
28270 32 30 22 20 6f 72 20 61 6e 20 65 6d 70 74 79 20  20" or an empty 
28280 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20 20 23  string...      #
28290 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20 24 63  ..      tputs $c
282a0 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
282b0 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63 6b 69      "---- checki
282c0 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e 44 61  ng for System.Da
282d0 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c 64 20  ta.SQLite build 
282e0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 75  configuration su
282f0 66 66 69 78 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20  ffix... "....   
28300 20 20 20 73 65 74 20 73 75 66 66 69 78 20 5b 67     set suffix [g
28310 65 74 42 75 69 6c 64 43 6f 6e 66 69 67 75 72 61  etBuildConfigura
28320 74 69 6f 6e 53 75 66 66 69 78 5d 0d 0a 0d 0a 20  tionSuffix].... 
28330 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67       if {[string
28340 20 6c 65 6e 67 74 68 20 24 73 75 66 66 69 78 5d   length $suffix]
28350 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20   > 0} then {..  
28360 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
28370 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20  int [appendArgs 
28380 62 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69  buildConfigurati
28390 6f 6e 53 75 66 66 69 78 2e 20 24 73 75 66 66 69  onSuffix. $suffi
283a0 78 5d 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74  x]..        tput
283b0 73 20 24 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  s $channel [appe
283c0 6e 64 41 72 67 73 20 5c 22 20 24 73 75 66 66 69  ndArgs \" $suffi
283d0 78 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 7d  x \"\n]..      }
283e0 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
283f0 20 61 64 64 43 6f 6e 73 74 72 61 69 6e 74 20 62   addConstraint b
28400 75 69 6c 64 43 6f 6e 66 69 67 75 72 61 74 69 6f  uildConfiguratio
28410 6e 53 75 66 66 69 78 2e 6e 6f 6e 65 0d 0a 20 20  nSuffix.none..  
28420 20 20 20 20 20 20 74 70 75 74 73 20 24 63 68 61        tputs $cha
28430 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20  nnel <none>\n.. 
28440 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
28450 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
28460 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
28470 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68          "---- ch
28480 65 63 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65  ecking for Syste
28490 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75  m.Data.SQLite bu
284a0 69 6c 64 20 6e 61 74 69 76 65 20 63 6f 6e 66 69  ild native confi
284b0 67 75 72 61 74 69 6f 6e 20 22 20 5c 0d 0a 20 20  guration " \..  
284c0 20 20 20 20 20 20 20 20 22 73 75 66 66 69 78 2e          "suffix.
284d0 2e 2e 20 22 5d 0d 0a 0d 0a 20 20 20 20 20 20 73  .. "]....      s
284e0 65 74 20 73 75 66 66 69 78 20 5b 67 65 74 42 75  et suffix [getBu
284f0 69 6c 64 4e 61 74 69 76 65 43 6f 6e 66 69 67 75  ildNativeConfigu
28500 72 61 74 69 6f 6e 53 75 66 66 69 78 5d 0d 0a 0d  rationSuffix]...
28510 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69  .      if {[stri
28520 6e 67 20 6c 65 6e 67 74 68 20 24 73 75 66 66 69  ng length $suffi
28530 78 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  x] > 0} then {..
28540 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74          addConst
28550 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67  raint [appendArg
28560 73 20 62 75 69 6c 64 4e 61 74 69 76 65 43 6f 6e  s buildNativeCon
28570 66 69 67 75 72 61 74 69 6f 6e 53 75 66 66 69 78  figurationSuffix
28580 2e 20 24 73 75 66 66 69 78 5d 0d 0a 20 20 20 20  . $suffix]..    
28590 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
285a0 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c  el [appendArgs \
285b0 22 20 24 73 75 66 66 69 78 20 5c 22 5c 6e 5d 0d  " $suffix \"\n].
285c0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d  .      } else {.
285d0 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
285e0 74 72 61 69 6e 74 20 62 75 69 6c 64 4e 61 74 69  traint buildNati
285f0 76 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 53  veConfigurationS
28600 75 66 66 69 78 2e 6e 6f 6e 65 0d 0a 20 20 20 20  uffix.none..    
28610 20 20 20 20 74 70 75 74 73 20 24 63 68 61 6e 6e      tputs $chann
28620 65 6c 20 3c 6e 6f 6e 65 3e 5c 6e 0d 0a 20 20 20  el <none>\n..   
28630 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 23 0d     }....      #.
28640 0a 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43  .      # NOTE: C
28650 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
28660 20 62 75 69 6c 64 20 65 78 74 72 61 20 64 69 72   build extra dir
28670 65 63 74 6f 72 79 2e 20 20 54 68 69 73 20 77 69  ectory.  This wi
28680 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 0d 0a 20 20 20  ll normally..   
28690 20 20 20 23 20 20 20 20 20 20 20 62 65 20 65 69     #       be ei
286a0 74 68 65 72 20 22 6e 65 74 73 74 61 6e 64 61 72  ther "netstandar
286b0 64 32 2e 30 22 20 6f 72 20 61 6e 20 65 6d 70 74  d2.0" or an empt
286c0 79 20 73 74 72 69 6e 67 2e 0d 0a 20 20 20 20 20  y string...     
286d0 20 23 0d 0a 20 20 20 20 20 20 74 70 75 74 73 20   #..      tputs 
286e0 24 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20  $channel \..    
286f0 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 68 65 63        "---- chec
28700 6b 69 6e 67 20 66 6f 72 20 53 79 73 74 65 6d 2e  king for System.
28710 44 61 74 61 2e 53 51 4c 69 74 65 20 62 75 69 6c  Data.SQLite buil
28720 64 20 65 78 74 72 61 2e 2e 2e 20 22 0d 0a 0d 0a  d extra... "....
28730 20 20 20 20 20 20 73 65 74 20 65 78 74 72 61 20        set extra 
28740 5b 67 65 74 42 75 69 6c 64 45 78 74 72 61 5d 0d  [getBuildExtra].
28750 0a 0d 0a 20 20 20 20 20 20 69 66 20 7b 5b 73 74  ...      if {[st
28760 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 65 78 74  ring length $ext
28770 72 61 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  ra] > 0} then {.
28780 0a 20 20 20 20 20 20 20 20 61 64 64 43 6f 6e 73  .        addCons
28790 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
287a0 67 73 20 62 75 69 6c 64 45 78 74 72 61 2e 20 24  gs buildExtra. $
287b0 65 78 74 72 61 5d 0d 0a 20 20 20 20 20 20 20 20  extra]..        
287c0 74 70 75 74 73 20 24 63 68 61 6e 6e 65 6c 20 5b  tputs $channel [
287d0 61 70 70 65 6e 64 41 72 67 73 20 5c 22 20 24 65  appendArgs \" $e
287e0 78 74 72 61 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20  xtra \"\n]..    
287f0 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
28800 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61 69 6e      addConstrain
28810 74 20 62 75 69 6c 64 45 78 74 72 61 2e 6e 6f 6e  t buildExtra.non
28820 65 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74 73  e..        tputs
28830 20 24 63 68 61 6e 6e 65 6c 20 3c 6e 6f 6e 65 3e   $channel <none>
28840 5c 6e 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  \n..      }..   
28850 20 7d 0d 0a 0c 0d 0a 20 20 20 20 70 72 6f 63 20   }.....    proc 
28860 72 75 6e 53 51 4c 69 74 65 54 65 73 74 50 72 6f  runSQLiteTestPro
28870 6c 6f 67 75 65 20 7b 7d 20 7b 0d 0a 20 20 20 20  logue {} {..    
28880 20 20 23 0d 0a 20 20 20 20 20 20 23 20 4e 4f 54    #..      # NOT
28890 45 3a 20 53 6b 69 70 20 72 75 6e 6e 69 6e 67 20  E: Skip running 
288a0 6f 75 72 20 63 75 73 74 6f 6d 20 70 72 6f 6c 6f  our custom prolo
288b0 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  gue if the main 
288c0 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20 20  one has been..  
288d0 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69 70      #       skip
288e0 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a 20  ped...      #.. 
288f0 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
28900 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f 6c  exists ::no(prol
28910 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74 68  ogue.eagle)]} th
28920 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 23 0d  en {..        #.
28930 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28940 20 53 61 76 65 20 74 68 65 20 65 6e 76 69 72 6f   Save the enviro
28950 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20  nment variables 
28960 74 68 61 74 20 77 65 20 69 6e 74 65 6e 64 20 74  that we intend t
28970 6f 20 63 68 61 6e 67 65 20 66 6f 72 0d 0a 20 20  o change for..  
28980 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68        #       th
28990 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
289a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
289b0 20 20 73 61 76 65 45 6e 76 69 72 6f 6e 6d 65 6e    saveEnvironmen
289c0 74 56 61 72 69 61 62 6c 65 73 20 5c 0d 0a 20 20  tVariables \..  
289d0 20 20 20 20 20 20 20 20 20 20 5b 6c 69 73 74 20            [list 
289e0 49 6e 69 74 69 61 6c 69 7a 65 5f 53 51 4c 69 74  Initialize_SQLit
289f0 65 4c 6f 67 5d 20 3a 3a 74 65 73 74 53 75 69 74  eLog] ::testSuit
28a00 65 53 61 76 65 64 45 6e 76 0d 0a 0d 0a 20 20 20  eSavedEnv....   
28a10 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
28a20 23 20 4e 4f 54 45 3a 20 46 6f 72 63 65 20 74 68  # NOTE: Force th
28a30 65 20 6d 61 6e 61 67 65 64 20 6c 6f 67 67 69 6e  e managed loggin
28a40 67 20 73 75 62 73 79 73 74 65 6d 20 74 6f 20 61  g subsystem to a
28a50 74 74 65 6d 70 74 20 74 6f 20 69 6e 69 74 69 61  ttempt to initia
28a60 6c 69 7a 65 0d 0a 20 20 20 20 20 20 20 20 23 20  lize..        # 
28a70 20 20 20 20 20 20 69 74 73 65 6c 66 20 6d 6f 72        itself mor
28a80 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0d 0a 20 20  e than once...  
28a90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28aa0 20 73 65 74 20 3a 3a 65 6e 76 28 49 6e 69 74 69   set ::env(Initi
28ab0 61 6c 69 7a 65 5f 53 51 4c 69 74 65 4c 6f 67 29  alize_SQLiteLog)
28ac0 20 31 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   1....        #.
28ad0 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
28ae0 20 4c 6f 61 64 20 74 68 65 20 22 62 65 66 6f 72   Load the "befor
28af0 65 2d 63 6f 6e 73 74 72 61 69 6e 74 73 22 20 63  e-constraints" c
28b00 75 73 74 6f 6d 20 70 65 72 2d 75 73 65 72 20 61  ustom per-user a
28b10 6e 64 2f 6f 72 20 70 65 72 2d 68 6f 73 74 0d 0a  nd/or per-host..
28b20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
28b30 74 65 73 74 20 73 65 74 74 69 6e 67 73 20 6e 6f  test settings no
28b40 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  w...        #.. 
28b50 20 20 20 20 20 20 20 75 70 6c 65 76 65 6c 20 31         uplevel 1
28b60 20 5b 6c 69 73 74 20 6c 6f 61 64 53 51 4c 69 74   [list loadSQLit
28b70 65 54 65 73 74 53 65 74 74 69 6e 67 73 20 24 3a  eTestSettings $:
28b80 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 2e 62  :test_channel .b
28b90 65 66 6f 72 65 5d 0d 0a 0d 0a 20 20 20 20 20 20  efore]....      
28ba0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
28bb0 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20 6c  OTE: Show (and l
28bc0 6f 67 29 20 74 68 65 20 67 6c 6f 62 61 6c 20 70  og) the global p
28bd0 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 63  arameters that c
28be0 6f 6e 74 72 6f 6c 20 77 68 65 72 65 20 74 68 65  ontrol where the
28bf0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
28c00 20 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72    build director
28c10 79 20 73 68 6f 75 6c 64 20 62 65 2e 0d 0a 20 20  y should be...  
28c20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28c30 20 73 68 6f 77 53 51 4c 69 74 65 42 75 69 6c 64   showSQLiteBuild
28c40 50 61 72 61 6d 65 74 65 72 73 20 24 3a 3a 74 65  Parameters $::te
28c50 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
28c60 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28c70 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69   # NOTE: Check i
28c80 66 20 74 68 65 20 5b 6f 62 6a 65 63 74 5d 20 63  f the [object] c
28c90 6f 6d 6d 61 6e 64 20 69 73 20 61 76 61 69 6c 61  ommand is availa
28ca0 62 6c 65 3b 20 69 66 20 6e 6f 74 2c 20 61 64 64  ble; if not, add
28cb0 20 73 6f 6d 65 0d 0a 20 20 20 20 20 20 20 20 23   some..        #
28cc0 20 20 20 20 20 20 20 73 68 69 6d 73 20 74 6f 20         shims to 
28cd0 6d 61 6b 65 20 74 68 65 20 74 65 73 74 20 73 75  make the test su
28ce0 69 74 65 20 72 75 6e 20 73 6d 6f 6f 74 68 65 72  ite run smoother
28cf0 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28d00 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
28d10 4c 69 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e  LiteObjectComman
28d20 64 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  d $::test_channe
28d30 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  l....        #..
28d40 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28d50 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 61  Determine the na
28d60 6d 65 73 20 6f 66 20 74 68 65 20 6e 61 74 69 76  mes of the nativ
28d70 65 20 70 6c 61 74 66 6f 72 6d 20 61 6e 64 20 61  e platform and a
28d80 72 63 68 69 74 65 63 74 75 72 65 2e 0d 0a 20 20  rchitecture...  
28d90 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
28da0 20 73 65 74 20 70 6c 61 74 66 6f 72 6d 20 5b 67   set platform [g
28db0 65 74 42 75 69 6c 64 50 6c 61 74 66 6f 72 6d 20  etBuildPlatform 
28dc0 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 73  true]..        s
28dd0 65 74 20 61 72 63 68 69 74 65 63 74 75 72 65 20  et architecture 
28de0 5b 61 72 63 68 69 74 65 63 74 75 72 65 46 6f 72  [architectureFor
28df0 50 6c 61 74 66 6f 72 6d 20 24 70 6c 61 74 66 6f  Platform $platfo
28e00 72 6d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  rm]....        #
28e10 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
28e20 3a 20 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f  : Build a list o
28e30 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  f configuration 
28e40 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
28e50 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
28e60 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 63 6f  ..        set co
28e70 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c  nfigFileNames [l
28e80 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ist \..         
28e90 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53     System.Data.S
28ea0 51 4c 69 74 65 2e 64 6c 6c 2e 63 6f 6e 66 69 67  QLite.dll.config
28eb0 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
28ec0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
28ed0 42 75 69 6c 64 20 61 20 6c 69 73 74 20 6f 66 20  Build a list of 
28ee0 61 75 78 69 6c 69 61 72 79 20 4d 61 6e 61 67 65  auxiliary Manage
28ef0 64 20 44 65 62 75 67 67 69 6e 67 20 41 73 73 69  d Debugging Assi
28f00 73 74 61 6e 74 73 20 28 4d 44 41 29 0d 0a 20 20  stants (MDA)..  
28f10 20 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f        #       co
28f20 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
28f30 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c 65  s that we handle
28f40 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
28f50 20 20 20 20 20 20 73 65 74 20 6d 64 61 43 6f 6e        set mdaCon
28f60 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  figFileNames [li
28f70 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
28f80 20 20 45 61 67 6c 65 53 68 65 6c 6c 33 32 2e 65    EagleShell32.e
28f90 78 65 2e 6d 64 61 2e 63 6f 6e 66 69 67 20 49 6e  xe.mda.config In
28fa0 73 74 61 6c 6c 65 72 2e 65 78 65 2e 6d 64 61 2e  staller.exe.mda.
28fb0 63 6f 6e 66 69 67 20 5c 0d 0a 20 20 20 20 20 20  config \..      
28fc0 20 20 20 20 20 20 74 65 73 74 2e 65 78 65 2e 6d        test.exe.m
28fd0 64 61 2e 63 6f 6e 66 69 67 20 74 65 73 74 6c 69  da.config testli
28fe0 6e 71 2e 65 78 65 2e 6d 64 61 2e 63 6f 6e 66 69  nq.exe.mda.confi
28ff0 67 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g \..           
29000 20 74 65 73 74 65 66 36 2e 65 78 65 2e 6d 64 61   testef6.exe.mda
29010 2e 63 6f 6e 66 69 67 5d 0d 0a 0d 0a 20 20 20 20  .config]....    
29020 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
29030 20 4e 4f 54 45 3a 20 42 75 69 6c 64 20 74 68 65   NOTE: Build the
29040 20 6c 69 73 74 20 6f 66 20 65 78 74 65 72 6e 61   list of externa
29050 6c 20 66 69 6c 65 73 20 74 68 61 74 20 77 65 20  l files that we 
29060 68 61 6e 64 6c 65 2e 20 20 53 6f 6d 65 20 6f 66  handle.  Some of
29070 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29080 20 20 74 68 65 73 65 20 66 69 6c 65 73 20 6d 61    these files ma
29090 79 20 62 65 20 6e 61 74 69 76 65 20 61 6e 64 2f  y be native and/
290a0 6f 72 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d  or managed assem
290b0 62 6c 69 65 73 20 74 68 61 74 20 61 72 65 0d 0a  blies that are..
290c0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
290d0 72 65 71 75 69 72 65 64 20 74 6f 20 70 65 72 66  required to perf
290e0 6f 72 6d 20 76 61 72 69 6f 75 73 20 74 65 73 74  orm various test
290f0 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
29100 20 20 20 20 20 20 20 73 65 74 20 65 78 74 65 72         set exter
29110 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69  nalFileNames [li
29120 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  st \..          
29130 20 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 45 6e 74    [file join Ent
29140 69 74 79 46 72 61 6d 65 77 6f 72 6b 20 6c 69 62  ityFramework lib
29150 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
29160 73 74 20 46 78 20 22 22 5d 20 5c 0d 0a 20 20 20  st Fx ""] \..   
29170 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
29180 20 6d 61 70 20 5b 6c 69 73 74 20 6e 65 74 46 78   map [list netFx
29190 34 35 31 20 6e 65 74 46 78 34 35 20 6e 65 74 46  451 netFx45 netF
291a0 78 34 35 32 20 6e 65 74 46 78 34 35 20 6e 65 74  x452 netFx45 net
291b0 46 78 34 36 20 5c 0d 0a 20 20 20 20 20 20 20 20  Fx46 \..        
291c0 20 20 20 20 6e 65 74 46 78 34 35 20 6e 65 74 46      netFx45 netF
291d0 78 34 36 31 20 6e 65 74 46 78 34 35 20 6e 65 74  x461 netFx45 net
291e0 46 78 34 36 32 20 6e 65 74 46 78 34 35 20 6e 65  Fx462 netFx45 ne
291f0 74 46 78 34 37 20 6e 65 74 46 78 34 35 20 5c 0d  tFx47 netFx45 \.
29200 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 74  .            net
29210 46 78 34 37 31 20 6e 65 74 46 78 34 35 20 6e 65  Fx471 netFx45 ne
29220 74 46 78 34 37 32 20 6e 65 74 46 78 34 35 20 6e  tFx472 netFx45 n
29230 65 74 53 74 61 6e 64 61 72 64 32 30 20 6e 65 74  etStandard20 net
29240 46 78 34 35 5d 20 5c 0d 0a 20 20 20 20 20 20 20  Fx45] \..       
29250 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 4e 65       [getBuildNe
29260 74 46 78 5d 5d 5d 20 45 6e 74 69 74 79 46 72 61  tFx]]] EntityFra
29270 6d 65 77 6f 72 6b 2e 64 6c 6c 5d 5d 0d 0a 0d 0a  mework.dll]]....
29280 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
29290 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69 6c 64     # NOTE: Build
292a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6e 61 74   the list of nat
292b0 69 76 65 20 61 73 73 65 6d 62 6c 79 20 66 69 6c  ive assembly fil
292c0 65 73 20 74 68 61 74 20 77 65 20 68 61 6e 64 6c  es that we handl
292d0 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  e...        #.. 
292e0 20 20 20 20 20 20 20 73 65 74 20 6e 61 74 69 76         set nativ
292f0 65 46 69 6c 65 4e 61 6d 65 73 20 5b 6c 69 73 74  eFileNames [list
29300 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 65 76 61  ]....        eva
29310 6c 20 6c 61 70 70 65 6e 64 20 6e 61 74 69 76 65  l lappend native
29320 46 69 6c 65 4e 61 6d 65 73 20 5b 67 65 74 4e 61  FileNames [getNa
29330 74 69 76 65 4c 69 62 72 61 72 79 46 69 6c 65 4e  tiveLibraryFileN
29340 61 6d 65 73 4f 6e 6c 79 5d 0d 0a 20 20 20 20 20  amesOnly]..     
29350 20 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20     eval lappend 
29360 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
29370 5b 67 65 74 49 6e 74 65 72 6f 70 41 73 73 65 6d  [getInteropAssem
29380 62 6c 79 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79  blyFileNamesOnly
29390 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ]....        #..
293a0 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
293b0 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 6f  Build the list o
293c0 66 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73  f mixed-mode ass
293d0 65 6d 62 6c 79 20 66 69 6c 65 73 20 74 68 61 74  embly files that
293e0 20 77 65 20 68 61 6e 64 6c 65 2e 0d 0a 20 20 20   we handle...   
293f0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29400 73 65 74 20 6d 69 78 65 64 46 69 6c 65 4e 61 6d  set mixedFileNam
29410 65 73 20 5b 6c 69 73 74 5d 0d 0a 0d 0a 20 20 20  es [list]....   
29420 20 20 20 20 20 69 66 20 7b 5b 68 61 73 52 75 6e       if {[hasRun
29430 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61 74 69 76  timeOption nativ
29440 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  e]} then {..    
29450 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 69        lappend mi
29460 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 53 79 73  xedFileNames Sys
29470 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
29480 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  dll..        }..
29490 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
294a0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 42 75 69       # NOTE: Bui
294b0 6c 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6d  ld the list of m
294c0 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79 20  anaged assembly 
294d0 66 69 6c 65 73 20 74 68 61 74 20 77 65 20 68 61  files that we ha
294e0 6e 64 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  ndle...        #
294f0 0d 0a 20 20 20 20 20 20 20 20 73 65 74 20 6d 61  ..        set ma
29500 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 5b  nagedFileNames [
29510 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  list \..        
29520 20 20 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e      System.Data.
29530 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c 20  SQLite.Linq.dll 
29540 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
29550 74 65 2e 45 46 36 2e 64 6c 6c 5d 0d 0a 0d 0a 20  te.EF6.dll].... 
29560 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 73         if {![has
29570 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 6e 61  RuntimeOption na
29580 74 69 76 65 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tive]} then {.. 
29590 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64           lappend
295a0 20 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65   managedFileName
295b0 73 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  s System.Data.SQ
295c0 4c 69 74 65 2e 64 6c 6c 0d 0a 20 20 20 20 20 20  Lite.dll..      
295d0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23    }....        #
295e0 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45  ..        # NOTE
295f0 3a 20 53 68 6f 77 20 74 68 65 20 76 61 72 69 6f  : Show the vario
29600 75 73 20 6c 69 73 74 73 20 6f 66 20 66 69 6c 65  us lists of file
29610 20 6e 61 6d 65 73 20 74 68 61 74 20 61 72 65 20   names that are 
29620 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73 0d  handled by this.
29630 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20  .        #      
29640 20 70 72 6f 63 65 64 75 72 65 2e 0d 0a 20 20 20   procedure...   
29650 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
29660 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
29670 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
29680 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s \..           
29690 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20 5c   "---- list of \
296a0 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 5c 22  "configuration\"
296b0 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20   file names is: 
296c0 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " \..           
296d0 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68   [expr {[llength
296e0 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65   $configFileName
296f0 73 5d 20 3e 20 30 20 3f 20 24 63 6f 6e 66 69 67  s] > 0 ? $config
29700 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20  FileNames : \.. 
29710 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e             "<non
29720 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20  e>"}] \n]....   
29730 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
29740 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
29750 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
29760 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74        "---- list
29770 20 6f 66 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67   of \"MDA config
29780 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 20 6e  uration\" file n
29790 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a 20 20  ames is: " \..  
297a0 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
297b0 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 64 61 43 6f  {[llength $mdaCo
297c0 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 5d 20 3e  nfigFileNames] >
297d0 20 30 20 3f 20 24 6d 64 61 43 6f 6e 66 69 67 46   0 ? $mdaConfigF
297e0 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20  ileNames : \..  
297f0 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65            "<none
29800 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  >"}] \n]....    
29810 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
29820 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
29830 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
29840 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20       "---- list 
29850 6f 66 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  of \"external\" 
29860 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22  file names is: "
29870 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
29880 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20  [expr {[llength 
29890 24 65 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d  $externalFileNam
298a0 65 73 5d 20 3e 20 30 20 3f 20 24 65 78 74 65 72  es] > 0 ? $exter
298b0 6e 61 6c 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c  nalFileNames : \
298c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 3c  ..            "<
298d0 6e 6f 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a  none>"}] \n]....
298e0 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
298f0 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
29900 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
29910 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c           "---- l
29920 69 73 74 20 6f 66 20 5c 22 6e 61 74 69 76 65 5c  ist of \"native\
29930 22 20 66 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a  " file names is:
29940 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
29950 20 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74    [expr {[llengt
29960 68 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  h $nativeFileNam
29970 65 73 5d 20 3e 20 30 20 3f 20 24 6e 61 74 69 76  es] > 0 ? $nativ
29980 65 46 69 6c 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a  eFileNames : \..
29990 20 20 20 20 20 20 20 20 20 20 20 20 22 3c 6e 6f              "<no
299a0 6e 65 3e 22 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20  ne>"}] \n]....  
299b0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
299c0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
299d0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
299e0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 6c 69 73         "---- lis
299f0 74 20 6f 66 20 5c 22 6d 69 78 65 64 5c 22 20 66  t of \"mixed\" f
29a00 69 6c 65 20 6e 61 6d 65 73 20 69 73 3a 20 22 20  ile names is: " 
29a10 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b  \..            [
29a20 65 78 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  expr {[llength $
29a30 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20  mixedFileNames] 
29a40 3e 20 30 20 3f 20 24 6d 69 78 65 64 46 69 6c 65  > 0 ? $mixedFile
29a50 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20 20  Names : \..     
29a60 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22 7d         "<none>"}
29a70 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ] \n]....       
29a80 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
29a90 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
29aa0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
29ab0 20 20 22 2d 2d 2d 2d 20 6c 69 73 74 20 6f 66 20    "---- list of 
29ac0 5c 22 6d 61 6e 61 67 65 64 5c 22 20 66 69 6c 65  \"managed\" file
29ad0 20 6e 61 6d 65 73 20 69 73 3a 20 22 20 5c 0d 0a   names is: " \..
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78 70              [exp
29af0 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 61 6e  r {[llength $man
29b00 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 5d 20 3e  agedFileNames] >
29b10 20 30 20 3f 20 24 6d 61 6e 61 67 65 64 46 69 6c   0 ? $managedFil
29b20 65 4e 61 6d 65 73 20 3a 20 5c 0d 0a 20 20 20 20  eNames : \..    
29b30 20 20 20 20 20 20 20 20 22 3c 6e 6f 6e 65 3e 22          "<none>"
29b40 7d 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20  }] \n]....      
29b50 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
29b60 4f 54 45 3a 20 52 65 6d 6f 76 65 20 61 6e 79 20  OTE: Remove any 
29b70 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
29b80 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
29b90 68 65 20 6e 61 74 69 76 65 20 61 6e 64 2f 6f 72  he native and/or
29ba0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29bb0 20 20 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62    managed assemb
29bc0 6c 79 20 66 69 6c 65 73 20 74 68 61 74 20 77 65  ly files that we
29bd0 20 68 61 6e 64 6c 65 20 75 6e 6c 65 73 73 20 66   handle unless f
29be0 6f 72 62 69 64 64 65 6e 20 66 72 6f 6d 0d 0a 20  orbidden from.. 
29bf0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 64         #       d
29c00 6f 69 6e 67 20 73 6f 2e 0d 0a 20 20 20 20 20 20  oing so...      
29c10 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
29c20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
29c30 3a 6e 6f 28 73 71 6c 69 74 65 52 65 6d 6f 76 65  :no(sqliteRemove
29c40 43 6f 6e 73 74 72 61 69 6e 74 73 29 5d 7d 20 74  Constraints)]} t
29c50 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
29c60 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
29c70 65 20 24 63 6f 6e 66 69 67 46 69 6c 65 4e 61 6d  e $configFileNam
29c80 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
29c90 20 20 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69    removeConstrai
29ca0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
29cb0 69 6c 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d  ile_ $fileName].
29cc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
29cd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
29ce0 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43  h fileName $mdaC
29cf0 6f 6e 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b  onfigFileNames {
29d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
29d10 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
29d20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29d30 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
29d40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29d50 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29d60 6c 65 4e 61 6d 65 20 24 65 78 74 65 72 6e 61 6c  leName $external
29d70 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
29d80 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65 43           removeC
29d90 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e  onstraint [appen
29da0 64 41 72 67 73 20 66 69 6c 65 5f 20 5b 66 69 6c  dArgs file_ [fil
29db0 65 20 74 61 69 6c 20 24 66 69 6c 65 4e 61 6d 65  e tail $fileName
29dc0 5d 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  ]]..          }.
29dd0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ...          for
29de0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
29df0 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
29e00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
29e10 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  moveConstraint [
29e20 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
29e30 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20   $fileName]..   
29e40 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
29e50 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
29e60 6c 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c  leName $mixedFil
29e70 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
29e80 20 20 20 20 20 20 72 65 6d 6f 76 65 43 6f 6e 73        removeCons
29e90 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
29ea0 67 73 20 66 69 6c 65 5f 20 24 66 69 6c 65 4e 61  gs file_ $fileNa
29eb0 6d 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  me]..          }
29ec0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ....          fo
29ed0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
29ee0 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
29ef0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
29f00 72 65 6d 6f 76 65 43 6f 6e 73 74 72 61 69 6e 74  removeConstraint
29f10 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
29f20 65 5f 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 20  e_ $fileName].. 
29f30 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
29f40 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
29f50 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f   #..        # NO
29f60 54 45 3a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  TE: Check for th
29f70 65 20 22 61 75 74 6f 53 65 6c 65 63 74 22 20 72  e "autoSelect" r
29f80 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 20 20  untime option.  
29f90 49 66 20 70 72 65 73 65 6e 74 2c 0d 0a 20 20 20  If present,..   
29fa0 20 20 20 20 20 23 20 20 20 20 20 20 20 61 74 74       #       att
29fb0 65 6d 70 74 20 74 6f 20 61 75 74 6f 6d 61 74 69  empt to automati
29fc0 63 61 6c 6c 79 20 73 65 6c 65 63 74 20 74 68 65  cally select the
29fd0 20 66 69 72 73 74 20 61 76 61 69 6c 61 62 6c 65   first available
29fe0 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
29ff0 20 20 62 75 69 6c 64 20 28 6f 72 20 22 72 65 6c    build (or "rel
2a000 65 61 73 65 22 29 20 6f 66 20 53 51 4c 69 74 65  ease") of SQLite
2a010 20 61 6e 64 20 53 79 73 74 65 6d 2e 44 61 74 61   and System.Data
2a020 2e 53 51 4c 69 74 65 0d 0a 20 20 20 20 20 20 20  .SQLite..       
2a030 20 23 20 20 20 20 20 20 20 66 6f 72 20 75 73 65   #       for use
2a040 20 77 69 74 68 20 74 68 65 20 74 65 73 74 20 73   with the test s
2a050 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23  uite...        #
2a060 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68  ..        if {[h
2a070 61 73 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  asRuntimeOption 
2a080 61 75 74 6f 53 65 6c 65 63 74 5d 7d 20 74 68 65  autoSelect]} the
2a090 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69  n {..          i
2a0a0 66 20 7b 21 5b 63 68 65 63 6b 46 6f 72 53 51 4c  f {![checkForSQL
2a0b0 69 74 65 42 75 69 6c 64 73 20 24 3a 3a 74 65 73  iteBuilds $::tes
2a0c0 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65 5d 7d  t_channel true]}
2a0d0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a0e0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2a0f0 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a 74  iteReleases $::t
2a100 65 73 74 5f 63 68 61 6e 6e 65 6c 20 74 72 75 65  est_channel true
2a110 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
2a120 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2a130 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2a140 53 68 6f 77 20 28 61 6e 64 20 6c 6f 67 29 20 74  Show (and log) t
2a150 68 65 20 67 6c 6f 62 61 6c 20 70 61 72 61 6d 65  he global parame
2a160 74 65 72 73 20 74 68 61 74 20 63 6f 6e 74 72 6f  ters that contro
2a170 6c 20 77 68 65 72 65 0d 0a 20 20 20 20 20 20 20  l where..       
2a180 20 20 20 23 20 20 20 20 20 20 20 74 68 65 20 62     #       the b
2a190 75 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 73  uild directory s
2a1a0 68 6f 75 6c 64 20 62 65 2e 20 20 54 68 65 20 61  hould be.  The a
2a1b0 75 74 6f 2d 73 65 6c 65 63 74 69 6f 6e 20 6d 61  uto-selection ma
2a1c0 79 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20  y..          #  
2a1d0 20 20 20 20 20 68 61 76 65 20 6d 6f 64 69 66 69       have modifi
2a1e0 65 64 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  ed some of these
2a1f0 20 70 61 72 61 6d 65 74 65 72 73 2e 0d 0a 20 20   parameters...  
2a200 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2a210 20 20 20 20 20 73 68 6f 77 53 51 4c 69 74 65 42       showSQLiteB
2a220 75 69 6c 64 50 61 72 61 6d 65 74 65 72 73 20 24  uildParameters $
2a230 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2a240 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2a250 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2a260 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c  # NOTE: Skip all
2a270 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c   System.Data.SQL
2a280 69 74 65 20 72 65 6c 61 74 65 64 20 66 69 6c 65  ite related file
2a290 20 68 61 6e 64 6c 69 6e 67 20 28 64 65 6c 65 74   handling (delet
2a2a0 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 23 20  ing,..        # 
2a2b0 20 20 20 20 20 20 63 6f 70 79 69 6e 67 2c 20 61        copying, a
2a2c0 6e 64 20 6c 6f 61 64 69 6e 67 29 20 69 66 20 69  nd loading) if i
2a2d0 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
2a2e0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2a2f0 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2a300 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 46 69 6c 65   ::no(sqliteFile
2a310 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2a320 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2a330 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
2a340 20 74 72 79 69 6e 67 20 74 6f 20 64 65 6c 65 74   trying to delet
2a350 65 20 61 6e 79 20 66 69 6c 65 73 20 69 66 20 69  e any files if i
2a360 6e 73 74 72 75 63 74 65 64 2e 0d 0a 20 20 20 20  nstructed...    
2a370 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2a380 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
2a390 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
2a3a0 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d 20 74  SqliteFiles)]} t
2a3b0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2a3c0 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78     if {![info ex
2a3d0 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65  ists ::no(delete
2a3e0 53 71 6c 69 74 65 43 6f 6e 66 69 67 46 69 6c 65  SqliteConfigFile
2a3f0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2a400 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2a410 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e  ch fileName $con
2a420 66 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  figFileNames {..
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 74 72 79 44 65 6c 65 74 65 42 69 6e 61 72 79 46  tryDeleteBinaryF
2a450 69 6c 65 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20  ile $fileName.. 
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2a470 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2a480 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2a490 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2a4a0 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65  :no(deleteSqlite
2a4b0 45 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d  ExternalFiles)]}
2a4c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a4d0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2a4e0 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
2a4f0 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a510 72 79 44 65 6c 65 74 65 42 75 69 6c 64 46 69 6c  ryDeleteBuildFil
2a520 65 20 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65  e $fileName true
2a530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a540 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2a550 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2a560 61 6d 65 20 24 65 78 74 65 72 6e 61 6c 46 69 6c  ame $externalFil
2a570 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2a580 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65 6c            tryDel
2a590 65 74 65 42 69 6e 61 72 79 46 69 6c 65 20 24 66  eteBinaryFile $f
2a5a0 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
2a5b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2a5c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2a5d0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2a5e0 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2a5f0 6c 65 74 65 53 71 6c 69 74 65 4e 61 74 69 76 65  leteSqliteNative
2a600 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2a610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2a620 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2a630 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
2a640 74 65 49 6d 70 6c 69 63 69 74 4e 61 74 69 76 65  teImplicitNative
2a650 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2a660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a670 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2a680 65 20 24 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d  e $nativeFileNam
2a690 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  es {..          
2a6a0 20 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74          tryDelet
2a6b0 65 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e  eAssembly $fileN
2a6c0 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
2a6d0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2a6e0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2a6f0 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2a700 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2a710 64 65 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49  deleteSqliteNonI
2a720 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20  mplicitFiles)]} 
2a730 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2a740 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2a750 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
2a760 65 6c 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66  eleteSqlitePlatf
2a770 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d  ormFiles)] && \.
2a780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a790 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e       [string len
2a7a0 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e  gth $platform] >
2a7b0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2a7d0 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2a7e0 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
2a7f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2a800 20 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65         tryDelete
2a810 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2a820 6d 65 20 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20  me $platform..  
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2a850 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2a860 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2a870 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64  fo exists ::no(d
2a880 65 6c 65 74 65 53 71 6c 69 74 65 41 72 63 68 69  eleteSqliteArchi
2a890 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2a8a0 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2a8b0 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67           [string
2a8c0 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74 65   length $archite
2a8d0 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e  cture] > 0} then
2a8e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2a8f0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69        foreach fi
2a900 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69  leName $nativeFi
2a910 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2a930 72 79 44 65 6c 65 74 65 41 73 73 65 6d 62 6c 79  ryDeleteAssembly
2a940 20 24 66 69 6c 65 4e 61 6d 65 20 24 61 72 63 68   $fileName $arch
2a950 69 74 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20  itecture..      
2a960 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2a980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a990 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2a9a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2a9b0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2a9c0 73 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c  s ::no(deleteSql
2a9d0 69 74 65 4d 69 78 65 64 46 69 6c 65 73 29 5d 7d  iteMixedFiles)]}
2a9e0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2a9f0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2aa00 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2aa10 49 66 20 74 68 65 20 22 6e 61 74 69 76 65 22 20  If the "native" 
2aa20 72 75 6e 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  runtime option i
2aa30 73 20 73 65 74 2c 20 64 65 6c 65 74 65 20 69 6d  s set, delete im
2aa40 70 6c 69 63 69 74 0d 0a 20 20 20 20 20 20 20 20  plicit..        
2aa50 20 20 20 20 20 20 23 20 20 20 20 20 20 20 6d 69        #       mi
2aa60 78 65 64 2d 6d 6f 64 65 20 61 73 73 65 6d 62 6c  xed-mode assembl
2aa70 79 20 66 69 6c 65 73 20 61 73 20 77 65 6c 6c 2e  y files as well.
2aa80 20 20 54 68 69 73 20 72 75 6e 74 69 6d 65 20 6f    This runtime o
2aa90 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ption..         
2aaa0 20 20 20 20 20 23 20 20 20 20 20 20 20 63 68 65       #       che
2aab0 63 6b 20 69 73 20 68 61 6e 64 6c 65 64 20 77 68  ck is handled wh
2aac0 65 6e 20 62 75 69 6c 64 69 6e 67 20 74 68 65 20  en building the 
2aad0 6c 69 73 74 20 6f 66 20 6d 69 78 65 64 2d 6d 6f  list of mixed-mo
2aae0 64 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  de..            
2aaf0 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
2ab00 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0d 0a  ly file names...
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2ab20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2ab30 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2ab40 20 3a 3a 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69   ::no(deleteSqli
2ab50 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64 46  teImplicitMixedF
2ab60 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65  foreach fileName
2ab90 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73   $mixedFileNames
2aba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2abb0 20 20 20 20 20 20 74 72 79 44 65 6c 65 74 65 41        tryDeleteA
2abc0 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d  ssembly $fileNam
2abd0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2abe0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2abf0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2ac00 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2ac10 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65  o exists ::no(de
2ac20 6c 65 74 65 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  leteSqliteNonImp
2ac30 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
2ac40 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ac50 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2ac60 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c   exists ::no(del
2ac70 65 74 65 53 71 6c 69 74 65 50 6c 61 74 66 6f 72  eteSqlitePlatfor
2ac80 6d 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20  mFiles)] && \.. 
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 20 20 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74     [string lengt
2acb0 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30  h $platform] > 0
2acc0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65              fore
2ace0 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69  ach fileName $mi
2acf0 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  xedFileNames {..
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad10 20 20 20 20 74 72 79 44 65 6c 65 74 65 41 73 73      tryDeleteAss
2ad20 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
2ad30 24 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20  $platform..     
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2ad70 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2ad80 65 78 69 73 74 73 20 3a 3a 6e 6f 28 64 65 6c 65  exists ::no(dele
2ad90 74 65 53 71 6c 69 74 65 41 72 63 68 69 74 65 63  teSqliteArchitec
2ada0 74 75 72 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tureFiles)] && \
2adb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2adc0 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c 65        [string le
2add0 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74 75  ngth $architectu
2ade0 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d  re] > 0} then {.
2adf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ae00 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2ae10 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61  ame $mixedFileNa
2ae20 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  mes {..         
2ae30 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
2ae40 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
2ae50 6c 65 4e 61 6d 65 20 24 61 72 63 68 69 74 65 63  leName $architec
2ae60 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ture..          
2ae70 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2ae80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2ae90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2aea0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2aec0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2aed0 6e 6f 28 64 65 6c 65 74 65 53 71 6c 69 74 65 4d  no(deleteSqliteM
2aee0 61 6e 61 67 65 64 46 69 6c 65 73 29 5d 7d 20 74  anagedFiles)]} t
2aef0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2af00 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
2af10 65 4e 61 6d 65 20 24 6d 61 6e 61 67 65 64 46 69  eName $managedFi
2af20 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2af30 20 20 20 20 20 20 20 20 20 20 20 74 72 79 44 65             tryDe
2af40 6c 65 74 65 41 73 73 65 6d 62 6c 79 20 24 66 69  leteAssembly $fi
2af50 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
2af60 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2af70 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2af80 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2af90 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2afa0 4e 4f 54 45 3a 20 53 68 6f 77 20 28 61 6e 64 20  NOTE: Show (and 
2afb0 6c 6f 67 29 20 74 68 65 20 67 6c 6f 62 61 6c 20  log) the global 
2afc0 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
2afd0 63 6f 6e 74 72 6f 6c 20 77 68 65 72 65 0d 0a 20  control where.. 
2afe0 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2aff0 20 74 68 65 20 62 75 69 6c 64 20 64 69 72 65 63   the build direc
2b000 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 2e 0d  tory should be..
2b010 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20  .          #..  
2b020 20 20 20 20 20 20 20 20 73 68 6f 77 53 51 4c 69          showSQLi
2b030 74 65 42 75 69 6c 64 50 61 72 61 6d 65 74 65 72  teBuildParameter
2b040 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2b050 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23  l....          #
2b060 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f  ..          # NO
2b070 54 45 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20  TE: Skip trying 
2b080 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 75  to verify the bu
2b090 69 6c 64 20 64 69 72 65 63 74 6f 72 79 20 69 66  ild directory if
2b0a0 20 69 6e 73 74 72 75 63 74 65 64 3b 0d 0a 20 20   instructed;..  
2b0b0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2b0c0 6f 74 68 65 72 77 69 73 65 2c 20 6d 61 6b 65 20  otherwise, make 
2b0d0 73 75 72 65 20 69 74 20 61 63 74 75 61 6c 6c 79  sure it actually
2b0e0 20 65 78 69 73 74 73 20 6f 72 20 68 61 6c 74 20   exists or halt 
2b0f0 74 68 65 20 65 6e 74 69 72 65 0d 0a 20 20 20 20  the entire..    
2b100 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74 65        #       te
2b110 73 74 69 6e 67 20 70 72 6f 63 65 73 73 20 69 66  sting process if
2b120 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
2b130 73 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 23  st...          #
2b140 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b  ..          if {
2b150 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2b160 6e 6f 28 76 65 72 69 66 79 42 75 69 6c 64 44 69  no(verifyBuildDi
2b170 72 65 63 74 6f 72 79 29 5d 7d 20 74 68 65 6e 20  rectory)]} then 
2b180 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
2b190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ..            # 
2b1a0 4e 4f 54 45 3a 20 41 74 20 74 68 69 73 20 70 6f  NOTE: At this po
2b1b0 69 6e 74 2c 20 74 68 65 20 62 75 69 6c 64 20 64  int, the build d
2b1c0 69 72 65 63 74 6f 72 69 65 73 20 4d 55 53 54 20  irectories MUST 
2b1d0 65 78 69 73 74 20 66 6f 72 0d 0a 20 20 20 20 20  exist for..     
2b1e0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2b1f0 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
2b200 73 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0d  ss to continue..
2b210 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a  .            #..
2b220 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
2b230 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74 42 75  directory [getBu
2b240 69 6c 64 44 69 72 65 63 74 6f 72 79 20 66 61 6c  ildDirectory fal
2b250 73 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se]....         
2b260 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65 78     if {![file ex
2b270 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79 5d  ists $directory]
2b280 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20   || \..         
2b290 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69 73         ![file is
2b2a0 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65 63  directory $direc
2b2b0 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  tory]} then {.. 
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2b2e0 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f 72  NOTE: Just prior
2b2f0 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61 6c   to actually hal
2b300 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e 67  ting the testing
2b310 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20 20   process,..     
2b320 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2b330 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74 6f   add an error to
2b340 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66 69   the test log fi
2b350 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le...           
2b360 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b370 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73      tputs $::tes
2b380 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e  t_channel [appen
2b390 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2b3a0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2b3b0 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69 66   could not verif
2b3c0 79 20 6e 61 74 69 76 65 20 62 75 69 6c 64 20 64  y native build d
2b3d0 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c 0d 0a  irectory \"" \..
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 24 64 69 72 65 63 74 6f 72 79 20 22 5c 22    $directory "\"
2b400 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20 68 61  , all testing ha
2b410 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20 20 20  lted\n"]....    
2b420 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2b430 20 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54             # NOT
2b440 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73 63 72  E: Raising a scr
2b450 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  ipt error from t
2b460 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64  his point should
2b470 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20 20 20   halt..         
2b480 20 20 20 20 20 23 20 20 20 20 20 20 20 74 68 65       #       the
2b490 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73   testing process
2b4a0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2b4b0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2b4c0 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e 64 41    error [appendA
2b4d0 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2b4e0 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20           "could 
2b4f0 6e 6f 74 20 76 65 72 69 66 79 20 6e 61 74 69 76  not verify nativ
2b500 65 20 62 75 69 6c 64 20 64 69 72 65 63 74 6f 72  e build director
2b510 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  y \"" \..       
2b520 20 20 20 20 20 20 20 20 20 20 20 24 64 69 72 65             $dire
2b530 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c 6c 20 74  ctory "\", all t
2b540 65 73 74 69 6e 67 20 68 61 6c 74 65 64 22 5d 0d  esting halted"].
2b550 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2b560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
2b570 74 20 64 69 72 65 63 74 6f 72 79 20 5b 67 65 74  t directory [get
2b580 42 75 69 6c 64 44 69 72 65 63 74 6f 72 79 20 74  BuildDirectory t
2b590 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
2b5a0 20 20 20 20 69 66 20 7b 21 5b 66 69 6c 65 20 65      if {![file e
2b5b0 78 69 73 74 73 20 24 64 69 72 65 63 74 6f 72 79  xists $directory
2b5c0 5d 20 7c 7c 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] || \..        
2b5d0 20 20 20 20 20 20 20 20 21 5b 66 69 6c 65 20 69          ![file i
2b5e0 73 64 69 72 65 63 74 6f 72 79 20 24 64 69 72 65  sdirectory $dire
2b5f0 63 74 6f 72 79 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ctory]} then {..
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2b620 20 4e 4f 54 45 3a 20 4a 75 73 74 20 70 72 69 6f   NOTE: Just prio
2b630 72 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 68 61  r to actually ha
2b640 6c 74 69 6e 67 20 74 68 65 20 74 65 73 74 69 6e  lting the testin
2b650 67 20 70 72 6f 63 65 73 73 2c 0d 0a 20 20 20 20  g process,..    
2b660 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2b670 20 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 74    add an error t
2b680 6f 20 74 68 65 20 74 65 73 74 20 6c 6f 67 20 66  o the test log f
2b690 69 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ile...          
2b6a0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2b6b0 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
2b6c0 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65  st_channel [appe
2b6d0 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20  ndArgs \..      
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2b6f0 2d 20 63 6f 75 6c 64 20 6e 6f 74 20 76 65 72 69  - could not veri
2b700 66 79 20 6d 61 6e 61 67 65 64 20 62 75 69 6c 64  fy managed build
2b710 20 64 69 72 65 63 74 6f 72 79 20 5c 22 22 20 5c   directory \"" \
2b720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b730 20 20 20 20 24 64 69 72 65 63 74 6f 72 79 20 22      $directory "
2b740 5c 22 2c 20 61 6c 6c 20 74 65 73 74 69 6e 67 20  \", all testing 
2b750 68 61 6c 74 65 64 5c 6e 22 5d 0d 0a 0d 0a 20 20  halted\n"]....  
2b760 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20              #.. 
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4e               # N
2b780 4f 54 45 3a 20 52 61 69 73 69 6e 67 20 61 20 73  OTE: Raising a s
2b790 63 72 69 70 74 20 65 72 72 6f 72 20 66 72 6f 6d  cript error from
2b7a0 20 74 68 69 73 20 70 6f 69 6e 74 20 73 68 6f 75   this point shou
2b7b0 6c 64 20 68 61 6c 74 0d 0a 20 20 20 20 20 20 20  ld halt..       
2b7c0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 74         #       t
2b7d0 68 65 20 74 65 73 74 69 6e 67 20 70 72 6f 63 65  he testing proce
2b7e0 73 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss...           
2b7f0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2b800 20 20 20 20 65 72 72 6f 72 20 5b 61 70 70 65 6e      error [appen
2b810 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20  dArgs \..       
2b820 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
2b830 64 20 6e 6f 74 20 76 65 72 69 66 79 20 6d 61 6e  d not verify man
2b840 61 67 65 64 20 62 75 69 6c 64 20 64 69 72 65 63  aged build direc
2b850 74 6f 72 79 20 5c 22 22 20 5c 0d 0a 20 20 20 20  tory \"" \..    
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 64                $d
2b870 69 72 65 63 74 6f 72 79 20 22 5c 22 2c 20 61 6c  irectory "\", al
2b880 6c 20 74 65 73 74 69 6e 67 20 68 61 6c 74 65 64  l testing halted
2b890 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  "]..            
2b8a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2b8b0 20 73 65 74 20 6c 6f 67 44 69 72 65 63 74 6f 72   set logDirector
2b8c0 79 20 24 64 69 72 65 63 74 6f 72 79 0d 0a 20 20  y $directory..  
2b8d0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2b8e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ..            se
2b8f0 74 20 6c 6f 67 44 69 72 65 63 74 6f 72 79 20 5b  t logDirectory [
2b900 67 65 74 42 75 69 6c 64 44 69 72 65 63 74 6f 72  getBuildDirector
2b910 79 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20 20  y true]..       
2b920 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2b930 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23    #..          #
2b940 20 4e 4f 54 45 3a 20 57 65 27 72 65 20 67 6f 69   NOTE: We're goi
2b950 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 74  ng to move the t
2b960 65 73 74 20 6c 6f 67 20 66 69 6c 65 20 74 6f 20  est log file to 
2b970 74 68 65 20 64 69 72 65 63 74 6f 72 79 0d 0a 20  the directory.. 
2b980 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20           #      
2b990 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2b9a0 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 69  managed assembli
2b9b0 65 73 20 62 65 69 6e 67 20 74 65 73 74 65 64 2e  es being tested.
2b9c0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20  ..          #.. 
2b9d0 20 20 20 20 20 20 20 20 20 6d 6f 76 65 54 65 73           moveTes
2b9e0 74 4c 6f 67 46 69 6c 65 20 24 6c 6f 67 44 69 72  tLogFile $logDir
2b9f0 65 63 74 6f 72 79 0d 0a 0d 0a 20 20 20 20 20 20  ectory....      
2ba00 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2ba10 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70 20 74 72   # NOTE: Skip tr
2ba20 79 69 6e 67 20 74 6f 20 63 6f 70 79 20 61 6e 79  ying to copy any
2ba30 20 66 69 6c 65 73 20 69 66 20 69 6e 73 74 72 75   files if instru
2ba40 63 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  cted...         
2ba50 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   #..          if
2ba60 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2ba70 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46  ::no(copySqliteF
2ba80 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a  iles)]} then {..
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2baa0 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2bab0 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 43 6f 6e  no(copySqliteCon
2bac0 66 69 67 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e  figFiles)]} then
2bad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2bae0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2baf0 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20  channel \..     
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d               "--
2bb10 2d 2d 20 63 6f 70 79 69 6e 67 20 5c 22 63 6f 6e  -- copying \"con
2bb20 66 69 67 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c  figuration\" fil
2bb30 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20  es...\n"....    
2bb40 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
2bb50 68 20 66 69 6c 65 4e 61 6d 65 20 24 63 6f 6e 66  h fileName $conf
2bb60 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2bb80 72 79 43 6f 70 79 42 75 69 6c 64 46 69 6c 65 20  ryCopyBuildFile 
2bb90 24 66 69 6c 65 4e 61 6d 65 20 74 72 75 65 0d 0a  $fileName true..
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
2bbc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
2bbd0 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
2bbe0 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 45  ::no(copySqliteE
2bbf0 78 74 65 72 6e 61 6c 46 69 6c 65 73 29 5d 7d 20  xternalFiles)]} 
2bc00 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2bc10 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2bc20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43         # NOTE: C
2bc30 6f 70 79 20 74 68 65 20 4d 61 6e 61 67 65 64 20  opy the Managed 
2bc40 44 65 62 75 67 67 69 6e 67 20 41 73 73 69 73 74  Debugging Assist
2bc50 61 6e 74 73 20 28 4d 44 41 29 20 63 6f 6e 66 69  ants (MDA) confi
2bc60 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20  guration..      
2bc70 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2bc80 66 69 6c 65 20 66 6f 72 20 74 68 65 20 45 61 67  file for the Eag
2bc90 6c 65 20 73 68 65 6c 6c 20 74 6f 20 74 68 65 20  le shell to the 
2bca0 62 75 69 6c 64 20 6f 75 74 70 75 74 20 64 69 72  build output dir
2bcb0 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
2bcc0 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 77         #       w
2bcd0 68 69 6c 65 20 75 73 69 6e 67 20 65 61 63 68 20  hile using each 
2bce0 6f 66 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  of the names of 
2bcf0 74 68 65 20 76 61 72 69 6f 75 73 20 6c 65 67 61  the various lega
2bd00 63 79 20 74 65 73 74 0d 0a 20 20 20 20 20 20 20  cy test..       
2bd10 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 65         #       e
2bd20 78 65 63 75 74 61 62 6c 65 73 2e 20 20 54 68 69  xecutables.  Thi
2bd30 73 20 77 69 6c 6c 20 68 65 6c 70 20 74 6f 20 6d  s will help to m
2bd40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 6c  ake sure that al
2bd50 6c 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20  l the..         
2bd60 20 20 20 20 20 23 20 20 20 20 20 20 20 6c 65 67       #       leg
2bd70 61 63 79 20 74 65 73 74 73 20 72 75 6e 20 77 69  acy tests run wi
2bd80 74 68 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  th exactly the s
2bd90 61 6d 65 20 73 65 74 20 6f 66 20 4d 61 6e 61 67  ame set of Manag
2bda0 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed..            
2bdb0 20 20 23 20 20 20 20 20 20 20 44 65 62 75 67 67    #       Debugg
2bdc0 69 6e 67 20 41 73 73 69 73 74 61 6e 74 73 20 63  ing Assistants c
2bdd0 6f 6e 66 69 67 75 72 65 64 2e 0d 0a 20 20 20 20  onfigured...    
2bde0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2bdf0 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2be00 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2be10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2be20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79        "---- copy
2be30 69 6e 67 20 5c 22 4d 44 41 20 63 6f 6e 66 69 67  ing \"MDA config
2be40 75 72 61 74 69 6f 6e 5c 22 20 66 69 6c 65 73 2e  uration\" files.
2be50 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
2be60 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2be70 69 6c 65 4e 61 6d 65 20 24 6d 64 61 43 6f 6e 66  ileName $mdaConf
2be80 69 67 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  igFileNames {.. 
2be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2bea0 72 79 43 6f 70 79 42 69 6e 61 72 79 46 69 6c 65  ryCopyBinaryFile
2beb0 20 45 61 67 6c 65 53 68 65 6c 6c 2e 65 78 65 2e   EagleShell.exe.
2bec0 6d 64 61 2e 63 6f 6e 66 69 67 20 74 72 75 65 20  mda.config true 
2bed0 22 22 20 24 66 69 6c 65 4e 61 6d 65 0d 0a 20 20  "" $fileName..  
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2bef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2bf00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bf10 23 20 4e 4f 54 45 3a 20 43 6f 70 79 20 74 68 65  # NOTE: Copy the
2bf20 20 65 78 74 65 72 6e 61 6c 20 62 69 6e 61 72 69   external binari
2bf30 65 73 2c 20 69 66 20 61 6e 79 2c 20 74 6f 20 74  es, if any, to t
2bf40 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
2bf50 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t..             
2bf60 20 23 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e   #       contain
2bf70 73 20 74 68 65 20 45 61 67 6c 65 20 73 68 65 6c  s the Eagle shel
2bf80 6c 2e 20 20 54 68 69 73 20 69 73 20 74 79 70 69  l.  This is typi
2bf90 63 61 6c 6c 79 20 75 73 65 64 20 74 6f 20 6d 61  cally used to ma
2bfa0 6b 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ke..            
2bfb0 20 20 23 20 20 20 20 20 20 20 73 75 72 65 20 61    #       sure a
2bfc0 73 73 65 6d 62 6c 69 65 73 20 72 65 66 65 72 65  ssemblies refere
2bfd0 6e 63 65 64 20 62 79 20 74 68 65 20 6f 6e 65 73  nced by the ones
2bfe0 20 62 65 69 6e 67 20 74 65 73 74 65 64 20 61 72   being tested ar
2bff0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2c000 20 23 20 20 20 20 20 20 20 61 76 61 69 6c 61 62   #       availab
2c010 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 74 65  le during the te
2c020 73 74 69 6e 67 20 70 72 6f 63 65 73 73 2e 0d 0a  sting process...
2c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2c040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
2c050 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2c060 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70 79 69  nnel "---- copyi
2c070 6e 67 20 5c 22 65 78 74 65 72 6e 61 6c 5c 22 20  ng \"external\" 
2c080 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20  files...\n".... 
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2c0a0 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 65  each fileName $e
2c0b0 78 74 65 72 6e 61 6c 46 69 6c 65 4e 61 6d 65 73  xternalFileNames
2c0c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c0d0 20 20 20 20 74 72 79 43 6f 70 79 45 78 74 65 72      tryCopyExter
2c0e0 6e 61 6c 46 69 6c 65 20 24 66 69 6c 65 4e 61 6d  nalFile $fileNam
2c0f0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2c100 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2c110 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2c120 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
2c130 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69  ts ::no(copySqli
2c140 74 65 4e 61 74 69 76 65 46 69 6c 65 73 29 5d 7d  teNativeFiles)]}
2c150 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2c160 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
2c170 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20          # NOTE: 
2c180 49 66 20 74 68 65 20 74 65 73 74 20 70 6c 61 74  If the test plat
2c190 66 6f 72 6d 20 69 73 20 6c 69 6b 65 6c 79 20 74  form is likely t
2c1a0 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 20 74  he default for t
2c1b0 68 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  his..           
2c1c0 20 20 20 23 20 20 20 20 20 20 20 6d 61 63 68 69     #       machi
2c1d0 6e 65 2c 20 61 6c 73 6f 20 74 72 79 20 74 6f 20  ne, also try to 
2c1e0 63 6f 70 79 20 74 68 65 20 6e 61 74 69 76 65 20  copy the native 
2c1f0 66 69 6c 65 73 20 74 6f 20 74 68 65 0d 0a 20 20  files to the..  
2c200 20 20 20 20 20 20 20 20 20 20 20 20 23 20 20 20              #   
2c210 20 20 20 20 62 69 6e 61 72 79 20 6c 6f 63 61 74      binary locat
2c220 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ion...          
2c230 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20      #..         
2c240 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2c250 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79  exists ::no(copy
2c260 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 4e 61  SqliteImplicitNa
2c270 74 69 76 65 46 69 6c 65 73 29 5d 20 26 26 20 5c  tiveFiles)] && \
2c280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c290 20 20 20 20 5b 69 73 44 65 66 61 75 6c 74 42 75      [isDefaultBu
2c2a0 69 6c 64 50 6c 61 74 66 6f 72 6d 5d 7d 20 74 68  ildPlatform]} th
2c2b0 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2c2c0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2c2d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a 20  est_channel \.. 
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67     "---- copying
2c300 20 69 6d 70 6c 69 63 69 74 20 5c 22 6e 61 74 69   implicit \"nati
2c310 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22  ve\" files...\n"
2c320 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2c330 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65      foreach file
2c340 4e 61 6d 65 20 24 6e 61 74 69 76 65 46 69 6c 65  Name $nativeFile
2c350 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2c360 20 20 20 20 20 20 20 20 20 20 20 74 72 79 43 6f             tryCo
2c370 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65  pyAssembly $file
2c380 4e 61 6d 65 20 66 61 6c 73 65 0d 0a 20 20 20 20  Name false..    
2c390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2c3b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c3c0 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2c3d0 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74  s ::no(copySqlit
2c3e0 65 4e 6f 6e 49 6d 70 6c 69 63 69 74 46 69 6c 65  eNonImplicitFile
2c3f0 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  s)]} then {..   
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2c410 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2c420 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 50 6c  :no(copySqlitePl
2c430 61 74 66 6f 72 6d 46 69 6c 65 73 29 5d 20 26 26  atformFiles)] &&
2c440 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2c450 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20          [string 
2c460 6c 65 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d  length $platform
2c470 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20  ] > 0} then {.. 
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2c4a0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2c4b0 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2c4c0 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
2c4d0 2d 20 63 6f 70 79 69 6e 67 20 5c 22 6e 61 74 69  - copying \"nati
2c4e0 76 65 5c 22 20 66 69 6c 65 73 20 66 6f 72 20 70  ve\" files for p
2c4f0 6c 61 74 66 6f 72 6d 20 5c 22 22 20 5c 0d 0a 20  latform \"" \.. 
2c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c510 20 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 5c       $platform \
2c520 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20  "...\n]....     
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2c540 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e  each fileName $n
2c550 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b  ativeFileNames {
2c560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c570 20 20 20 20 20 20 74 72 79 43 6f 70 79 41 73 73        tryCopyAss
2c580 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20  embly $fileName 
2c590 66 61 6c 73 65 20 24 70 6c 61 74 66 6f 72 6d 0d  false $platform.
2c5a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c5b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2c5c0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2c5d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21             if {!
2c5e0 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e  [info exists ::n
2c5f0 6f 28 63 6f 70 79 53 71 6c 69 74 65 41 72 63 68  o(copySqliteArch
2c600 69 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20  itectureFiles)] 
2c610 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  && \..          
2c620 20 20 20 20 20 20 20 20 20 20 5b 73 74 72 69 6e            [strin
2c630 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
2c640 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
2c650 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2c660 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2c670 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70  test_channel [ap
2c680 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20  pendArgs \..    
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69 6e 67 20    "---- copying 
2c6b0 5c 22 6e 61 74 69 76 65 5c 22 20 66 69 6c 65 73  \"native\" files
2c6c0 20 66 6f 72 20 61 72 63 68 69 74 65 63 74 75 72   for architectur
2c6d0 65 20 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20  e \"" \..       
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2c6f0 61 72 63 68 69 74 65 63 74 75 72 65 20 5c 22 2e  architecture \".
2c700 2e 2e 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n]....       
2c710 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2c720 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74  ch fileName $nat
2c730 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
2c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c750 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2c760 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
2c770 6c 73 65 20 24 61 72 63 68 69 74 65 63 74 75 72  lse $architectur
2c780 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
2c790 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2c7a0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2c7c0 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a  {![info exists :
2c7d0 3a 6e 6f 28 63 6f 70 79 53 71 6c 69 74 65 46 6f  :no(copySqliteFo
2c7e0 72 63 65 64 4e 61 74 69 76 65 46 69 6c 65 73 29  rcedNativeFiles)
2c7f0 5d 20 26 26 20 5c 0d 0a 20 20 20 20 20 20 20 20  ] && \..        
2c800 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65 74              [get
2c810 42 75 69 6c 64 4e 61 74 69 76 65 5d 7d 20 74 68  BuildNative]} th
2c820 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2c830 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2c840 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2c850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c860 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70         "---- cop
2c870 79 69 6e 67 20 66 6f 72 63 65 64 20 5c 22 6e 61  ying forced \"na
2c880 74 69 76 65 5c 22 20 66 69 6c 65 73 2e 2e 2e 5c  tive\" files...\
2c890 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n"....          
2c8a0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2c8b0 66 69 6c 65 4e 61 6d 65 20 24 6e 61 74 69 76 65  fileName $native
2c8c0 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20  FileNames {..   
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62 6c 79   tryCopyAssembly
2c8f0 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c 73 65   $fileName false
2c900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2c910 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2c920 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2c930 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2c940 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c950 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e          if {![in
2c960 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63  fo exists ::no(c
2c970 6f 70 79 53 71 6c 69 74 65 4d 69 78 65 64 46 69  opySqliteMixedFi
2c980 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2c990 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d 0a               #..
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
2c9b0 4e 4f 54 45 3a 20 49 66 20 74 68 65 20 22 6e 61  NOTE: If the "na
2c9c0 74 69 76 65 22 20 72 75 6e 74 69 6d 65 20 6f 70  tive" runtime op
2c9d0 74 69 6f 6e 20 69 73 20 73 65 74 2c 20 63 6f 70  tion is set, cop
2c9e0 79 20 69 6d 70 6c 69 63 69 74 0d 0a 20 20 20 20  y implicit..    
2c9f0 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2ca00 20 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73 73    mixed-mode ass
2ca10 65 6d 62 6c 79 20 66 69 6c 65 73 20 61 73 20 77  embly files as w
2ca20 65 6c 6c 2e 20 20 54 68 65 20 72 75 6e 74 69 6d  ell.  The runtim
2ca30 65 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20 20 20  e option..      
2ca40 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2ca50 63 68 65 63 6b 20 69 73 20 68 61 6e 64 6c 65 64  check is handled
2ca60 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 74   when building t
2ca70 68 65 20 6c 69 73 74 20 6f 66 20 6d 69 78 65 64  he list of mixed
2ca80 2d 6d 6f 64 65 0d 0a 20 20 20 20 20 20 20 20 20  -mode..         
2ca90 20 20 20 20 20 23 20 20 20 20 20 20 20 61 73 73       #       ass
2caa0 65 6d 62 6c 79 20 66 69 6c 65 20 6e 61 6d 65 73  embly file names
2cab0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2cac0 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   #..            
2cad0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2cae0 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2caf0 69 74 65 49 6d 70 6c 69 63 69 74 4d 69 78 65 64  iteImplicitMixed
2cb00 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d  Files)]} then {.
2cb10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cb20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2cb30 68 61 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20  hannel \..      
2cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2cb50 2d 2d 2d 20 63 6f 70 79 69 6e 67 20 69 6d 70 6c  --- copying impl
2cb60 69 63 69 74 20 5c 22 6d 69 78 65 64 5c 22 20 66  icit \"mixed\" f
2cb70 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20  iles...\n"....  
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2cb90 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2cba0 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  mixedFileNames {
2cbb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2cbc0 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2cbd0 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61  bly $fileName fa
2cbe0 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
2cbf0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2cc00 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2cc10 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69           if {![i
2cc20 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28  nfo exists ::no(
2cc30 63 6f 70 79 53 71 6c 69 74 65 4e 6f 6e 49 6d 70  copySqliteNonImp
2cc40 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d 20 74 68  licitFiles)]} th
2cc50 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2cc60 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
2cc70 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 6f 70   exists ::no(cop
2cc80 79 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d 46  ySqlitePlatformF
2cc90 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
2cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ccb0 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2ccc0 24 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20  $platform] > 0} 
2ccd0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2cce0 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20            tputs 
2ccf0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
2cd00 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20  [appendArgs \.. 
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 70 79 69       "---- copyi
2cd30 6e 67 20 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c  ng \"mixed\" fil
2cd40 65 73 20 66 6f 72 20 70 6c 61 74 66 6f 72 6d 20  es for platform 
2cd50 5c 22 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  \"" \..         
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 24 70 6c               $pl
2cd70 61 74 66 6f 72 6d 20 5c 22 2e 2e 2e 5c 6e 5d 0d  atform \"...\n].
2cd80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2cd90 20 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c       foreach fil
2cda0 65 4e 61 6d 65 20 24 6d 69 78 65 64 46 69 6c 65  eName $mixedFile
2cdb0 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20  Names {..       
2cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2cdd0 43 6f 70 79 41 73 73 65 6d 62 6c 79 20 24 66 69  CopyAssembly $fi
2cde0 6c 65 4e 61 6d 65 20 66 61 6c 73 65 20 24 70 6c  leName false $pl
2cdf0 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20 20  atform..        
2ce00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2ce20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ce30 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2ce40 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2ce50 69 74 65 41 72 63 68 69 74 65 63 74 75 72 65 46  iteArchitectureF
2ce60 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20  iles)] && \..   
2ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce80 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2ce90 24 61 72 63 68 69 74 65 63 74 75 72 65 5d 20 3e  $architecture] >
2cea0 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2cec0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2ced0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2cee0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2cef0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63           "---- c
2cf00 6f 70 79 69 6e 67 20 5c 22 6d 69 78 65 64 5c 22  opying \"mixed\"
2cf10 20 66 69 6c 65 73 20 66 6f 72 20 61 72 63 68 69   files for archi
2cf20 74 65 63 74 75 72 65 20 5c 22 22 20 5c 0d 0a 20  tecture \"" \.. 
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74 75       $architectu
2cf50 72 65 20 5c 22 2e 2e 2e 5c 6e 5d 0d 0a 0d 0a 20  re \"...\n].... 
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf70 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d   foreach fileNam
2cf80 65 20 24 6d 69 78 65 64 46 69 6c 65 4e 61 6d 65  e $mixedFileName
2cf90 73 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s {..           
2cfa0 20 20 20 20 20 20 20 20 20 74 72 79 43 6f 70 79           tryCopy
2cfb0 41 73 73 65 6d 62 6c 79 20 24 66 69 6c 65 4e 61  Assembly $fileNa
2cfc0 6d 65 20 66 61 6c 73 65 20 24 61 72 63 68 69 74  me false $archit
2cfd0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
2cfe0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2d000 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d010 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2d020 73 74 73 20 3a 3a 6e 6f 28 63 6f 70 79 53 71 6c  sts ::no(copySql
2d030 69 74 65 46 6f 72 63 65 64 4d 69 78 65 64 46 69  iteForcedMixedFi
2d040 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20 20 20  les)] && \..    
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 5b 67 65 74 42 75 69 6c 64 4e 61 74 69 76 65 5d  [getBuildNative]
2d070 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
2d080 20 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74              tput
2d090 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
2d0a0 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  l \..           
2d0b0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2d0c0 20 63 6f 70 79 69 6e 67 20 66 6f 72 63 65 64 20   copying forced 
2d0d0 5c 22 6d 69 78 65 64 5c 22 20 66 69 6c 65 73 2e  \"mixed\" files.
2d0e0 2e 2e 5c 6e 22 0d 0a 0d 0a 20 20 20 20 20 20 20  ..\n"....       
2d0f0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61             forea
2d100 63 68 20 66 69 6c 65 4e 61 6d 65 20 24 6d 69 78  ch fileName $mix
2d110 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d130 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d 62     tryCopyAssemb
2d140 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 66 61 6c  ly $fileName fal
2d150 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
2d160 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2d170 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2d180 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d190 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2d1a0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d1b0 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2d1c0 28 63 6f 70 79 53 71 6c 69 74 65 4d 61 6e 61 67  (copySqliteManag
2d1d0 65 64 46 69 6c 65 73 29 5d 7d 20 74 68 65 6e 20  edFiles)]} then 
2d1e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2d1f0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d200 68 61 6e 6e 65 6c 20 22 2d 2d 2d 2d 20 63 6f 70  hannel "---- cop
2d210 79 69 6e 67 20 5c 22 6d 61 6e 61 67 65 64 5c 22  ying \"managed\"
2d220 20 66 69 6c 65 73 2e 2e 2e 5c 6e 22 0d 0a 0d 0a   files...\n"....
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
2d240 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 20 24  reach fileName $
2d250 6d 61 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73  managedFileNames
2d260 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2d270 20 20 20 20 74 72 79 43 6f 70 79 41 73 73 65 6d      tryCopyAssem
2d280 62 6c 79 20 24 66 69 6c 65 4e 61 6d 65 20 74 72  bly $fileName tr
2d290 75 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue..            
2d2a0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2d2b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2d2c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  ...          #..
2d2d0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2d2e0 3a 20 53 6b 69 70 20 74 72 79 69 6e 67 20 74 6f  : Skip trying to
2d2f0 20 6c 6f 61 64 20 61 6e 79 20 66 69 6c 65 73 20   load any files 
2d300 69 66 20 69 6e 73 74 72 75 63 74 65 64 2e 0d 0a  if instructed...
2d310 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2d320 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2d330 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2d340 61 64 53 71 6c 69 74 65 46 69 6c 65 73 29 5d 7d  adSqliteFiles)]}
2d350 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d360 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20       if {![info 
2d370 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64  exists ::no(load
2d380 53 71 6c 69 74 65 49 6d 70 6c 69 63 69 74 46 69  SqliteImplicitFi
2d390 6c 65 73 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  les)]} then {.. 
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
2d3b0 4c 6f 61 64 41 73 73 65 6d 62 6c 79 20 53 79 73  LoadAssembly Sys
2d3c0 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
2d3d0 64 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dll..           
2d3e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2d3f0 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69    if {![info exi
2d400 73 74 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c  sts ::no(loadSql
2d410 69 74 65 4c 69 6e 71 46 69 6c 65 73 29 5d 7d 20  iteLinqFiles)]} 
2d420 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
2d430 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73 73        tryLoadAss
2d440 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61 74  embly System.Dat
2d450 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c  a.SQLite.Linq.dl
2d460 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l..            }
2d470 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2d480 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2d490 73 20 3a 3a 6e 6f 28 6c 6f 61 64 53 71 6c 69 74  s ::no(loadSqlit
2d4a0 65 45 66 36 46 69 6c 65 73 29 5d 7d 20 74 68 65  eEf6Files)]} the
2d4b0 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n {..           
2d4c0 20 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62     tryLoadAssemb
2d4d0 6c 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  ly System.Data.S
2d4e0 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c 0d 0a 20  QLite.EF6.dll.. 
2d4f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2d500 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2d510 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a  ![info exists ::
2d520 6e 6f 28 6c 6f 61 64 53 71 6c 69 74 65 4e 6f 6e  no(loadSqliteNon
2d530 49 6d 70 6c 69 63 69 74 46 69 6c 65 73 29 5d 7d  ImplicitFiles)]}
2d540 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
2d550 20 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66         if {![inf
2d560 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 6c 6f  o exists ::no(lo
2d570 61 64 53 71 6c 69 74 65 50 6c 61 74 66 6f 72 6d  adSqlitePlatform
2d580 46 69 6c 65 73 29 5d 20 26 26 20 5c 0d 0a 20 20  Files)] && \..  
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5a0 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2d5b0 70 6c 61 74 66 6f 72 6d 5d 20 3e 20 30 7d 20 74  platform] > 0} t
2d5c0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2d5d0 20 20 20 20 20 20 20 74 72 79 4c 6f 61 64 41 73         tryLoadAs
2d5e0 73 65 6d 62 6c 79 20 53 79 73 74 65 6d 2e 44 61  sembly System.Da
2d5f0 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 24 70  ta.SQLite.dll $p
2d600 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20 20 20 20  latform..       
2d610 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2d620 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
2d630 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 6e 6f  info exists ::no
2d640 28 6c 6f 61 64 53 71 6c 69 74 65 41 72 63 68 69  (loadSqliteArchi
2d650 74 65 63 74 75 72 65 46 69 6c 65 73 29 5d 20 26  tectureFiles)] &
2d660 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2d670 20 20 20 20 20 20 20 5b 73 74 72 69 6e 67 20 6c         [string l
2d680 65 6e 67 74 68 20 24 61 72 63 68 69 74 65 63 74  ength $architect
2d690 75 72 65 5d 20 3e 20 30 7d 20 74 68 65 6e 20 7b  ure] > 0} then {
2d6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d6b0 20 20 74 72 79 4c 6f 61 64 41 73 73 65 6d 62 6c    tryLoadAssembl
2d6c0 79 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  y System.Data.SQ
2d6d0 4c 69 74 65 2e 64 6c 6c 20 24 61 72 63 68 69 74  Lite.dll $archit
2d6e0 65 63 74 75 72 65 0d 0a 20 20 20 20 20 20 20 20  ecture..        
2d6f0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2d700 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2d710 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
2d720 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  ..        foreac
2d730 68 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24  h fileNameOnly $
2d740 6e 61 74 69 76 65 46 69 6c 65 4e 61 6d 65 73 20  nativeFileNames 
2d750 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74  {..          cat
2d760 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  ch {..          
2d770 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2d780 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2d790 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2d7a0 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c         "---- fil
2d7b0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22  e version of \""
2d7c0 20 6e 61 74 69 76 65 2f 20 24 66 69 6c 65 4e 61   native/ $fileNa
2d7d0 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2d7e0 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2d7f0 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2d800 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2d810 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2d820 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2d830 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2d840 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2d850 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2d860 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e 61    foreach fileNa
2d870 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69 6c  meOnly $mixedFil
2d880 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20  eNames {..      
2d890 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2d8a0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2d8b0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b  ::test_channel [
2d8c0 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20  appendArgs \..  
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2d8e0 2d 2d 2d 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  --- file version
2d8f0 20 6f 66 20 5c 22 22 20 6d 69 78 65 64 2f 20 24   of \"" mixed/ $
2d900 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d920 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65  "\"... \"" [file
2d930 20 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e   version [getBin
2d940 61 72 79 46 69 6c 65 4e 61 6d 65 20 5c 0d 0a 20  aryFileName \.. 
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24                 $
2d960 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 5d 20 5c  fileNameOnly]] \
2d970 22 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  "\n]..          
2d980 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
2d990 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
2d9a0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 61  fileNameOnly $ma
2d9b0 6e 61 67 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b  nagedFileNames {
2d9c0 0d 0a 20 20 20 20 20 20 20 20 20 20 63 61 74 63  ..          catc
2d9d0 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2d9e0 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2d9f0 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72  hannel [appendAr
2da00 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  gs \..          
2da10 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65        "---- file
2da20 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20   version of \"" 
2da30 6d 61 6e 61 67 65 64 2f 20 24 66 69 6c 65 4e 61  managed/ $fileNa
2da40 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20 20 20  meOnly \..      
2da50 20 20 20 20 20 20 20 20 20 20 22 5c 22 2e 2e 2e            "\"...
2da60 20 5c 22 22 20 5b 66 69 6c 65 20 76 65 72 73 69   \"" [file versi
2da70 6f 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c  on [getBinaryFil
2da80 65 4e 61 6d 65 20 5c 0d 0a 20 20 20 20 20 20 20  eName \..       
2da90 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e 61           $fileNa
2daa0 6d 65 4f 6e 6c 79 5d 5d 20 5c 22 5c 6e 5d 0d 0a  meOnly]] \"\n]..
2dab0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2dac0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2dad0 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6c 65    if {[string le
2dae0 6e 67 74 68 20 24 70 6c 61 74 66 6f 72 6d 5d 20  ngth $platform] 
2daf0 3e 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  > 0} then {..   
2db00 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2db10 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6e 61 74  ileNameOnly $nat
2db20 69 76 65 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a  iveFileNames {..
2db30 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
2db40 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h {..           
2db50 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74     tputs $::test
2db60 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64  _channel [append
2db70 41 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20  Args \..        
2db80 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20            "---- 
2db90 66 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20  file version of 
2dba0 5c 22 22 20 6e 61 74 69 76 65 2f 70 6c 61 74 66  \"" native/platf
2dbb0 6f 72 6d 2f 20 5c 0d 0a 20 20 20 20 20 20 20 20  orm/ \..        
2dbc0 20 20 20 20 20 20 20 20 20 20 24 70 6c 61 74 66            $platf
2dbd0 6f 72 6d 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  orm / $fileNameO
2dbe0 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2dbf0 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2dc00 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2dc10 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2dc20 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2dc30 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2dc40 20 20 20 20 20 20 20 20 24 70 6c 61 74 66 6f 72          $platfor
2dc50 6d 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20 20 20 20 20  m]] \"\n]..     
2dc60 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2dc70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2dc80 20 20 20 66 6f 72 65 61 63 68 20 66 69 6c 65 4e     foreach fileN
2dc90 61 6d 65 4f 6e 6c 79 20 24 6d 69 78 65 64 46 69  ameOnly $mixedFi
2dca0 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20  leNames {..     
2dcb0 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a         catch {..
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 70                tp
2dcd0 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e  uts $::test_chan
2dce0 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20  nel [appendArgs 
2dcf0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
2dd00 20 20 20 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20       "---- file 
2dd10 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6d  version of \"" m
2dd20 69 78 65 64 2f 70 6c 61 74 66 6f 72 6d 2f 20 5c  ixed/platform/ \
2dd30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dd40 20 20 20 20 24 70 6c 61 74 66 6f 72 6d 20 2f 20      $platform / 
2dd50 24 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c  $fileNameOnly "\
2dd60 22 2e 2e 2e 20 5c 22 22 20 5b 66 69 6c 65 20 5c  "... \"" [file \
2dd70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dd80 20 20 20 20 76 65 72 73 69 6f 6e 20 5b 67 65 74      version [get
2dd90 42 69 6e 61 72 79 46 69 6c 65 4e 61 6d 65 20 24  BinaryFileName $
2dda0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a  fileNameOnly \..
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 24 70 6c 61 74 66 6f 72 6d 5d 5d 20 5c 22    $platform]] \"
2ddd0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2dde0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2ddf0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2de00 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e        if {[strin
2de10 67 20 6c 65 6e 67 74 68 20 24 61 72 63 68 69 74  g length $archit
2de20 65 63 74 75 72 65 5d 20 3e 20 30 7d 20 74 68 65  ecture] > 0} the
2de30 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 66  n {..          f
2de40 6f 72 65 61 63 68 20 66 69 6c 65 4e 61 6d 65 4f  oreach fileNameO
2de50 6e 6c 79 20 24 6e 61 74 69 76 65 46 69 6c 65 4e  nly $nativeFileN
2de60 61 6d 65 73 20 7b 0d 0a 20 20 20 20 20 20 20 20  ames {..        
2de70 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2de80 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2de90 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2dea0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dec0 20 20 22 2d 2d 2d 2d 20 66 69 6c 65 20 76 65 72    "---- file ver
2ded0 73 69 6f 6e 20 6f 66 20 5c 22 22 20 6e 61 74 69  sion of \"" nati
2dee0 76 65 2f 61 72 63 68 69 74 65 63 74 75 72 65 2f  ve/architecture/
2def0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
2df00 20 20 20 20 20 20 24 61 72 63 68 69 74 65 63 74        $architect
2df10 75 72 65 20 2f 20 24 66 69 6c 65 4e 61 6d 65 4f  ure / $fileNameO
2df20 6e 6c 79 20 22 5c 22 2e 2e 2e 20 5c 22 22 20 5b  nly "\"... \"" [
2df30 66 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  file \..        
2df40 20 20 20 20 20 20 20 20 20 20 76 65 72 73 69 6f            versio
2df50 6e 20 5b 67 65 74 42 69 6e 61 72 79 46 69 6c 65  n [getBinaryFile
2df60 4e 61 6d 65 20 24 66 69 6c 65 4e 61 6d 65 4f 6e  Name $fileNameOn
2df70 6c 79 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ly \..          
2df80 20 20 20 20 20 20 20 20 24 61 72 63 68 69 74 65          $archite
2df90 63 74 75 72 65 5d 5d 20 5c 22 5c 6e 5d 0d 0a 20  cture]] \"\n].. 
2dfa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2dfb0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2dfc0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 66         foreach f
2dfd0 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 24 6d 69 78  ileNameOnly $mix
2dfe0 65 64 46 69 6c 65 4e 61 6d 65 73 20 7b 0d 0a 20  edFileNames {.. 
2dff0 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68             catch
2e000 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e010 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e020 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e030 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2e040 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 66           "---- f
2e050 69 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c  ile version of \
2e060 22 22 20 6d 69 78 65 64 2f 61 72 63 68 69 74 65  "" mixed/archite
2e070 63 74 75 72 65 2f 20 5c 0d 0a 20 20 20 20 20 20  cture/ \..      
2e080 20 20 20 20 20 20 20 20 20 20 20 20 24 61 72 63              $arc
2e090 68 69 74 65 63 74 75 72 65 20 2f 20 24 66 69 6c  hitecture / $fil
2e0a0 65 4e 61 6d 65 4f 6e 6c 79 20 22 5c 22 2e 2e 2e  eNameOnly "\"...
2e0b0 20 5c 22 22 20 5b 66 69 6c 65 20 5c 0d 0a 20 20   \"" [file \..  
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0d0 76 65 72 73 69 6f 6e 20 5b 67 65 74 42 69 6e 61  version [getBina
2e0e0 72 79 46 69 6c 65 4e 61 6d 65 20 24 66 69 6c 65  ryFileName $file
2e0f0 4e 61 6d 65 4f 6e 6c 79 20 5c 0d 0a 20 20 20 20  NameOnly \..    
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61                $a
2e110 72 63 68 69 74 65 63 74 75 72 65 5d 5d 20 5c 22  rchitecture]] \"
2e120 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  \n]..           
2e130 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d   }..          }.
2e140 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
2e150 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2e160 20 23 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68   # NOTE: Grab th
2e170 65 20 6c 69 73 74 20 6f 66 20 6d 61 6e 61 67 65  e list of manage
2e180 64 20 61 73 73 65 6d 62 6c 69 65 73 20 66 6f 72  d assemblies for
2e190 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2e1a0 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 23 20  cess..        # 
2e1b0 20 20 20 20 20 20 61 6e 64 20 72 65 70 6f 72 74        and report
2e1c0 20 6f 6e 20 74 68 65 20 53 79 73 74 65 6d 2e 44   on the System.D
2e1d0 61 74 61 2e 53 51 4c 69 74 65 20 72 65 6c 61 74  ata.SQLite relat
2e1e0 65 64 20 6f 6e 65 73 2e 0d 0a 20 20 20 20 20 20  ed ones...      
2e1f0 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20    #..        if 
2e200 7b 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65  {[haveSQLiteObje
2e210 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2e220 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2e230 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2e240 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2e250 6e 76 6f 6b 65 20 55 74 69 6c 69 74 79 20 47 65  nvoke Utility Ge
2e260 74 41 73 73 65 6d 62 6c 69 65 73 0d 0a 20 20 20  tAssemblies..   
2e270 20 20 20 20 20 20 20 7d 20 61 73 73 65 6d 62 6c         } assembl
2e280 69 65 73 5d 20 3d 3d 20 30 20 7c 7c 20 5b 63 61  ies] == 0 || [ca
2e290 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  tch {..         
2e2a0 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65     object invoke
2e2b0 20 41 70 70 44 6f 6d 61 69 6e 2e 43 75 72 72 65   AppDomain.Curre
2e2c0 6e 74 44 6f 6d 61 69 6e 20 47 65 74 41 73 73 65  ntDomain GetAsse
2e2d0 6d 62 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20  mblies..        
2e2e0 20 20 7d 20 61 73 73 65 6d 62 6c 69 65 73 5d 20    } assemblies] 
2e2f0 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  == 0} then {..  
2e300 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
2e310 20 66 6f 72 65 61 63 68 20 61 73 73 65 6d 62 6c   foreach assembl
2e320 79 20 24 61 73 73 65 6d 62 6c 69 65 73 20 7b 0d  y $assemblies {.
2e330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e340 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
2e350 20 5c 7b 53 79 73 74 65 6d 2e 44 61 74 61 2e 53   \{System.Data.S
2e360 51 4c 69 74 65 2a 20 24 61 73 73 65 6d 62 6c 79  QLite* $assembly
2e370 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
2e380 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
2e390 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
2e3a0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 20 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20      "---- found 
2e3d0 6c 6f 61 64 65 64 20 61 73 73 65 6d 62 6c 79 3a  loaded assembly:
2e3e0 20 22 20 24 61 73 73 65 6d 62 6c 79 20 5c 6e 5d   " $assembly \n]
2e3f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e400 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
2e410 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2e420 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2e430 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20 20      catch {..   
2e440 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a         tputs $::
2e450 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d 0a  test_channel \..
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
2e470 2d 2d 2d 20 64 65 66 69 6e 65 20 63 6f 6e 73 74  --- define const
2e480 61 6e 74 73 20 66 6f 72 20 5c 22 53 79 73 74 65  ants for \"Syste
2e490 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 5c 22 2e  m.Data.SQLite\".
2e4a0 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .. "....        
2e4b0 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b 0d 0a    if {[catch {..
2e4c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
2e4d0 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c 61 67 73  ct invoke -flags
2e4e0 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c 0d 0a 20   +NonPublic \.. 
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2e500 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
2e510 65 2e 53 51 4c 69 74 65 33 20 44 65 66 69 6e 65  e.SQLite3 Define
2e520 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
2e530 20 20 20 20 20 7d 20 64 65 66 69 6e 65 43 6f 6e       } defineCon
2e540 73 74 61 6e 74 73 5d 20 3d 3d 20 30 7d 20 74 68  stants] == 0} th
2e550 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2e560 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e570 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e580 72 67 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20  rgs [formatList 
2e590 5b 6c 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20  [lsort \..      
2e5a0 20 20 20 20 20 20 20 20 20 20 24 64 65 66 69 6e            $defin
2e5b0 65 43 6f 6e 73 74 61 6e 74 73 5d 20 3c 6e 6f 6e  eConstants] <non
2e5c0 65 3e 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  e>] \n]..       
2e5d0 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20     } else {..   
2e5e0 20 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24           tputs $
2e5f0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75  ::test_channel u
2e600 6e 6b 6e 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20  nknown\n..      
2e610 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
2e620 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
2e630 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
2e640 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
2e650 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
2e660 20 20 20 20 20 20 22 2d 2d 2d 2d 20 73 6f 75 72        "---- sour
2e670 63 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 5c 22  ce version of \"
2e680 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2e690 74 65 2e 64 6c 6c 5c 22 2e 2e 2e 20 22 0d 0a 0d  te.dll\"... "...
2e6a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
2e6b0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
2e6c0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
2e6d0 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
2e6e0 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
2e6f0 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
2e700 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
2e710 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 50 72 6f 76  eConnection Prov
2e720 69 64 65 72 56 65 72 73 69 6f 6e 0d 0a 20 20 20  iderVersion..   
2e730 20 20 20 20 20 20 20 7d 20 76 65 72 73 69 6f 6e         } version
2e740 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20 7b 0d 0a  ] == 0} then {..
2e750 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
2e760 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24  [string length $
2e770 76 65 72 73 69 6f 6e 5d 20 3d 3d 20 30 7d 20 74  version] == 0} t
2e780 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
2e790 20 20 20 20 20 73 65 74 20 76 65 72 73 69 6f 6e       set version
2e7a0 20 6e 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20   null..         
2e7b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2e7c0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e7d0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2e7e0 72 67 73 20 24 76 65 72 73 69 6f 6e 20 5c 6e 5d  rgs $version \n]
2e7f0 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c  ..          } el
2e800 73 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  se {..          
2e810 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2e820 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c  channel unknown\
2e830 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  n..          }..
2e840 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2e850 20 20 20 20 20 63 61 74 63 68 20 7b 0d 0a 20 20       catch {..  
2e860 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
2e870 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5c 0d  :test_channel \.
2e880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
2e890 2d 2d 2d 2d 20 73 6f 75 72 63 65 20 63 68 65 63  ---- source chec
2e8a0 6b 6f 75 74 20 6f 66 20 5c 22 53 79 73 74 65 6d  kout of \"System
2e8b0 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c  .Data.SQLite.dll
2e8c0 5c 22 2e 2e 2e 20 22 0d 0a 0d 0a 20 20 20 20 20  \"... "....     
2e8d0 20 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20       if {[catch 
2e8e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  {..            o
2e8f0 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 2d 66 6c  bject invoke -fl
2e900 61 67 73 20 2b 4e 6f 6e 50 75 62 6c 69 63 20 5c  ags +NonPublic \
2e910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e920 20 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51    System.Data.SQ
2e930 4c 69 74 65 2e 53 51 4c 69 74 65 43 6f 6e 6e 65  Lite.SQLiteConne
2e940 63 74 69 6f 6e 20 50 72 6f 76 69 64 65 72 53 6f  ction ProviderSo
2e950 75 72 63 65 49 64 0d 0a 20 20 20 20 20 20 20 20  urceId..        
2e960 20 20 7d 20 73 6f 75 72 63 65 49 64 5d 20 3d 3d    } sourceId] ==
2e970 20 30 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20   0} then {..    
2e980 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74 72          if {[str
2e990 69 6e 67 20 6c 65 6e 67 74 68 20 24 73 6f 75 72  ing length $sour
2e9a0 63 65 49 64 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ceId] == 0} then
2e9b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e9c0 20 20 73 65 74 20 73 6f 75 72 63 65 49 64 20 6e    set sourceId n
2e9d0 75 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ull..           
2e9e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2e9f0 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
2ea00 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
2ea10 73 20 24 73 6f 75 72 63 65 49 64 20 5c 6e 5d 0d  s $sourceId \n].
2ea20 0a 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73  .          } els
2ea30 65 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e {..           
2ea40 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63   tputs $::test_c
2ea50 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f 77 6e 5c 6e  hannel unknown\n
2ea60 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2ea70 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ea80 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ea90 20 4e 4f 54 45 3a 20 52 65 73 65 74 20 63 61 63   NOTE: Reset cac
2eaa0 68 65 64 20 22 62 72 65 61 6b 20 69 6e 74 6f 20  hed "break into 
2eab0 64 65 62 75 67 67 65 72 22 20 73 65 74 74 69 6e  debugger" settin
2eac0 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  g so that it can
2ead0 20 62 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20   be..        #  
2eae0 20 20 20 20 20 75 73 65 64 20 64 75 72 69 6e 67       used during
2eaf0 20 74 68 65 20 74 65 73 74 20 66 69 6c 65 2c 20   the test file, 
2eb00 69 66 20 6e 65 65 64 65 64 2e 0d 0a 20 20 20 20  if needed...    
2eb10 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
2eb20 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
2eb30 20 3a 3a 6e 6f 28 72 65 73 65 74 42 72 65 61 6b   ::no(resetBreak
2eb40 49 6e 74 6f 44 65 62 75 67 67 65 72 29 5d 20 26  IntoDebugger)] &
2eb50 26 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  & \..           
2eb60 20 5b 68 61 76 65 53 51 4c 69 74 65 4f 62 6a 65   [haveSQLiteObje
2eb70 63 74 43 6f 6d 6d 61 6e 64 5d 7d 20 74 68 65 6e  ctCommand]} then
2eb80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66   {..          if
2eb90 20 7b 5b 63 61 74 63 68 20 7b 0d 0a 20 20 20 20   {[catch {..    
2eba0 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 69          object i
2ebb0 6e 76 6f 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f  nvoke -flags +No
2ebc0 6e 50 75 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20  nPublic \..     
2ebd0 20 20 20 20 20 20 20 20 20 20 20 53 79 73 74 65             Syste
2ebe0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 48 65  m.Data.SQLite.He
2ebf0 6c 70 65 72 4d 65 74 68 6f 64 73 20 52 65 73 65  lperMethods Rese
2ec00 74 42 72 65 61 6b 49 6e 74 6f 44 65 62 75 67 67  tBreakIntoDebugg
2ec10 65 72 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 20  er..          } 
2ec20 72 65 73 75 6c 74 5d 20 3d 3d 20 30 7d 20 74 68  result] == 0} th
2ec30 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  en {..          
2ec40 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
2ec50 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
2ec60 72 67 73 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  rgs \..         
2ec70 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 61 6c         "---- cal
2ec80 6c 20 52 65 73 65 74 42 72 65 61 6b 49 6e 74 6f  l ResetBreakInto
2ec90 44 65 62 75 67 67 65 72 28 29 2e 2e 2e 20 6f 6b  Debugger()... ok
2eca0 5c 6e 22 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  \n"]..          
2ecb0 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
2ecc0 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
2ecd0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61 70 70  est_channel [app
2ece0 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20 20 20  endArgs \..     
2ecf0 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
2ed00 20 63 61 6c 6c 20 52 65 73 65 74 42 72 65 61 6b   call ResetBreak
2ed10 49 6e 74 6f 44 65 62 75 67 67 65 72 28 29 2e 2e  IntoDebugger()..
2ed20 2e 20 65 72 72 6f 72 3a 20 22 20 5c 0d 0a 20 20  . error: " \..  
2ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e                \n
2ed40 5c 74 20 24 72 65 73 75 6c 74 20 5c 6e 5d 0d 0a  \t $result \n]..
2ed50 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2ed60 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2ed70 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
2ed80 4f 54 45 3a 20 43 68 65 63 6b 20 74 68 65 20 61  OTE: Check the a
2ed90 76 61 69 6c 61 62 6c 65 20 62 75 69 6c 64 73 20  vailable builds 
2eda0 28 61 6e 64 20 22 72 65 6c 65 61 73 65 73 22 29  (and "releases")
2edb0 20 6f 66 20 53 51 4c 69 74 65 20 61 6e 64 0d 0a   of SQLite and..
2edc0 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
2edd0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
2ede0 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  te...        #..
2edf0 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
2ee00 53 51 4c 69 74 65 42 75 69 6c 64 73 20 24 3a 3a  SQLiteBuilds $::
2ee10 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 20 20  test_channel..  
2ee20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51        checkForSQ
2ee30 4c 69 74 65 52 65 6c 65 61 73 65 73 20 24 3a 3a  LiteReleases $::
2ee40 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
2ee50 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2ee60 20 20 20 23 20 4e 4f 54 45 3a 20 4e 6f 77 2c 20     # NOTE: Now, 
2ee70 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
2ee80 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
2ee90 72 65 20 6c 69 62 72 61 72 79 20 69 73 20 61 76  re library is av
2eea0 61 69 6c 61 62 6c 65 0d 0a 20 20 20 20 20 20 20  ailable..       
2eeb0 20 23 20 20 20 20 20 20 20 28 69 2e 65 2e 20 62   #       (i.e. b
2eec0 65 63 61 75 73 65 20 74 68 65 20 6d 61 6e 61 67  ecause the manag
2eed0 65 64 2d 6f 6e 6c 79 20 53 79 73 74 65 6d 2e 44  ed-only System.D
2eee0 61 74 61 2e 53 51 4c 69 74 65 20 61 73 73 65 6d  ata.SQLite assem
2eef0 62 6c 79 20 63 61 6e 0d 0a 20 20 20 20 20 20 20  bly can..       
2ef00 20 23 20 20 20 20 20 20 20 6c 6f 61 64 20 77 69   #       load wi
2ef10 74 68 6f 75 74 20 69 74 3b 20 68 6f 77 65 76 65  thout it; howeve
2ef20 72 2c 20 69 74 20 63 61 6e 6e 6f 74 20 64 6f 20  r, it cannot do 
2ef30 61 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 20  anything useful 
2ef40 77 69 74 68 6f 75 74 0d 0a 20 20 20 20 20 20 20  without..       
2ef50 20 23 20 20 20 20 20 20 20 69 74 29 2e 20 20 49   #       it).  I
2ef60 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 74  f we are using t
2ef70 68 65 20 6d 69 78 65 64 2d 6d 6f 64 65 20 61 73  he mixed-mode as
2ef80 73 65 6d 62 6c 79 20 61 6e 64 20 77 65 20 61 6c  sembly and we al
2ef90 72 65 61 64 79 0d 0a 20 20 20 20 20 20 20 20 23  ready..        #
2efa0 20 20 20 20 20 20 20 66 6f 75 6e 64 20 69 74 20         found it 
2efb0 28 61 62 6f 76 65 29 2c 20 74 68 69 73 20 73 68  (above), this sh
2efc0 6f 75 6c 64 20 61 6c 77 61 79 73 20 73 75 63 63  ould always succ
2efd0 65 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d  eed...        #.
2efe0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f  .        checkFo
2eff0 72 53 51 4c 69 74 65 4c 69 62 72 61 72 79 20 24  rSQLiteLibrary $
2f000 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a  ::test_channel..
2f010 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
2f020 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
2f030 63 6b 20 69 66 20 74 68 65 20 53 51 4c 69 74 65  ck if the SQLite
2f040 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62 6c   interop assembl
2f050 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0d  y is available..
2f060 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
2f070 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69      checkForSQLi
2f080 74 65 49 6e 74 65 72 6f 70 20 24 3a 3a 74 65 73  teInterop $::tes
2f090 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20 20  t_channel....   
2f0a0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2f0b0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 74 68  # NOTE: Check th
2f0c0 65 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  e SQLite databas
2f0d0 65 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20  e and temporary 
2f0e0 64 69 72 65 63 74 6f 72 69 65 73 2e 0d 0a 20 20  directories...  
2f0f0 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2f100 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74 65 44   checkForSQLiteD
2f110 69 72 65 63 74 6f 72 69 65 73 20 24 3a 3a 74 65  irectories $::te
2f120 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a 20 20  st_channel....  
2f130 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2f140 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d 70 74   # NOTE: Attempt
2f150 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
2f160 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69 6c 65   various compile
2f170 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 6e 65  -time options ne
2f180 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20 20 20  eded for..      
2f190 20 20 23 20 20 20 20 20 20 20 74 65 73 74 20 63    #       test c
2f1a0 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72 65 20  onstraints were 
2f1b0 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65 20  enabled for the 
2f1c0 6d 61 6e 61 67 65 64 20 61 73 73 65 6d 62 6c 79  managed assembly
2f1d0 2e 20 20 54 68 65 72 65 0d 0a 20 20 20 20 20 20  .  There..      
2f1e0 20 20 23 20 20 20 20 20 20 20 61 72 65 20 73 6f    #       are so
2f1f0 6d 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  me compile-time 
2f200 6f 70 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  options that mus
2f210 74 20 61 6c 73 6f 20 68 61 76 65 20 62 65 65 6e  t also have been
2f220 20 65 6e 61 62 6c 65 64 0d 0a 20 20 20 20 20 20   enabled..      
2f230 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74 68    #       for th
2f240 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2f250 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
2f260 65 20 65 66 66 65 63 74 69 76 65 2e 20 20 46 6f  e effective.  Fo
2f270 72 20 74 68 6f 73 65 0d 0a 20 20 20 20 20 20 20  r those..       
2f280 20 23 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 73   #       options
2f290 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 61 73 73  , it will be ass
2f2a0 75 6d 65 64 20 74 68 61 74 20 69 74 20 77 61 73  umed that it was
2f2b0 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68 65   enabled for the
2f2c0 20 69 6e 74 65 72 6f 70 0d 0a 20 20 20 20 20 20   interop..      
2f2d0 20 20 23 20 20 20 20 20 20 20 61 73 73 65 6d 62    #       assemb
2f2e0 6c 79 20 69 66 20 69 74 20 77 61 73 20 65 6e 61  ly if it was ena
2f2f0 62 6c 65 64 20 66 6f 72 20 74 68 65 20 6d 61 6e  bled for the man
2f300 61 67 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a  aged assembly...
2f310 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f320 20 20 20 66 6f 72 65 61 63 68 20 64 65 66 69 6e     foreach defin
2f330 65 43 6f 6e 73 74 61 6e 74 20 5b 6c 69 73 74 20  eConstant [list 
2f340 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  \..            C
2f350 48 45 43 4b 5f 53 54 41 54 45 20 43 4f 55 4e 54  HECK_STATE COUNT
2f360 5f 48 41 4e 44 4c 45 20 44 45 42 55 47 20 49 4e  _HANDLE DEBUG IN
2f370 54 45 52 4f 50 5f 43 4f 44 45 43 20 49 4e 54 45  TEROP_CODEC INTE
2f380 52 4f 50 5f 44 45 42 55 47 20 5c 0d 0a 20 20 20  ROP_DEBUG \..   
2f390 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50           INTEROP
2f3a0 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54  _EXTENSION_FUNCT
2f3b0 49 4f 4e 53 20 49 4e 54 45 52 4f 50 5f 46 54 53  IONS INTEROP_FTS
2f3c0 35 5f 45 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20  5_EXTENSION \.. 
2f3d0 20 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52             INTER
2f3e0 4f 50 5f 49 4e 43 4c 55 44 45 5f 43 45 52 4f 44  OP_INCLUDE_CEROD
2f3f0 20 49 4e 54 45 52 4f 50 5f 49 4e 43 4c 55 44 45   INTEROP_INCLUDE
2f400 5f 45 58 54 52 41 20 49 4e 54 45 52 4f 50 5f 49  _EXTRA INTEROP_I
2f410 4e 43 4c 55 44 45 5f 53 45 45 20 5c 0d 0a 20 20  NCLUDE_SEE \..  
2f420 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f            INTERO
2f430 50 5f 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  P_INCLUDE_ZIPVFS
2f440 20 49 4e 54 45 52 4f 50 5f 4a 53 4f 4e 31 5f 45   INTEROP_JSON1_E
2f450 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2f460 20 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f          INTEROP_
2f470 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 49 4e 54  LEGACY_CLOSE INT
2f480 45 52 4f 50 5f 4c 4f 47 20 49 4e 54 45 52 4f 50  EROP_LOG INTEROP
2f490 5f 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45  _PERCENTILE_EXTE
2f4a0 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20  NSION \..       
2f4b0 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 52 45 47       INTEROP_REG
2f4c0 45 58 50 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  EXP_EXTENSION IN
2f4d0 54 45 52 4f 50 5f 53 45 53 53 49 4f 4e 5f 45 58  TEROP_SESSION_EX
2f4e0 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20  TENSION \..     
2f4f0 20 20 20 20 20 20 20 49 4e 54 45 52 4f 50 5f 53         INTEROP_S
2f500 48 41 31 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e  HA1_EXTENSION IN
2f510 54 45 52 4f 50 5f 54 45 53 54 5f 45 58 54 45 4e  TEROP_TEST_EXTEN
2f520 53 49 4f 4e 20 5c 0d 0a 20 20 20 20 20 20 20 20  SION \..        
2f530 20 20 20 20 49 4e 54 45 52 4f 50 5f 54 4f 54 59      INTEROP_TOTY
2f540 50 45 5f 45 58 54 45 4e 53 49 4f 4e 20 49 4e 54  PE_EXTENSION INT
2f550 45 52 4f 50 5f 56 49 52 54 55 41 4c 5f 54 41 42  EROP_VIRTUAL_TAB
2f560 4c 45 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  LE \..          
2f570 20 20 4e 45 54 5f 32 30 20 4e 45 54 5f 33 35 20    NET_20 NET_35 
2f580 4e 45 54 5f 34 30 20 4e 45 54 5f 34 35 20 4e 45  NET_40 NET_45 NE
2f590 54 5f 34 35 31 20 4e 45 54 5f 34 35 32 20 4e 45  T_451 NET_452 NE
2f5a0 54 5f 34 36 20 4e 45 54 5f 34 36 31 20 5c 0d 0a  T_46 NET_461 \..
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 4e 45 54 5f              NET_
2f5c0 34 36 32 20 4e 45 54 5f 34 37 20 4e 45 54 5f 34  462 NET_47 NET_4
2f5d0 37 31 20 4e 45 54 5f 34 37 32 20 4e 45 54 5f 43  71 NET_472 NET_C
2f5e0 4f 4d 50 41 43 54 5f 32 30 20 4e 45 54 5f 53 54  OMPACT_20 NET_ST
2f5f0 41 4e 44 41 52 44 5f 32 30 20 5c 0d 0a 20 20 20  ANDARD_20 \..   
2f600 20 20 20 20 20 20 20 20 20 50 4c 41 54 46 4f 52           PLATFOR
2f610 4d 5f 43 4f 4d 50 41 43 54 46 52 41 4d 45 57 4f  M_COMPACTFRAMEWO
2f620 52 4b 20 50 52 45 4c 4f 41 44 5f 4e 41 54 49 56  RK PRELOAD_NATIV
2f630 45 5f 4c 49 42 52 41 52 59 20 52 45 54 41 52 47  E_LIBRARY RETARG
2f640 45 54 41 42 4c 45 20 5c 0d 0a 20 20 20 20 20 20  ETABLE \..      
2f650 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41        SQLITE_STA
2f660 4e 44 41 52 44 20 54 48 52 4f 57 5f 4f 4e 5f 44  NDARD THROW_ON_D
2f670 49 53 50 4f 53 45 44 20 54 52 41 43 45 20 54 52  ISPOSED TRACE TR
2f680 41 43 45 5f 43 4f 4e 4e 45 43 54 49 4f 4e 20 5c  ACE_CONNECTION \
2f690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 52  ..            TR
2f6a0 41 43 45 5f 44 45 54 45 43 54 49 4f 4e 20 54 52  ACE_DETECTION TR
2f6b0 41 43 45 5f 48 41 4e 44 4c 45 20 54 52 41 43 45  ACE_HANDLE TRACE
2f6c0 5f 50 52 45 4c 4f 41 44 20 54 52 41 43 45 5f 53  _PRELOAD TRACE_S
2f6d0 48 41 52 45 44 20 5c 0d 0a 20 20 20 20 20 20 20  HARED \..       
2f6e0 20 20 20 20 20 54 52 41 43 45 5f 53 54 41 54 45       TRACE_STATE
2f6f0 4d 45 4e 54 20 54 52 41 43 45 5f 57 41 52 4e 49  MENT TRACE_WARNI
2f700 4e 47 20 54 52 41 43 4b 5f 4d 45 4d 4f 52 59 5f  NG TRACK_MEMORY_
2f710 42 59 54 45 53 20 5c 0d 0a 20 20 20 20 20 20 20  BYTES \..       
2f720 20 20 20 20 20 55 53 45 5f 45 4e 54 49 54 59 5f       USE_ENTITY_
2f730 46 52 41 4d 45 57 4f 52 4b 5f 36 20 55 53 45 5f  FRAMEWORK_6 USE_
2f740 49 4e 54 45 52 4f 50 5f 44 4c 4c 20 55 53 45 5f  INTEROP_DLL USE_
2f750 50 52 45 50 41 52 45 5f 56 32 20 57 49 4e 44 4f  PREPARE_V2 WINDO
2f760 57 53 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  WS] {..         
2f770 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20   #..          # 
2f780 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20 74  NOTE: Check if t
2f790 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  he compile-time 
2f7a0 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  option is listed
2f7b0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0d   in the list of.
2f7c0 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20  .          #    
2f7d0 20 20 20 22 64 65 66 69 6e 65 20 63 6f 6e 73 74     "define const
2f7e0 61 6e 74 73 22 20 6b 65 70 74 20 74 72 61 63 6b  ants" kept track
2f7f0 20 6f 66 20 62 79 20 74 68 65 20 6d 61 6e 61 67   of by the manag
2f800 65 64 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20 20  ed assembly...  
2f810 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f820 20 20 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c       checkForSQL
2f830 69 74 65 44 65 66 69 6e 65 43 6f 6e 73 74 61 6e  iteDefineConstan
2f840 74 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  t $::test_channe
2f850 6c 20 24 64 65 66 69 6e 65 43 6f 6e 73 74 61 6e  l $defineConstan
2f860 74 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  t..        }....
2f870 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
2f880 20 20 20 23 20 4e 4f 54 45 3a 20 41 74 74 65 6d     # NOTE: Attem
2f890 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
2f8a0 69 66 20 76 61 72 69 6f 75 73 20 63 6f 6d 70 69  if various compi
2f8b0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20  le-time options 
2f8c0 6e 65 65 64 65 64 20 66 6f 72 0d 0a 20 20 20 20  needed for..    
2f8d0 20 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74      #       test
2f8e0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 65 72   constraints wer
2f8f0 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 68  e enabled for th
2f900 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d 62  e interop assemb
2f910 6c 79 20 61 6e 64 2f 6f 72 0d 0a 20 20 20 20 20  ly and/or..     
2f920 20 20 20 23 20 20 20 20 20 20 20 66 6f 72 20 74     #       for t
2f930 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 20 6c  he SQLite core l
2f940 69 62 72 61 72 79 2e 0d 0a 20 20 20 20 20 20 20  ibrary...       
2f950 20 23 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65   #..        fore
2f960 61 63 68 20 63 6f 6d 70 69 6c 65 4f 70 74 69 6f  ach compileOptio
2f970 6e 20 5b 6c 69 73 74 20 5c 0d 0a 20 20 20 20 20  n [list \..     
2f980 20 20 20 20 20 20 20 43 4f 44 45 43 20 45 58 54         CODEC EXT
2f990 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
2f9a0 20 48 41 53 5f 43 4f 44 45 43 20 49 4e 43 4c 55   HAS_CODEC INCLU
2f9b0 44 45 5f 43 45 52 4f 44 20 49 4e 43 4c 55 44 45  DE_CEROD INCLUDE
2f9c0 5f 45 58 54 52 41 20 5c 0d 0a 20 20 20 20 20 20  _EXTRA \..      
2f9d0 20 20 20 20 20 20 49 4e 43 4c 55 44 45 5f 53 45        INCLUDE_SE
2f9e0 45 20 49 4e 43 4c 55 44 45 5f 5a 49 50 56 46 53  E INCLUDE_ZIPVFS
2f9f0 20 4a 53 4f 4e 31 5f 45 58 54 45 4e 53 49 4f 4e   JSON1_EXTENSION
2fa00 20 4c 45 47 41 43 59 5f 43 4c 4f 53 45 20 4c 4f   LEGACY_CLOSE LO
2fa10 47 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  G \..           
2fa20 20 50 45 52 43 45 4e 54 49 4c 45 5f 45 58 54 45   PERCENTILE_EXTE
2fa30 4e 53 49 4f 4e 20 52 45 47 45 58 50 5f 45 58 54  NSION REGEXP_EXT
2fa40 45 4e 53 49 4f 4e 20 53 45 53 53 49 4f 4e 5f 45  ENSION SESSION_E
2fa50 58 54 45 4e 53 49 4f 4e 20 5c 0d 0a 20 20 20 20  XTENSION \..    
2fa60 20 20 20 20 20 20 20 20 53 48 41 31 5f 45 58 54          SHA1_EXT
2fa70 45 4e 53 49 4f 4e 20 54 45 53 54 5f 45 58 54 45  ENSION TEST_EXTE
2fa80 4e 53 49 4f 4e 20 54 4f 54 59 50 45 5f 45 58 54  NSION TOTYPE_EXT
2fa90 45 4e 53 49 4f 4e 20 56 49 52 54 55 41 4c 5f 54  ENSION VIRTUAL_T
2faa0 41 42 4c 45 5d 20 7b 0d 0a 20 20 20 20 20 20 20  ABLE] {..       
2fab0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
2fac0 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66  # NOTE: Check if
2fad0 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   the compile-tim
2fae0 65 20 6f 70 74 69 6f 6e 20 69 73 20 6c 69 73 74  e option is list
2faf0 65 64 20 69 6e 20 74 68 65 20 6c 69 73 74 0d 0a  ed in the list..
2fb00 20 20 20 20 20 20 20 20 20 20 23 20 20 20 20 20            #     
2fb10 20 20 6b 65 70 74 20 74 72 61 63 6b 20 6f 66 20    kept track of 
2fb20 62 79 20 74 68 65 20 69 6e 74 65 72 6f 70 20 61  by the interop a
2fb30 73 73 65 6d 62 6c 79 20 61 6e 64 2f 6f 72 20 74  ssembly and/or t
2fb40 68 65 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  he SQLite..     
2fb50 20 20 20 20 20 23 20 20 20 20 20 20 20 63 6f 72       #       cor
2fb60 65 20 6c 69 62 72 61 72 79 2e 0d 0a 20 20 20 20  e library...    
2fb70 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
2fb80 20 20 20 63 68 65 63 6b 46 6f 72 53 51 4c 69 74     checkForSQLit
2fb90 65 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 24  eCompileOption $
2fba0 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24  ::test_channel $
2fbb0 63 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 0d 0a 20  compileOption.. 
2fbc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2fbd0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2fbe0 20 4e 4f 54 45 3a 20 43 68 65 63 6b 20 69 66 20   NOTE: Check if 
2fbf0 74 68 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  the System.Data.
2fc00 53 51 4c 69 74 65 20 70 72 6f 76 69 64 65 72 20  SQLite provider 
2fc10 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
2fc20 68 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  h..        #    
2fc30 20 20 20 73 75 70 70 6f 72 74 20 66 6f 72 20 61     support for a
2fc40 6e 79 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  ny encrypted dat
2fc50 61 62 61 73 65 73 2e 0d 0a 20 20 20 20 20 20 20  abases...       
2fc60 20 23 0d 0a 20 20 20 20 20 20 20 20 69 66 20 7b   #..        if {
2fc70 5b 68 61 76 65 53 51 4c 69 74 65 44 65 66 69 6e  [haveSQLiteDefin
2fc80 65 43 6f 6e 73 74 61 6e 74 20 49 4e 54 45 52 4f  eConstant INTERO
2fc90 50 5f 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d 0a 20  P_CODEC] || \.. 
2fca0 20 20 20 20 20 20 20 20 20 20 20 5b 68 61 76 65             [have
2fcb0 53 51 4c 69 74 65 44 65 66 69 6e 65 43 6f 6e 73  SQLiteDefineCons
2fcc0 74 61 6e 74 20 49 4e 54 45 52 4f 50 5f 49 4e 43  tant INTEROP_INC
2fcd0 4c 55 44 45 5f 53 45 45 5d 7d 20 74 68 65 6e 20  LUDE_SEE]} then 
2fce0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 23 0d 0a  {..          #..
2fcf0 20 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45            # NOTE
2fd00 3a 20 4e 6f 77 20 63 68 65 63 6b 20 69 66 20 74  : Now check if t
2fd10 68 65 20 69 6e 74 65 72 6f 70 20 61 73 73 65 6d  he interop assem
2fd20 62 6c 79 20 77 61 73 20 61 6c 73 6f 20 63 6f 6d  bly was also com
2fd30 70 69 6c 65 64 20 77 69 74 68 0d 0a 20 20 20 20  piled with..    
2fd40 20 20 20 20 20 20 23 20 20 20 20 20 20 20 73 75        #       su
2fd50 70 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70  pport for encryp
2fd60 74 65 64 20 64 61 74 61 62 61 73 65 73 2e 0d 0a  ted databases...
2fd70 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2fd80 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 76 65         if {[have
2fd90 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65 4f 70 74  SQLiteCompileOpt
2fda0 69 6f 6e 20 43 4f 44 45 43 5d 20 7c 7c 20 5c 0d  ion CODEC] || \.
2fdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b  .              [
2fdc0 68 61 76 65 53 51 4c 69 74 65 43 6f 6d 70 69 6c  haveSQLiteCompil
2fdd0 65 4f 70 74 69 6f 6e 20 49 4e 43 4c 55 44 45 5f  eOption INCLUDE_
2fde0 53 45 45 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20  SEE]} then {..  
2fdf0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
2fe00 20 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a           # NOTE:
2fe10 20 46 69 6e 61 6c 6c 79 2c 20 63 68 65 63 6b 20   Finally, check 
2fe20 69 66 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f  if the SQLite co
2fe30 72 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  re library was c
2fe40 6f 6d 70 69 6c 65 64 0d 0a 20 20 20 20 20 20 20  ompiled..       
2fe50 20 20 20 20 20 23 20 20 20 20 20 20 20 77 69 74       #       wit
2fe60 68 20 73 75 70 70 6f 72 74 20 66 6f 72 20 65 6e  h support for en
2fe70 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
2fe80 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
2fe90 23 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  #..            i
2fea0 66 20 7b 5b 68 61 76 65 53 51 4c 69 74 65 43 6f  f {[haveSQLiteCo
2feb0 6d 70 69 6c 65 4f 70 74 69 6f 6e 20 48 41 53 5f  mpileOption HAS_
2fec0 43 4f 44 45 43 5d 7d 20 74 68 65 6e 20 7b 0d 0a  CODEC]} then {..
2fed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 0d                #.
2fee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  .              #
2fef0 20 4e 4f 54 45 3a 20 59 65 73 2c 20 61 64 64 20   NOTE: Yes, add 
2ff00 63 6f 6e 73 74 72 61 69 6e 74 20 66 6f 72 20 75  constraint for u
2ff10 73 65 20 62 79 20 74 68 65 20 74 65 73 74 20 73  se by the test s
2ff20 75 69 74 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  uite...         
2ff30 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
2ff40 20 20 20 20 20 20 61 64 64 43 6f 6e 73 74 72 61        addConstra
2ff50 69 6e 74 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  int System.Data.
2ff60 53 51 4c 69 74 65 2e 45 6e 63 72 79 70 74 69 6f  SQLite.Encryptio
2ff70 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n..            }
2ff80 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
2ff90 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2ffa0 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
2ffb0 20 4e 4f 54 45 3a 20 54 72 79 20 74 6f 20 73 65   NOTE: Try to se
2ffc0 74 75 70 20 61 6e 20 69 6e 74 65 72 72 75 70 74  tup an interrupt
2ffd0 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20   callback using 
2ffe0 74 68 65 20 73 63 72 69 70 74 20 64 65 62 75 67  the script debug
2fff0 67 65 72 0d 0a 20 20 20 20 20 20 20 20 23 20 20  ger..        #  
30000 20 20 20 20 20 74 68 61 74 20 77 69 6c 6c 20 63       that will c
30010 61 6e 63 65 6c 20 61 6c 6c 20 53 51 4c 20 71 75  ancel all SQL qu
30020 65 72 69 65 73 20 69 6e 20 70 72 6f 67 72 65 73  eries in progres
30030 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  s for all databa
30040 73 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  se..        #   
30050 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
30060 6b 6e 6f 77 6e 20 74 6f 20 74 68 69 73 20 69 6e  known to this in
30070 74 65 72 70 72 65 74 65 72 2e 0d 0a 20 20 20 20  terpreter...    
30080 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
30090 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
300a0 20 3a 3a 6e 6f 28 73 71 6c 69 74 65 49 6e 74 65   ::no(sqliteInte
300b0 72 72 75 70 74 43 61 6c 6c 62 61 63 6b 29 5d 7d  rruptCallback)]}
300c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
300d0 20 20 20 73 65 74 75 70 44 62 49 6e 74 65 72 72     setupDbInterr
300e0 75 70 74 43 61 6c 6c 62 61 63 6b 20 24 3a 3a 74  uptCallback $::t
300f0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 3a 3a 74  est_channel $::t
30100 65 73 74 5f 6c 6f 67 0d 0a 20 20 20 20 20 20 20  est_log..       
30110 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d   }....        #.
30120 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a  .        # NOTE:
30130 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65 20 6e   Check for the n
30140 61 74 69 76 65 20 72 75 6e 74 69 6d 65 20 6f 70  ative runtime op
30150 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 6f 75 6c  tion, which woul
30160 64 20 6d 65 61 6e 20 77 65 20 61 72 65 0d 0a 20  d mean we are.. 
30170 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20 75         #       u
30180 73 69 6e 67 20 74 68 65 20 6d 69 78 65 64 2d 6d  sing the mixed-m
30190 6f 64 65 20 61 73 73 65 6d 62 6c 79 2e 0d 0a 20  ode assembly... 
301a0 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
301b0 20 20 63 68 65 63 6b 46 6f 72 52 75 6e 74 69 6d    checkForRuntim
301c0 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65 73 74 5f  eOption $::test_
301d0 63 68 61 6e 6e 65 6c 20 6e 61 74 69 76 65 0d 0a  channel native..
301e0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
301f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65       # NOTE: Che
30200 63 6b 20 69 66 20 74 68 65 20 74 65 73 74 20 73  ck if the test s
30210 75 69 74 65 20 73 68 6f 75 6c 64 20 63 6f 75 6e  uite should coun
30220 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30230 63 6f 6e 6e 65 63 74 69 6f 6e 73 0d 0a 20 20 20  connections..   
30240 20 20 20 20 20 23 20 20 20 20 20 20 20 22 6f 70       #       "op
30250 65 6e 65 64 22 20 61 6e 64 20 22 63 6c 6f 73 65  ened" and "close
30260 64 22 20 66 72 6f 6d 20 74 68 65 20 70 6f 6f 6c  d" from the pool
30270 20 77 68 65 6e 20 64 65 74 65 72 6d 69 6e 69 6e   when determinin
30280 67 20 69 66 20 61 20 74 65 73 74 0d 0a 20 20 20  g if a test..   
30290 20 20 20 20 20 23 20 20 20 20 20 20 20 70 61 73       #       pas
302a0 73 65 64 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  sed.  Disabling 
302b0 74 68 69 73 20 62 65 68 61 76 69 6f 72 20 69 73  this behavior is
302c0 20 73 6f 6d 65 74 69 6d 65 73 20 6e 65 63 65 73   sometimes neces
302d0 73 61 72 79 20 28 65 2e 67 2e 0d 0a 20 20 20 20  sary (e.g...    
302e0 20 20 20 20 23 20 20 20 20 20 20 20 64 75 72 69      #       duri
302f0 6e 67 20 74 68 65 20 72 65 6c 65 61 73 65 20 74  ng the release t
30300 65 73 74 69 6e 67 20 70 72 6f 63 65 73 73 29 20  esting process) 
30310 62 65 63 61 75 73 65 20 74 68 65 72 65 20 61 72  because there ar
30320 65 20 73 65 76 65 72 61 6c 0d 0a 20 20 20 20 20  e several..     
30330 20 20 20 23 20 20 20 20 20 20 20 74 65 73 74 73     #       tests
30340 20 74 68 61 74 20 72 65 6c 79 20 6f 6e 20 74 68   that rely on th
30350 65 20 22 6f 70 65 6e 65 64 20 66 72 6f 6d 20 70  e "opened from p
30360 6f 6f 6c 22 20 63 6f 75 6e 74 20 62 65 69 6e 67  ool" count being
30370 20 67 72 65 61 74 65 72 0d 0a 20 20 20 20 20 20   greater..      
30380 20 20 23 20 20 20 20 20 20 20 74 68 61 6e 20 7a    #       than z
30390 65 72 6f 2e 20 20 54 68 65 73 65 20 74 65 73 74  ero.  These test
303a0 73 20 6d 61 79 20 66 61 69 6c 20 64 75 65 20 74  s may fail due t
303b0 6f 20 74 68 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  o the non-determ
303c0 69 6e 69 73 74 69 63 0d 0a 20 20 20 20 20 20 20  inistic..       
303d0 20 23 20 20 20 20 20 20 20 62 65 68 61 76 69 6f   #       behavio
303e0 72 20 6f 66 20 74 68 65 20 43 4c 52 20 47 43 2c  r of the CLR GC,
303f0 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 72 65   even when there
30400 20 69 73 20 6e 6f 20 62 75 67 20 69 6e 20 74 68   is no bug in th
30410 65 20 63 6f 64 65 0d 0a 20 20 20 20 20 20 20 20  e code..        
30420 23 20 20 20 20 20 20 20 62 65 69 6e 67 20 74 65  #       being te
30430 73 74 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 23  sted...        #
30440 0d 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 46  ..        checkF
30450 6f 72 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20  orRuntimeOption 
30460 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
30470 6e 6f 50 6f 6f 6c 43 6f 75 6e 74 73 0d 0a 0d 0a  noPoolCounts....
30480 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
30490 20 20 20 23 20 4e 4f 54 45 3a 20 43 68 65 63 6b     # NOTE: Check
304a0 20 69 66 20 74 68 65 20 74 65 73 74 20 73 75 69   if the test sui
304b0 74 65 20 73 68 6f 75 6c 64 20 75 73 65 20 73 68  te should use sh
304c0 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
304d0 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20  ..        #..   
304e0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 52 75 6e       checkForRun
304f0 74 69 6d 65 4f 70 74 69 6f 6e 20 24 3a 3a 74 65  timeOption $::te
30500 73 74 5f 63 68 61 6e 6e 65 6c 20 73 68 61 72 65  st_channel share
30510 64 43 61 63 68 65 0d 0a 0d 0a 20 20 20 20 20 20  dCache....      
30520 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e    #..        # N
30530 4f 54 45 3a 20 52 65 70 6f 72 74 20 74 68 65 20  OTE: Report the 
30540 72 65 73 6f 75 72 63 65 20 75 73 61 67 65 20 70  resource usage p
30550 72 69 6f 72 20 74 6f 20 72 75 6e 6e 69 6e 67 20  rior to running 
30560 61 6e 79 20 74 65 73 74 73 2e 0d 0a 20 20 20 20  any tests...    
30570 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 72      #..        r
30580 65 70 6f 72 74 53 51 4c 69 74 65 52 65 73 6f 75  eportSQLiteResou
30590 72 63 65 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  rces $::test_cha
305a0 6e 6e 65 6c 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nnel....        
305b0 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
305c0 45 3a 20 47 72 61 62 20 74 68 65 20 6c 69 73 74  E: Grab the list
305d0 20 6f 66 20 6e 61 74 69 76 65 20 6d 6f 64 75 6c   of native modul
305e0 65 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  es for the curre
305f0 6e 74 20 70 72 6f 63 65 73 73 20 61 6e 64 0d 0a  nt process and..
30600 20 20 20 20 20 20 20 20 23 20 20 20 20 20 20 20          #       
30610 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 53 79  report on the Sy
30620 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
30630 20 72 65 6c 61 74 65 64 20 6f 6e 65 73 2e 0d 0a   related ones...
30640 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
30650 20 20 20 69 66 20 7b 5b 68 61 76 65 53 51 4c 69     if {[haveSQLi
30660 74 65 4f 62 6a 65 63 74 43 6f 6d 6d 61 6e 64 5d  teObjectCommand]
30670 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
30680 20 20 20 20 73 65 74 20 6d 6f 64 75 6c 65 73 20      set modules 
30690 5b 6f 62 6a 65 63 74 20 69 6e 76 6f 6b 65 20 5c  [object invoke \
306a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
306b0 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69  System.Diagnosti
306c0 63 73 2e 50 72 6f 63 65 73 73 2e 47 65 74 43 75  cs.Process.GetCu
306d0 72 72 65 6e 74 50 72 6f 63 65 73 73 20 4d 6f 64  rrentProcess Mod
306e0 75 6c 65 73 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  ules]....       
306f0 20 20 20 6f 62 6a 65 63 74 20 66 6f 72 65 61 63     object foreac
30700 68 20 2d 61 6c 69 61 73 20 6d 6f 64 75 6c 65 20  h -alias module 
30710 24 6d 6f 64 75 6c 65 73 20 7b 0d 0a 20 20 20 20  $modules {..    
30720 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
30730 20 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 54         # NOTE: T
30740 68 65 20 6d 6f 64 75 6c 65 20 66 69 6c 65 20 6e  he module file n
30750 61 6d 65 20 68 65 72 65 20 6d 75 73 74 20 62 65  ame here must be
30760 20 6e 6f 72 6d 61 6c 69 7a 65 64 2e 0d 0a 20 20   normalized...  
30770 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
30780 20 20 20 20 20 20 20 20 20 73 65 74 20 66 69 6c           set fil
30790 65 4e 61 6d 65 20 5b 66 69 6c 65 20 6e 6f 72 6d  eName [file norm
307a0 61 6c 69 7a 65 20 5b 24 6d 6f 64 75 6c 65 20 46  alize [$module F
307b0 69 6c 65 4e 61 6d 65 5d 5d 0d 0a 20 20 20 20 20  ileName]]..     
307c0 20 20 20 20 20 20 20 73 65 74 20 66 69 6c 65 4e         set fileN
307d0 61 6d 65 4f 6e 6c 79 20 5b 66 69 6c 65 20 74 61  ameOnly [file ta
307e0 69 6c 20 24 66 69 6c 65 4e 61 6d 65 5d 0d 0a 0d  il $fileName]...
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
30800 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74  {[lsearch -exact
30810 20 2d 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20   -nocase -- \.. 
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
30830 67 65 74 4e 61 74 69 76 65 4c 69 62 72 61 72 79  getNativeLibrary
30840 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
30850 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
30860 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
30870 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
30880 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
30890 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308b0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
308c0 61 64 65 64 20 53 51 4c 69 74 65 20 6e 61 74 69  aded SQLite nati
308d0 76 65 20 6c 69 62 72 61 72 79 20 6d 6f 64 75 6c  ve library modul
308e0 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20  e: " \..        
308f0 20 20 20 20 20 20 20 20 20 20 24 66 69 6c 65 4e            $fileN
30900 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20  ame \n]..       
30910 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b       } elseif {[
30920 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 2d  lsearch -exact -
30930 6e 6f 63 61 73 65 20 2d 2d 20 5c 0d 0a 20 20 20  nocase -- \..   
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
30950 74 49 6e 74 65 72 6f 70 41 73 73 65 6d 62 6c 79  tInteropAssembly
30960 46 69 6c 65 4e 61 6d 65 73 4f 6e 6c 79 5d 20 24  FileNamesOnly] $
30970 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 5d 20 21 3d  fileNameOnly] !=
30980 20 2d 31 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20   -1} then {..   
30990 20 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73             tputs
309a0 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
309b0 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a   [appendArgs \..
309c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309d0 20 20 22 2d 2d 2d 2d 20 66 6f 75 6e 64 20 6c 6f    "---- found lo
309e0 61 64 65 64 20 53 51 4c 69 74 65 20 69 6e 74 65  aded SQLite inte
309f0 72 6f 70 20 61 73 73 65 6d 62 6c 79 20 6d 6f 64  rop assembly mod
30a00 75 6c 65 3a 20 22 20 5c 0d 0a 20 20 20 20 20 20  ule: " \..      
30a10 20 20 20 20 20 20 20 20 20 20 20 20 24 66 69 6c              $fil
30a20 65 4e 61 6d 65 20 5c 6e 5d 0d 0a 20 20 20 20 20  eName \n]..     
30a30 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
30a40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
30a50 0d 0a 0d 0a 20 20 20 20 20 20 20 20 63 61 74 63  ....        catc
30a60 68 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 74  h {..          t
30a70 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
30a80 6e 6e 65 6c 20 5c 0d 0a 20 20 20 20 20 20 20 20  nnel \..        
30a90 20 20 20 20 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70        "---- comp
30aa0 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 73  ile-time options
30ab0 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 72 65   for SQLite core
30ac0 20 6c 69 62 72 61 72 79 2e 2e 2e 20 22 0d 0a 0d   library... "...
30ad0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
30ae0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
30af0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
30b00 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
30b10 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
30b20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
30b30 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
30b40 65 33 20 53 51 4c 69 74 65 43 6f 6d 70 69 6c 65  e3 SQLiteCompile
30b50 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20  Options..       
30b60 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74 69     } compileOpti
30b70 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e 20  ons] == 0} then 
30b80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  {..            t
30b90 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68 61  puts $::test_cha
30ba0 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67 73  nnel [appendArgs
30bb0 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c 73   [formatList [ls
30bc0 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ort \..         
30bd0 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65 4f         $compileO
30be0 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d 20  ptions] <none>] 
30bf0 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  \n]..          }
30c00 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20 20   else {..       
30c10 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74 65       tputs $::te
30c20 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e 6f  st_channel unkno
30c30 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20 20  wn\n..          
30c40 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
30c50 20 20 20 20 20 20 20 20 63 61 74 63 68 20 7b 0d          catch {.
30c60 0a 20 20 20 20 20 20 20 20 20 20 74 70 75 74 73  .          tputs
30c70 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c   $::test_channel
30c80 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
30c90 20 20 22 2d 2d 2d 2d 20 63 6f 6d 70 69 6c 65 2d    "---- compile-
30ca0 74 69 6d 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  time options for
30cb0 20 53 51 4c 69 74 65 20 69 6e 74 65 72 6f 70 20   SQLite interop 
30cc0 61 73 73 65 6d 62 6c 79 2e 2e 2e 20 22 0d 0a 0d  assembly... "...
30cd0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
30ce0 63 61 74 63 68 20 7b 0d 0a 20 20 20 20 20 20 20  catch {..       
30cf0 20 20 20 20 20 6f 62 6a 65 63 74 20 69 6e 76 6f       object invo
30d00 6b 65 20 2d 66 6c 61 67 73 20 2b 4e 6f 6e 50 75  ke -flags +NonPu
30d10 62 6c 69 63 20 5c 0d 0a 20 20 20 20 20 20 20 20  blic \..        
30d20 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44          System.D
30d30 61 74 61 2e 53 51 4c 69 74 65 2e 53 51 4c 69 74  ata.SQLite.SQLit
30d40 65 33 20 49 6e 74 65 72 6f 70 43 6f 6d 70 69 6c  e3 InteropCompil
30d50 65 4f 70 74 69 6f 6e 73 0d 0a 20 20 20 20 20 20  eOptions..      
30d60 20 20 20 20 7d 20 63 6f 6d 70 69 6c 65 4f 70 74      } compileOpt
30d70 69 6f 6e 73 5d 20 3d 3d 20 30 7d 20 74 68 65 6e  ions] == 0} then
30d80 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
30d90 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f 63 68  tputs $::test_ch
30da0 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41 72 67  annel [appendArg
30db0 73 20 5b 66 6f 72 6d 61 74 4c 69 73 74 20 5b 6c  s [formatList [l
30dc0 73 6f 72 74 20 5c 0d 0a 20 20 20 20 20 20 20 20  sort \..        
30dd0 20 20 20 20 20 20 20 20 24 63 6f 6d 70 69 6c 65          $compile
30de0 4f 70 74 69 6f 6e 73 5d 20 3c 6e 6f 6e 65 3e 5d  Options] <none>]
30df0 20 5c 6e 5d 0d 0a 20 20 20 20 20 20 20 20 20 20   \n]..          
30e00 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20 20 20  } else {..      
30e10 20 20 20 20 20 20 74 70 75 74 73 20 24 3a 3a 74        tputs $::t
30e20 65 73 74 5f 63 68 61 6e 6e 65 6c 20 75 6e 6b 6e  est_channel unkn
30e30 6f 77 6e 5c 6e 0d 0a 20 20 20 20 20 20 20 20 20  own\n..         
30e40 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
30e50 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20  .        #..    
30e60 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77      # NOTE: Show
30e70 20 74 68 65 20 61 63 74 69 76 65 20 74 65 73 74   the active test
30e80 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0d 0a 20   constraints... 
30e90 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
30ea0 20 20 74 70 75 74 73 20 24 3a 3a 74 65 73 74 5f    tputs $::test_
30eb0 63 68 61 6e 6e 65 6c 20 5b 61 70 70 65 6e 64 41  channel [appendA
30ec0 72 67 73 20 22 2d 2d 2d 2d 20 63 6f 6e 73 74 72  rgs "---- constr
30ed0 61 69 6e 74 73 3a 20 22 20 5c 0d 0a 20 20 20 20  aints: " \..    
30ee0 20 20 20 20 20 20 20 20 5b 66 6f 72 6d 61 74 4c          [formatL
30ef0 69 73 74 20 5b 6c 73 6f 72 74 20 5b 67 65 74 43  ist [lsort [getC
30f00 6f 6e 73 74 72 61 69 6e 74 73 5d 5d 20 3c 6e 6f  onstraints]] <no
30f10 6e 65 3e 5d 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20  ne>] \n]....    
30f20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23      #..        #
30f30 20 4e 4f 54 45 3a 20 53 61 76 65 20 74 68 65 20   NOTE: Save the 
30f40 74 65 73 74 20 63 6f 6e 73 74 72 61 69 6e 74 73  test constraints
30f50 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 72 65   for use by thre
30f60 61 64 73 20 63 72 65 61 74 65 64 20 69 6e 20 74  ads created in t
30f70 68 69 73 0d 0a 20 20 20 20 20 20 20 20 23 20 20  his..        #  
30f80 20 20 20 20 20 61 70 70 6c 69 63 61 74 69 6f 6e       application
30f90 20 64 6f 6d 61 69 6e 2e 20 20 54 68 69 73 20 69   domain.  This i
30fa0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
30fb0 75 73 65 20 61 6c 6c 20 74 68 65 20 45 61 67 6c  use all the Eagl
30fc0 65 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20  e..        #    
30fd0 20 20 20 22 74 65 73 74 20 63 6f 6e 74 65 78 74     "test context
30fe0 22 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  " information is
30ff0 20 70 65 72 2d 74 68 72 65 61 64 2e 0d 0a 20 20   per-thread...  
31000 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31010 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
31020 74 73 20 3a 3a 74 65 73 74 5f 63 6f 6e 73 74 72  ts ::test_constr
31030 61 69 6e 74 73 5d 7d 20 74 68 65 6e 20 7b 0d 0a  aints]} then {..
31040 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
31050 74 65 73 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  test_constraints
31060 20 24 3a 3a 65 61 67 6c 65 5f 74 65 73 74 73 28   $::eagle_tests(
31070 43 6f 6e 73 74 72 61 69 6e 74 73 29 0d 0a 20 20  Constraints)..  
31080 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
31090 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
310a0 4e 4f 54 45 3a 20 4c 6f 61 64 20 74 68 65 20 22  NOTE: Load the "
310b0 61 66 74 65 72 2d 63 6f 6e 73 74 72 61 69 6e 74  after-constraint
310c0 73 22 20 63 75 73 74 6f 6d 20 70 65 72 2d 75 73  s" custom per-us
310d0 65 72 20 61 6e 64 2f 6f 72 20 70 65 72 2d 68 6f  er and/or per-ho
310e0 73 74 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20  st..        #   
310f0 20 20 20 20 74 65 73 74 20 73 65 74 74 69 6e 67      test setting
31100 73 20 6e 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20  s now...        
31110 23 0d 0a 20 20 20 20 20 20 20 20 75 70 6c 65 76  #..        uplev
31120 65 6c 20 31 20 5b 6c 69 73 74 20 6c 6f 61 64 53  el 1 [list loadS
31130 51 4c 69 74 65 54 65 73 74 53 65 74 74 69 6e 67  QLiteTestSetting
31140 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
31150 6c 20 2e 61 66 74 65 72 5d 0d 0a 0d 0a 20 20 20  l .after]....   
31160 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20       #..        
31170 23 20 4e 4f 54 45 3a 20 49 66 20 6e 65 63 65 73  # NOTE: If neces
31180 73 61 72 79 2c 20 65 6e 61 62 6c 65 20 73 68 61  sary, enable sha
31190 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 6e  red-cache mode n
311a0 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  ow...        #..
311b0 20 20 20 20 20 20 20 20 69 66 20 7b 5b 68 61 73          if {[has
311c0 52 75 6e 74 69 6d 65 4f 70 74 69 6f 6e 20 73 68  RuntimeOption sh
311d0 61 72 65 64 43 61 63 68 65 5d 7d 20 74 68 65 6e  aredCache]} then
311e0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6e   {..          en
311f0 61 62 6c 65 53 68 61 72 65 64 43 61 63 68 65 20  ableSharedCache 
31200 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  $::test_channel 
31210 74 72 75 65 0d 0a 20 20 20 20 20 20 20 20 7d 0d  true..        }.
31220 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
31230 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 68        # NOTE: Sh
31240 6f 77 20 77 68 65 6e 20 6f 75 72 20 74 65 73 74  ow when our test
31250 73 20 61 63 74 75 61 6c 6c 79 20 62 65 67 61 6e  s actually began
31260 20 28 6e 6f 77 29 2e 0d 0a 20 20 20 20 20 20 20   (now)...       
31270 20 23 0d 0a 20 20 20 20 20 20 20 20 74 70 75 74   #..        tput
31280 73 20 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65  s $::test_channe
31290 6c 20 5b 61 70 70 65 6e 64 41 72 67 73 20 5c 0d  l [appendArgs \.
312a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d  .            "--
312b0 2d 2d 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53  -- System.Data.S
312c0 51 4c 69 74 65 20 74 65 73 74 73 20 62 65 67 61  QLite tests bega
312d0 6e 20 61 74 20 22 20 5c 0d 0a 20 20 20 20 20 20  n at " \..      
312e0 20 20 20 20 20 20 5b 63 6c 6f 63 6b 20 66 6f 72        [clock for
312f0 6d 61 74 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  mat [clock secon
31300 64 73 5d 5d 20 5c 6e 5d 0d 0a 20 20 20 20 20 20  ds]] \n]..      
31310 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
31320 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
31330 65 73 74 46 69 6c 65 73 50 72 6f 6c 6f 67 75 65  estFilesPrologue
31340 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
31350 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
31360 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
31370 75 73 74 6f 6d 20 66 69 6c 65 73 20 70 72 6f 6c  ustom files prol
31380 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
31390 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
313a0 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
313b0 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
313c0 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
313d0 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 70 72 6f   exists ::no(pro
313e0 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
313f0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
31400 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20  plevel 1 {..    
31410 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20        #..       
31420 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74 75 70     # NOTE: Setup
31430 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 74   the variables t
31440 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65  hat refer to the
31450 20 76 61 72 69 6f 75 73 20 6e 6f 6e 2d 64 61 74   various non-dat
31460 61 20 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20  a files..       
31470 20 20 20 23 20 20 20 20 20 20 20 72 65 71 75 69     #       requi
31480 72 65 64 20 62 79 20 74 68 65 20 74 65 73 74 73  red by the tests
31490 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a   in this file...
314a0 20 20 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20            #..   
314b0 20 20 20 20 20 20 20 73 65 74 20 65 6e 74 69 74         set entit
314c0 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
314d0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
314e0 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
314f0 4e 61 6d 65 20 45 6e 74 69 74 79 46 72 61 6d 65  Name EntityFrame
31500 77 6f 72 6b 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a  work.dll true]..
31510 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20  ..          set 
31520 69 6e 73 74 61 6c 6c 65 72 45 78 65 46 69 6c 65  installerExeFile
31530 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31540 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e    [getBuildFileN
31550 61 6d 65 20 49 6e 73 74 61 6c 6c 65 72 2e 65 78  ame Installer.ex
31560 65 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20  e true]....     
31570 20 20 20 20 20 73 65 74 20 73 71 6c 69 74 65 44       set sqliteD
31580 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c 65 20 5c  esignerDllFile \
31590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
315a0 5b 67 65 74 42 75 69 6c 64 46 69 6c 65 4e 61 6d  [getBuildFileNam
315b0 65 20 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65  e SQLite.Designe
315c0 72 2e 64 6c 6c 20 74 72 75 65 5d 0d 0a 0d 0a 20  r.dll true].... 
315d0 20 20 20 20 20 20 20 20 20 73 65 74 20 73 79 73           set sys
315e0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 44 6c 6c  temDataSQLiteDll
315f0 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
31600 20 20 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46        [getBuildF
31610 69 6c 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44  ileName System.D
31620 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 20 74  ata.SQLite.dll t
31630 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue]....        
31640 20 20 73 65 74 20 73 79 73 74 65 6d 44 61 74 61    set systemData
31650 53 51 4c 69 74 65 4c 69 6e 71 44 6c 6c 46 69 6c  SQLiteLinqDllFil
31660 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
31670 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c 65     [getBuildFile
31680 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74 61  Name System.Data
31690 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 2e 64 6c 6c  .SQLite.Linq.dll
316a0 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
316b0 20 20 20 20 73 65 74 20 73 79 73 74 65 6d 44 61      set systemDa
316c0 74 61 53 51 4c 69 74 65 45 66 36 44 6c 6c 46 69  taSQLiteEf6DllFi
316d0 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  le \..          
316e0 20 20 20 20 5b 67 65 74 42 75 69 6c 64 46 69 6c      [getBuildFil
316f0 65 4e 61 6d 65 20 53 79 73 74 65 6d 2e 44 61 74  eName System.Dat
31700 61 2e 53 51 4c 69 74 65 2e 45 46 36 2e 64 6c 6c  a.SQLite.EF6.dll
31710 20 74 72 75 65 5d 0d 0a 0d 0a 20 20 20 20 20 20   true]....      
31720 20 20 20 20 73 65 74 20 74 65 73 74 45 78 65 46      set testExeF
31730 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
31740 65 4e 61 6d 65 20 74 65 73 74 2e 65 78 65 20 74  eName test.exe t
31750 72 75 65 5d 0d 0a 20 20 20 20 20 20 20 20 20 20  rue]..          
31760 73 65 74 20 74 65 73 74 4c 69 6e 71 45 78 65 46  set testLinqExeF
31770 69 6c 65 20 5b 67 65 74 42 75 69 6c 64 46 69 6c  ile [getBuildFil
31780 65 4e 61 6d 65 20 74 65 73 74 6c 69 6e 71 2e 65  eName testlinq.e
31790 78 65 20 74 72 75 65 5d 0d 0a 20 20 20 20 20 20  xe true]..      
317a0 20 20 20 20 73 65 74 20 74 65 73 74 45 66 36 45      set testEf6E
317b0 78 65 46 69 6c 65 20 5b 67 65 74 42 75 69 6c 64  xeFile [getBuild
317c0 46 69 6c 65 4e 61 6d 65 20 74 65 73 74 65 66 36  FileName testef6
317d0 2e 65 78 65 20 74 72 75 65 5d 0d 0a 0d 0a 20 20  .exe true]....  
317e0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
317f0 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 65 74       # NOTE: Set
31800 75 70 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  up the variables
31810 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
31820 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 61 20  he various data 
31830 66 69 6c 65 73 0d 0a 20 20 20 20 20 20 20 20 20  files..         
31840 20 23 20 20 20 20 20 20 20 72 65 71 75 69 72 65   #       require
31850 64 20 62 79 20 74 68 65 20 74 65 73 74 73 20 69  d by the tests i
31860 6e 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a 20 20  n this file...  
31870 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
31880 20 20 20 20 20 73 65 74 20 74 65 73 74 4c 69 6e       set testLin
31890 71 4f 75 74 46 69 6c 65 20 5b 66 69 6c 65 20 6e  qOutFile [file n
318a0 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
318b0 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
318c0 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
318d0 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 74 65  TestDataPath] te
318e0 73 74 6c 69 6e 71 2e 6f 75 74 5d 5d 0d 0a 0d 0a  stlinq.out]]....
318f0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e 6f            set no
31900 72 74 68 77 69 6e 64 45 66 44 62 46 69 6c 65 20  rthwindEfDbFile 
31910 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
31920 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69               [fi
31940 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65  le dirname [file
31950 20 64 69 72 6e 61 6d 65 20 5b 67 65 74 53 51 4c   dirname [getSQL
31960 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
31970 5d 5d 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  ]] \..          
31980 20 20 20 20 74 65 73 74 6c 69 6e 71 20 6e 6f 72      testlinq nor
31990 74 68 77 69 6e 64 45 46 2e 64 62 5d 5d 0d 0a 0d  thwindEF.db]]...
319a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 6e  .          set n
319b0 6f 6e 57 61 6c 44 62 46 69 6c 65 20 5b 66 69 6c  onWalDbFile [fil
319c0 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
319d0 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
319e0 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
319f0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
31a00 20 6e 6f 6e 57 61 6c 2e 64 62 5d 5d 0d 0a 0d 0a   nonWal.db]]....
31a10 20 20 20 20 20 20 20 20 20 20 73 65 74 20 77 61            set wa
31a20 6c 44 62 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  lDbFile [file na
31a30 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
31a40 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
31a50 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
31a60 65 73 74 44 61 74 61 50 61 74 68 5d 20 77 61 6c  estDataPath] wal
31a70 2e 64 62 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  .db]]....       
31a80 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 20 20     #..          
31a90 23 20 4e 4f 54 45 3a 20 54 68 65 20 76 61 72 69  # NOTE: The vari
31aa0 6f 75 73 20 69 6e 73 74 61 6c 6c 2f 75 6e 69 6e  ous install/unin
31ab0 73 74 61 6c 6c 20 6c 6f 67 20 66 69 6c 65 73 20  stall log files 
31ac0 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
31ad0 0d 0a 20 20 20 20 20 20 20 20 20 20 23 20 20 20  ..          #   
31ae0 20 20 20 20 64 65 73 69 67 6e 2d 74 69 6d 65 20      design-time 
31af0 63 6f 6d 70 6f 6e 65 6e 74 20 69 6e 73 74 61 6c  component instal
31b00 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ler...          
31b10 23 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65 74  #..          set
31b20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30   testInstallVs20
31b30 30 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20  05LogFile [file 
31b40 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
31b50 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20   join \..       
31b60 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74         [getSQLit
31b70 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 49  eTestDataPath] I
31b80 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31b90 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2005.log]]....  
31ba0 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
31bb0 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67  InstallVs2008Log
31bc0 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
31bd0 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
31be0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
31bf0 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
31c00 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61 6c  DataPath] Instal
31c10 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 30 38 2e  ler_Test_Vs2008.
31c20 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
31c30 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74 61     set testInsta
31c40 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65 20  llVs2010LogFile 
31c50 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65  [file nativename
31c60 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20   [file join \.. 
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67 65               [ge
31c80 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61 50  tSQLiteTestDataP
31c90 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f 54  ath] Installer_T
31ca0 65 73 74 5f 56 73 32 30 31 30 2e 6c 6f 67 5d 5d  est_Vs2010.log]]
31cb0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65  ....          se
31cc0 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  t testInstallVs2
31cd0 30 31 32 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65  012LogFile [file
31ce0 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c   nativename [fil
31cf0 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20  e join \..      
31d00 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69          [getSQLi
31d10 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d 20  teTestDataPath] 
31d20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  Installer_Test_V
31d30 73 32 30 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2012.log]].... 
31d40 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
31d50 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f  tInstallVs2013Lo
31d60 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
31d70 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
31d80 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
31d90 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
31da0 74 44 61 74 61 50 61 74 68 5d 20 49 6e 73 74 61  tDataPath] Insta
31db0 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 33  ller_Test_Vs2013
31dc0 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
31dd0 20 20 20 20 73 65 74 20 74 65 73 74 49 6e 73 74      set testInst
31de0 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
31df0 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
31e00 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c 0d 0a  e [file join \..
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 67                [g
31e20 65 74 53 51 4c 69 74 65 54 65 73 74 44 61 74 61  etSQLiteTestData
31e30 50 61 74 68 5d 20 49 6e 73 74 61 6c 6c 65 72 5f  Path] Installer_
31e40 54 65 73 74 5f 56 73 32 30 31 35 2e 6c 6f 67 5d  Test_Vs2015.log]
31e50 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73  ]....          s
31e60 65 74 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73  et testInstallVs
31e70 32 30 31 37 4c 6f 67 46 69 6c 65 20 5b 66 69 6c  2017LogFile [fil
31e80 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69  e nativename [fi
31e90 6c 65 20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20  le join \..     
31ea0 20 20 20 20 20 20 20 20 20 5b 67 65 74 53 51 4c           [getSQL
31eb0 69 74 65 54 65 73 74 44 61 74 61 50 61 74 68 5d  iteTestDataPath]
31ec0 20 49 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f   Installer_Test_
31ed0 56 73 32 30 31 37 2e 6c 6f 67 5d 5d 0d 0a 0d 0a  Vs2017.log]]....
31ee0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65            set te
31ef0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
31f00 35 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e  5LogFile [file n
31f10 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20  ativename [file 
31f20 6a 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20  join \..        
31f30 20 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65        [getSQLite
31f40 54 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e  TestDataPath] Un
31f50 69 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56  installer_Test_V
31f60 73 32 30 30 35 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20  s2005.log]].... 
31f70 20 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73           set tes
31f80 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30 38  tUninstallVs2008
31f90 4c 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61  LogFile [file na
31fa0 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a  tivename [file j
31fb0 6f 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  oin \..         
31fc0 20 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54       [getSQLiteT
31fd0 65 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69  estDataPath] Uni
31fe0 6e 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73  nstaller_Test_Vs
31ff0 32 30 30 38 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20  2008.log]]....  
32000 20 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74          set test
32010 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 30 4c  UninstallVs2010L
32020 6f 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74  ogFile [file nat
32030 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f  ivename [file jo
32040 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  in \..          
32050 20 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65      [getSQLiteTe
32060 73 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e  stDataPath] Unin
32070 73 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32  staller_Test_Vs2
32080 30 31 30 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20  010.log]]....   
32090 20 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55         set testU
320a0 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
320b0 67 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69  gFile [file nati
320c0 76 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69  vename [file joi
320d0 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n \..           
320e0 20 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73     [getSQLiteTes
320f0 74 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73  tDataPath] Unins
32100 74 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30  taller_Test_Vs20
32110 31 32 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20  12.log]]....    
32120 20 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e        set testUn
32130 69 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  installVs2013Log
32140 46 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76  File [file nativ
32150 65 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e  ename [file join
32160 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32170 20 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74    [getSQLiteTest
32180 44 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74  DataPath] Uninst
32190 61 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31  aller_Test_Vs201
321a0 33 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20  3.log]]....     
321b0 20 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69       set testUni
321c0 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46  nstallVs2015LogF
321d0 69 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65  ile [file native
321e0 6e 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20  name [file join 
321f0 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  \..             
32200 20 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44   [getSQLiteTestD
32210 61 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61  ataPath] Uninsta
32220 6c 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 35  ller_Test_Vs2015
32230 2e 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20  .log]]....      
32240 20 20 20 20 73 65 74 20 74 65 73 74 55 6e 69 6e      set testUnin
32250 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
32260 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
32270 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5c  ame [file join \
32280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32290 5b 67 65 74 53 51 4c 69 74 65 54 65 73 74 44 61  [getSQLiteTestDa
322a0 74 61 50 61 74 68 5d 20 55 6e 69 6e 73 74 61 6c  taPath] Uninstal
322b0 6c 65 72 5f 54 65 73 74 5f 56 73 32 30 31 37 2e  ler_Test_Vs2017.
322c0 6c 6f 67 5d 5d 0d 0a 0d 0a 20 20 20 20 20 20 20  log]]....       
322d0 20 20 20 23 23 23 23 23 23 23 23 23 23 23 23 23     #############
322e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
322f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32300 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
32310 23 23 23 23 23 23 23 23 0d 0a 0d 0a 20 20 20 20  ########....    
32320 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
32330 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 63 68 65   exists ::no(che
32340 63 6b 46 6f 72 53 71 6c 69 74 65 46 69 6c 65 73  ckForSqliteFiles
32350 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20  )]} then {..    
32360 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
32370 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
32380 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
32390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
323a0 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 65 6e    [file tail $en
323b0 74 69 74 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c  tityFrameworkDll
323c0 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d  File]]]} then {.
323d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
323e0 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73  heckForFile $tes
323f0 74 5f 63 68 61 6e 6e 65 6c 20 24 65 6e 74 69 74  t_channel $entit
32400 79 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c  yFrameworkDllFil
32410 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
32420 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
32430 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
32440 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
32450 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
32460 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
32470 74 61 69 6c 20 24 69 6e 73 74 61 6c 6c 65 72 45  tail $installerE
32480 78 65 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  xeFile]]]} then 
32490 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
324a0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
324b0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 69 6e 73  est_channel $ins
324c0 74 61 6c 6c 65 72 45 78 65 46 69 6c 65 20 49 6e  tallerExeFile In
324d0 73 74 61 6c 6c 65 72 2e 65 78 65 0d 0a 20 20 20  staller.exe..   
324e0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
324f0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
32500 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
32510 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
32520 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32530 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
32540 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72 44 6c  sqliteDesignerDl
32550 6c 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b  lFile]]]} then {
32560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32570 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65  checkForFile $te
32580 73 74 5f 63 68 61 6e 6e 65 6c 20 24 73 71 6c 69  st_channel $sqli
32590 74 65 44 65 73 69 67 6e 65 72 44 6c 6c 46 69 6c  teDesignerDllFil
325a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
325b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
325c0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
325d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
325e0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
325f0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
32600 74 61 69 6c 20 24 73 79 73 74 65 6d 44 61 74 61  tail $systemData
32610 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65 5d 5d 5d  SQLiteDllFile]]]
32620 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32630 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
32640 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
32650 65 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51  el $systemDataSQ
32660 4c 69 74 65 44 6c 6c 46 69 6c 65 0d 0a 20 20 20  LiteDllFile..   
32670 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
32680 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
32690 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
326a0 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
326b0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
326c0 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
326d0 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74 65  systemDataSQLite
326e0 4c 69 6e 71 44 6c 6c 46 69 6c 65 5d 5d 5d 7d 20  LinqDllFile]]]} 
326f0 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20  then {..        
32700 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69        checkForFi
32710 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c  le $test_channel
32720 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
32730 74 65 4c 69 6e 71 44 6c 6c 46 69 6c 65 0d 0a 20  teLinqDllFile.. 
32740 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32750 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32760 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32770 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32780 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32790 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
327a0 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69   $systemDataSQLi
327b0 74 65 45 66 36 44 6c 6c 46 69 6c 65 5d 5d 5d 7d  teEf6DllFile]]]}
327c0 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
327d0 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
327e0 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
327f0 6c 20 24 73 79 73 74 65 6d 44 61 74 61 53 51 4c  l $systemDataSQL
32800 69 74 65 45 66 36 44 6c 6c 46 69 6c 65 0d 0a 20  iteEf6DllFile.. 
32810 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32820 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32830 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32840 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32850 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32860 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32870 20 24 74 65 73 74 45 78 65 46 69 6c 65 5d 5d 5d   $testExeFile]]]
32880 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32890 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
328a0 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
328b0 65 6c 20 24 74 65 73 74 45 78 65 46 69 6c 65 20  el $testExeFile 
328c0 74 65 73 74 2e 65 78 65 0d 0a 20 20 20 20 20 20  test.exe..      
328d0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
328e0 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61 76         if {![hav
328f0 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70 70  eConstraint [app
32900 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d  endArgs file_ \.
32910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32920 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65 73   [file tail $tes
32930 74 4c 69 6e 71 45 78 65 46 69 6c 65 5d 5d 5d 7d  tLinqExeFile]]]}
32940 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32950 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32960 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32970 6c 20 24 74 65 73 74 4c 69 6e 71 45 78 65 46 69  l $testLinqExeFi
32980 6c 65 20 74 65 73 74 6c 69 6e 71 2e 65 78 65 0d  le testlinq.exe.
32990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
329a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
329b0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
329c0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
329d0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
329e0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
329f0 69 6c 20 24 74 65 73 74 45 66 36 45 78 65 46 69  il $testEf6ExeFi
32a00 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
32a10 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
32a20 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
32a30 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 45 66 36  channel $testEf6
32a40 45 78 65 46 69 6c 65 20 74 65 73 74 65 66 36 2e  ExeFile testef6.
32a50 65 78 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  exe..           
32a60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
32a70 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73    if {![haveCons
32a80 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72  traint [appendAr
32a90 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20  gs file_ \..    
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c              [fil
32ab0 65 20 74 61 69 6c 20 24 74 65 73 74 4c 69 6e 71  e tail $testLinq
32ac0 4f 75 74 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e  OutFile]]]} then
32ad0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
32ae0 20 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24    checkForFile $
32af0 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65  test_channel $te
32b00 73 74 4c 69 6e 71 4f 75 74 46 69 6c 65 0d 0a 20  stLinqOutFile.. 
32b10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32b20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32b30 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32b40 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32b50 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32b60 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32b70 20 24 6e 6f 72 74 68 77 69 6e 64 45 66 44 62 46   $northwindEfDbF
32b80 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a  ile]]]} then {..
32b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
32ba0 65 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74  eckForFile $test
32bb0 5f 63 68 61 6e 6e 65 6c 20 24 6e 6f 72 74 68 77  _channel $northw
32bc0 69 6e 64 45 66 44 62 46 69 6c 65 0d 0a 20 20 20  indEfDbFile..   
32bd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
32be0 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b            if {![
32bf0 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b  haveConstraint [
32c00 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f  appendArgs file_
32c10 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
32c20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24      [file tail $
32c30 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 5d 5d 5d 7d  nonWalDbFile]]]}
32c40 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20   then {..       
32c50 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46         checkForF
32c60 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65  ile $test_channe
32c70 6c 20 24 6e 6f 6e 57 61 6c 44 62 46 69 6c 65 0d  l $nonWalDbFile.
32c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
32c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
32ca0 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69   {![haveConstrai
32cb0 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66  nt [appendArgs f
32cc0 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20  ile_ \..        
32cd0 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61          [file ta
32ce0 69 6c 20 24 77 61 6c 44 62 46 69 6c 65 5d 5d 5d  il $walDbFile]]]
32cf0 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20  } then {..      
32d00 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f 72          checkFor
32d10 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e 6e  File $test_chann
32d20 65 6c 20 24 77 61 6c 44 62 46 69 6c 65 0d 0a 20  el $walDbFile.. 
32d30 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
32d40 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
32d50 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
32d60 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
32d70 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
32d80 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
32d90 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
32da0 30 30 35 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  005LogFile]]]} t
32db0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
32dc0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
32dd0 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
32de0 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
32df0 30 35 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  05LogFile..     
32e00 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
32e10 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
32e20 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
32e30 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
32e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
32e50 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
32e60 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c  stInstallVs2008L
32e70 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
32e80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
32e90 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
32ea0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
32eb0 74 49 6e 73 74 61 6c 6c 56 73 32 30 30 38 4c 6f  tInstallVs2008Lo
32ec0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
32ed0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
32ee0 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
32ef0 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
32f00 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
32f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
32f20 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
32f30 73 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69  stallVs2010LogFi
32f40 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
32f60 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
32f70 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
32f80 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
32f90 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
32fa0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
32fb0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
32fc0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
32fd0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
32fe0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
32ff0 74 61 69 6c 20 24 74 65 73 74 49 6e 73 74 61 6c  tail $testInstal
33000 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 5d 5d  lVs2012LogFile]]
33010 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
33020 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 46 6f           checkFo
33030 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68 61 6e  rFile $test_chan
33040 6e 65 6c 20 24 74 65 73 74 49 6e 73 74 61 6c 6c  nel $testInstall
33050 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 0d 0a 20  Vs2012LogFile.. 
33060 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
33070 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b              if {
33080 21 5b 68 61 76 65 43 6f 6e 73 74 72 61 69 6e 74  ![haveConstraint
33090 20 5b 61 70 70 65 6e 64 41 72 67 73 20 66 69 6c   [appendArgs fil
330a0 65 5f 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20  e_ \..          
330b0 20 20 20 20 20 20 5b 66 69 6c 65 20 74 61 69 6c        [file tail
330c0 20 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32   $testInstallVs2
330d0 30 31 33 4c 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74  013LogFile]]]} t
330e0 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  hen {..         
330f0 20 20 20 20 20 63 68 65 63 6b 46 6f 72 46 69 6c       checkForFil
33100 65 20 24 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20  e $test_channel 
33110 24 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30  $testInstallVs20
33120 31 33 4c 6f 67 46 69 6c 65 0d 0a 20 20 20 20 20  13LogFile..     
33130 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
33140 20 20 20 20 20 20 20 20 69 66 20 7b 21 5b 68 61          if {![ha
33150 76 65 43 6f 6e 73 74 72 61 69 6e 74 20 5b 61 70  veConstraint [ap
33160 70 65 6e 64 41 72 67 73 20 66 69 6c 65 5f 20 5c  pendArgs file_ \
33170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
33180 20 20 5b 66 69 6c 65 20 74 61 69 6c 20 24 74 65    [file tail $te
33190 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c  stInstallVs2015L
331a0 6f 67 46 69 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20  ogFile]]]} then 
331b0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
331c0 20 63 68 65 63 6b 46 6f 72 46 69 6c 65 20 24 74   checkForFile $t
331d0 65 73 74 5f 63 68 61 6e 6e 65 6c 20 24 74 65 73  est_channel $tes
331e0 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 35 4c 6f  tInstallVs2015Lo
331f0 67 46 69 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  gFile..         
33200 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
33210 20 20 20 20 69 66 20 7b 21 5b 68 61 76 65 43 6f      if {![haveCo
33220 6e 73 74 72 61 69 6e 74 20 5b 61 70 70 65 6e 64  nstraint [append
33230 41 72 67 73 20 66 69 6c 65 5f 20 5c 0d 0a 20 20  Args file_ \..  
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 66                [f
33250 69 6c 65 20 74 61 69 6c 20 24 74 65 73 74 49 6e  ile tail $testIn
33260 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69  stallVs2017LogFi
33270 6c 65 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  le]]]} then {.. 
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65               che
33290 63 6b 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f  ckForFile $test_
332a0 63 68 61 6e 6e 65 6c 20 24 74 65 73 74 49 6e 73  channel $testIns
332b0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
332c0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
332d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
332e0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
332f0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33300 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33310 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33320 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33330 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c 65  allVs2005LogFile
33340 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33350 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33360 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33370 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33380 74 61 6c 6c 56 73 32 30 30 35 4c 6f 67 46 69 6c  tallVs2005LogFil
33390 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
333a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
333b0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
333c0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
333d0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
333e0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
333f0 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33400 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c 65  allVs2008LogFile
33410 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33420 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33430 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33440 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33450 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
33460 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33470 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33480 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33490 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
334a0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
334b0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
334c0 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
334d0 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c 65  allVs2010LogFile
334e0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
334f0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33500 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33510 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33520 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
33530 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33540 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33550 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33560 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33570 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33580 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33590 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
335a0 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65  allVs2012LogFile
335b0 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
335c0 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
335d0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
335e0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
335f0 74 61 6c 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c  tallVs2012LogFil
33600 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33610 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
33620 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33630 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33640 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33650 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33660 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33670 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c 65  allVs2013LogFile
33680 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33690 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
336a0 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
336b0 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
336c0 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67 46 69 6c  tallVs2013LogFil
336d0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
336e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
336f0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
33700 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
33710 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
33720 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33730 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33740 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65  allVs2015LogFile
33750 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33760 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33770 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33780 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33790 74 61 6c 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c  tallVs2015LogFil
337a0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
337b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
337c0 69 66 20 7b 21 5b 68 61 76 65 43 6f 6e 73 74 72  if {![haveConstr
337d0 61 69 6e 74 20 5b 61 70 70 65 6e 64 41 72 67 73  aint [appendArgs
337e0 20 66 69 6c 65 5f 20 5c 0d 0a 20 20 20 20 20 20   file_ \..      
337f0 20 20 20 20 20 20 20 20 20 20 5b 66 69 6c 65 20            [file 
33800 74 61 69 6c 20 24 74 65 73 74 55 6e 69 6e 73 74  tail $testUninst
33810 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c 65  allVs2017LogFile
33820 5d 5d 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20  ]]]} then {..   
33830 20 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b             check
33840 46 6f 72 46 69 6c 65 20 24 74 65 73 74 5f 63 68  ForFile $test_ch
33850 61 6e 6e 65 6c 20 24 74 65 73 74 55 6e 69 6e 73  annel $testUnins
33860 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
33870 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e..            }
33880 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20  ..          }.. 
33890 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
338a0 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a 20 20 20  }..    }.....   
338b0 20 70 72 6f 63 20 72 75 6e 53 51 4c 69 74 65 54   proc runSQLiteT
338c0 65 73 74 46 69 6c 65 73 45 70 69 6c 6f 67 75 65  estFilesEpilogue
338d0 20 7b 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a   {} {..      #..
338e0 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b        # NOTE: Sk
338f0 69 70 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63  ip running our c
33900 75 73 74 6f 6d 20 66 69 6c 65 73 20 65 70 69 6c  ustom files epil
33910 6f 67 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e  ogue if the main
33920 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 0d 0a 20   one has been.. 
33930 20 20 20 20 20 23 20 20 20 20 20 20 20 73 6b 69       #       ski
33940 70 70 65 64 2e 0d 0a 20 20 20 20 20 20 23 0d 0a  pped...      #..
33950 20 20 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f        if {![info
33960 20 65 78 69 73 74 73 20 3a 3a 6e 6f 28 65 70 69   exists ::no(epi
33970 6c 6f 67 75 65 2e 65 61 67 6c 65 29 5d 7d 20 74  logue.eagle)]} t
33980 68 65 6e 20 7b 0d 0a 20 20 20 20 20 20 20 20 75  hen {..        u
33990 70 6c 65 76 65 6c 20 31 20 7b 0d 0a 20 20 20 20  plevel 1 {..    
339a0 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e 6f 63        unset -noc
339b0 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20 20 20  omplain \..     
339c0 20 20 20 20 20 20 20 20 20 74 65 73 74 55 6e 69           testUni
339d0 6e 73 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46  nstallVs2017LogF
339e0 69 6c 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c  ile testUninstal
339f0 6c 56 73 32 30 31 35 4c 6f 67 46 69 6c 65 20 5c  lVs2015LogFile \
33a00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
33a10 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32  testUninstallVs2
33a20 30 31 33 4c 6f 67 46 69 6c 65 20 74 65 73 74 55  013LogFile testU
33a30 6e 69 6e 73 74 61 6c 6c 56 73 32 30 31 32 4c 6f  ninstallVs2012Lo
33a40 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20  gFile \..       
33a50 20 20 20 20 20 20 20 74 65 73 74 55 6e 69 6e 73         testUnins
33a60 74 61 6c 6c 56 73 32 30 31 30 4c 6f 67 46 69 6c  tallVs2010LogFil
33a70 65 20 74 65 73 74 55 6e 69 6e 73 74 61 6c 6c 56  e testUninstallV
33a80 73 32 30 30 38 4c 6f 67 46 69 6c 65 20 5c 0d 0a  s2008LogFile \..
33a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
33aa0 73 74 55 6e 69 6e 73 74 61 6c 6c 56 73 32 30 30  stUninstallVs200
33ab0 35 4c 6f 67 46 69 6c 65 20 74 65 73 74 49 6e 73  5LogFile testIns
33ac0 74 61 6c 6c 56 73 32 30 31 37 4c 6f 67 46 69 6c  tallVs2017LogFil
33ad0 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e \..           
33ae0 20 20 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73     testInstallVs
33af0 32 30 31 35 4c 6f 67 46 69 6c 65 20 74 65 73 74  2015LogFile test
33b00 49 6e 73 74 61 6c 6c 56 73 32 30 31 33 4c 6f 67  InstallVs2013Log
33b10 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20  File \..        
33b20 20 20 20 20 20 20 74 65 73 74 49 6e 73 74 61 6c        testInstal
33b30 6c 56 73 32 30 31 32 4c 6f 67 46 69 6c 65 20 74  lVs2012LogFile t
33b40 65 73 74 49 6e 73 74 61 6c 6c 56 73 32 30 31 30  estInstallVs2010
33b50 4c 6f 67 46 69 6c 65 20 5c 0d 0a 20 20 20 20 20  LogFile \..     
33b60 20 20 20 20 20 20 20 20 20 74 65 73 74 49 6e 73           testIns
33b70 74 61 6c 6c 56 73 32 30 30 38 4c 6f 67 46 69 6c  tallVs2008LogFil
33b80 65 20 74 65 73 74 49 6e 73 74 61 6c 6c 56 73 32  e testInstallVs2
33b90 30 30 35 4c 6f 67 46 69 6c 65 0d 0a 0d 0a 20 20  005LogFile....  
33ba0 20 20 20 20 20 20 20 20 75 6e 73 65 74 20 2d 6e          unset -n
33bb0 6f 63 6f 6d 70 6c 61 69 6e 20 5c 0d 0a 20 20 20  ocomplain \..   
33bc0 20 20 20 20 20 20 20 20 20 20 20 6e 6f 72 74 68             north
33bd0 77 69 6e 64 45 66 44 62 46 69 6c 65 20 74 65 73  windEfDbFile tes
33be0 74 4c 69 6e 71 4f 75 74 46 69 6c 65 20 5c 0d 0a  tLinqOutFile \..
33bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 61                wa
33c00 6c 44 62 46 69 6c 65 20 6e 6f 6e 57 61 6c 44 62  lDbFile nonWalDb
33c10 46 69 6c 65 0d 0a 0d 0a 20 20 20 20 20 20 20 20  File....        
33c20 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c    unset -nocompl
33c30 61 69 6e 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ain \..         
33c40 20 20 20 20 20 74 65 73 74 45 66 36 45 78 65 46       testEf6ExeF
33c50 69 6c 65 20 74 65 73 74 4c 69 6e 71 45 78 65 46  ile testLinqExeF
33c60 69 6c 65 20 5c 0d 0a 20 20 20 20 20 20 20 20 20  ile \..         
33c70 20 20 20 20 20 74 65 73 74 45 78 65 46 69 6c 65       testExeFile
33c80 20 73 79 73 74 65 6d 44 61 74 61 53 51 4c 69 74   systemDataSQLit
33c90 65 45 66 36 44 6c 6c 46 69 6c 65 20 5c 0d 0a 20  eEf6DllFile \.. 
33ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 73               sys
33cb0 74 65 6d 44 61 74 61 53 51 4c 69 74 65 4c 69 6e  temDataSQLiteLin
33cc0 71 44 6c 6c 46 69 6c 65 20 73 79 73 74 65 6d 44  qDllFile systemD
33cd0 61 74 61 53 51 4c 69 74 65 44 6c 6c 46 69 6c 65  ataSQLiteDllFile
33ce0 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   \..            
33cf0 20 20 73 71 6c 69 74 65 44 65 73 69 67 6e 65 72    sqliteDesigner
33d00 44 6c 6c 46 69 6c 65 20 69 6e 73 74 61 6c 6c 65  DllFile installe
33d10 72 45 78 65 46 69 6c 65 20 5c 0d 0a 20 20 20 20  rExeFile \..    
33d20 20 20 20 20 20 20 20 20 20 20 65 6e 74 69 74 79            entity
33d30 46 72 61 6d 65 77 6f 72 6b 44 6c 6c 46 69 6c 65  FrameworkDllFile
33d40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
33d50 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d 0a     }..    }.....
33d60 20 20 20 20 70 72 6f 63 20 72 75 6e 53 51 4c 69      proc runSQLi
33d70 74 65 54 65 73 74 45 70 69 6c 6f 67 75 65 20 7b  teTestEpilogue {
33d80 7d 20 7b 0d 0a 20 20 20 20 20 20 23 0d 0a 20 20  } {..      #..  
33d90 20 20 20 20 23 20 4e 4f 54 45 3a 20 53 6b 69 70      # NOTE: Skip
33da0 20 72 75 6e 6e 69 6e 67 20 6f 75 72 20 63 75 73   running our cus
33db0 74 6f 6d 20 65 70 69 6c 6f 67 75 65 20 69 66 20  tom epilogue if 
33dc0 74 68 65 20 6d 61 69 6e 20 6f 6e 65 20 68 61 73  the main one has
33dd0 20 62 65 65 6e 0d 0a 20 20 20 20 20 20 23 20 20   been..      #  
33de0 20 20 20 20 20 73 6b 69 70 70 65 64 2e 0d 0a 20       skipped... 
33df0 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20 69 66       #..      if
33e00 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
33e10 3a 3a 6e 6f 28 65 70 69 6c 6f 67 75 65 2e 65 61  ::no(epilogue.ea
33e20 67 6c 65 29 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20  gle)]} then {.. 
33e30 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
33e40 20 20 23 20 4e 4f 54 45 3a 20 53 68 6f 77 20 77    # NOTE: Show w
33e50 68 65 6e 20 6f 75 72 20 74 65 73 74 73 20 61 63  hen our tests ac
33e60 74 75 61 6c 6c 79 20 65 6e 64 65 64 20 28 6e 6f  tually ended (no
33e70 77 29 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a  w)...        #..
33e80 20 20 20 20 20 20 20 20 74 70 75 74 73 20 24 3a          tputs $:
33e90 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 20 5b 61  :test_channel [a
33ea0 70 70 65 6e 64 41 72 67 73 20 5c 0d 0a 20 20 20  ppendArgs \..   
33eb0 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 20 53           "---- S
33ec0 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74  ystem.Data.SQLit
33ed0 65 20 74 65 73 74 73 20 65 6e 64 65 64 20 61 74  e tests ended at
33ee0 20 22 20 5c 0d 0a 20 20 20 20 20 20 20 20 20 20   " \..          
33ef0 20 20 5b 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20    [clock format 
33f00 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 5d  [clock seconds]]
33f10 20 5c 6e 5d 0d 0a 0d 0a 20 20 20 20 20 20 20 20   \n]....        
33f20 23 0d 0a 20 20 20 20 20 20 20 20 23 20 4e 4f 54  #..        # NOT
33f30 45 3a 20 4c 6f 61 64 20 74 68 65 20 22 65 70 69  E: Load the "epi
33f40 6c 6f 67 75 65 22 20 63 75 73 74 6f 6d 20 70 65  logue" custom pe
33f50 72 2d 75 73 65 72 20 61 6e 64 2f 6f 72 20 70 65  r-user and/or pe
33f60 72 2d 68 6f 73 74 20 74 65 73 74 0d 0a 20 20 20  r-host test..   
33f70 20 20 20 20 20 23 20 20 20 20 20 20 20 73 65 74       #       set
33f80 74 69 6e 67 73 20 6e 6f 77 2e 0d 0a 20 20 20 20  tings now...    
33f90 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 75      #..        u
33fa0 70 6c 65 76 65 6c 20 31 20 5b 6c 69 73 74 20 6c  plevel 1 [list l
33fb0 6f 61 64 53 51 4c 69 74 65 54 65 73 74 53 65 74  oadSQLiteTestSet
33fc0 74 69 6e 67 73 20 24 3a 3a 74 65 73 74 5f 63 68  tings $::test_ch
33fd0 61 6e 6e 65 6c 20 2e 65 70 69 6c 6f 67 75 65 5d  annel .epilogue]
33fe0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  ....        #.. 
33ff0 20 20 20 20 20 20 20 23 20 42 55 47 46 49 58 3a         # BUGFIX:
34000 20 42 65 66 6f 72 65 20 63 68 65 63 6b 69 6e 67   Before checking
34010 20 74 68 65 20 66 69 6e 61 6c 20 72 65 73 6f 75   the final resou
34020 72 63 65 73 20 69 6e 20 75 73 65 20 62 79 20 53  rces in use by S
34030 51 4c 69 74 65 2c 20 6d 61 6b 65 0d 0a 20 20 20  QLite, make..   
34040 20 20 20 20 20 23 20 20 20 20 20 20 20 20 20 73       #         s
34050 75 72 65 20 62 6f 74 68 20 6f 66 20 74 68 65 20  ure both of the 
34060 50 52 41 47 4d 41 20 72 65 6c 61 74 65 64 20 64  PRAGMA related d
34070 69 72 65 63 74 6f 72 79 20 6e 61 6d 65 73 20 61  irectory names a
34080 72 65 20 66 72 65 65 64 2e 0d 0a 20 20 20 20 20  re freed...     
34090 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 63 68     #..        ch
340a0 65 63 6b 46 6f 72 53 51 4c 69 74 65 44 69 72 65  eckForSQLiteDire
340b0 63 74 6f 72 69 65 73 20 24 3a 3a 74 65 73 74 5f  ctories $::test_
340c0 63 68 61 6e 6e 65 6c 20 74 72 75 65 0d 0a 0d 0a  channel true....
340d0 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
340e0 20 20 20 23 20 4e 4f 54 45 3a 20 41 6c 73 6f 20     # NOTE: Also 
340f0 72 65 70 6f 72 74 20 74 68 65 20 72 65 73 6f 75  report the resou
34100 72 63 65 20 75 73 61 67 65 20 61 66 74 65 72 20  rce usage after 
34110 72 75 6e 6e 69 6e 67 20 74 68 65 20 74 65 73 74  running the test
34120 73 2e 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20  s...        #.. 
34130 20 20 20 20 20 20 20 72 65 70 6f 72 74 53 51 4c         reportSQL
34140 69 74 65 52 65 73 6f 75 72 63 65 73 20 24 3a 3a  iteResources $::
34150 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d 0a 0d 0a  test_channel....
34160 20 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20          #..     
34170 20 20 20 23 20 4e 4f 54 45 3a 20 52 65 70 6f 72     # NOTE: Repor
34180 74 20 74 68 65 20 63 72 69 74 69 63 61 6c 20 68  t the critical h
34190 61 6e 64 6c 65 20 63 6f 75 6e 74 73 20 61 66 74  andle counts aft
341a0 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 74  er running the t
341b0 65 73 74 73 2e 0d 0a 20 20 20 20 20 20 20 20 23  ests...        #
341c0 0d 0a 20 20 20 20 20 20 20 20 67 65 74 53 51 4c  ..        getSQL
341d0 69 74 65 48 61 6e 64 6c 65 43 6f 75 6e 74 73 20  iteHandleCounts 
341e0 24 3a 3a 74 65 73 74 5f 63 68 61 6e 6e 65 6c 0d  $::test_channel.
341f0 0a 0d 0a 20 20 20 20 20 20 20 20 23 0d 0a 20 20  ...        #..  
34200 20 20 20 20 20 20 23 20 4e 4f 54 45 3a 20 49 66        # NOTE: If
34210 20 6e 65 63 65 73 73 61 72 79 2c 20 64 69 73 61   necessary, disa
34220 62 6c 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  ble shared-cache
34230 20 6d 6f 64 65 20 6e 6f 77 2e 0d 0a 20 20 20 20   mode now...    
34240 20 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 69      #..        i
34250 66 20 7b 5b 68 61 73 52 75 6e 74 69 6d 65 4f 70  f {[hasRuntimeOp
34260 74 69 6f 6e 20 73 68 61 72 65 64 43 61 63 68 65  tion sharedCache
34270 5d 7d 20 74 68 65 6e 20 7b 0d 0a 20 20 20 20 20  ]} then {..     
34280 20 20 20 20 20 65 6e 61 62 6c 65 53 68 61 72 65       enableShare
34290 64 43 61 63 68 65 20 24 3a 3a 74 65 73 74 5f 63  dCache $::test_c
342a0 68 61 6e 6e 65 6c 20 66 61 6c 73 65 0d 0a 20 20  hannel false..  
342b0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
342c0 20 20 20 23 0d 0a 20 20 20 20 20 20 20 20 23 20     #..        # 
342d0 4e 4f 54 45 3a 20 52 65 73 74 6f 72 65 20 74 68  NOTE: Restore th
342e0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 73 61 76  e previously sav
342f0 65 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  ed environment v
34300 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 77 65  ariables that we
34310 0d 0a 20 20 20 20 20 20 20 20 23 20 20 20 20 20  ..        #     
34320 20 20 63 68 61 6e 67 65 64 20 66 6f 72 20 74 68    changed for th
34330 65 20 74 65 73 74 20 73 75 69 74 65 2e 0d 0a 20  e test suite... 
34340 20 20 20 20 20 20 20 23 0d 0a 20 20 20 20 20 20         #..      
34350 20 20 72 65 73 74 6f 72 65 45 6e 76 69 72 6f 6e    restoreEnviron
34360 6d 65 6e 74 56 61 72 69 61 62 6c 65 73 20 5c 0d  mentVariables \.
34370 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 69  .            [li
34380 73 74 20 49 6e 69 74 69 61 6c 69 7a 65 5f 53 51  st Initialize_SQ
34390 4c 69 74 65 4c 6f 67 5d 20 3a 3a 74 65 73 74 53  LiteLog] ::testS
343a0 75 69 74 65 53 61 76 65 64 45 6e 76 0d 0a 20 20  uiteSavedEnv..  
343b0 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 0c 0d      }..    }....
343c0 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23 23  .    ###########
343d0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
343e0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
343f0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34400 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34410 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23 23  ..    ##########
34420 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34430 23 23 23 20 45 4e 44 20 45 61 67 6c 65 20 4f 4e  ### END Eagle ON
34440 4c 59 20 23 23 23 23 23 23 23 23 23 23 23 23 23  LY #############
34450 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34460 23 0d 0a 20 20 20 20 23 23 23 23 23 23 23 23 23  #..    #########
34470 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34480 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
34490 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
344a0 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
344b0 23 23 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 23 0d 0a  ##..  }....  #..
344c0 20 20 23 20 4e 4f 54 45 3a 20 53 61 76 65 20 74    # NOTE: Save t
344d0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
344e0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
344f0 69 6e 67 20 74 68 69 73 20 66 69 6c 65 2e 0d 0a  ing this file...
34500 20 20 23 0d 0a 20 20 69 66 20 7b 21 5b 69 6e 66    #..  if {![inf
34510 6f 20 65 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f  o exists common_
34520 64 69 72 65 63 74 6f 72 79 5d 7d 20 74 68 65 6e  directory]} then
34530 20 7b 0d 0a 20 20 20 20 73 65 74 20 63 6f 6d 6d   {..    set comm
34540 6f 6e 5f 64 69 72 65 63 74 6f 72 79 20 5b 66 69  on_directory [fi
34550 6c 65 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f  le dirname [info
34560 20 73 63 72 69 70 74 5d 5d 0d 0a 20 20 7d 0d 0a   script]]..  }..
34570 0d 0a 20 20 23 0d 0a 20 20 23 20 4e 4f 54 45 3a  ..  #..  # NOTE:
34580 20 50 72 6f 76 69 64 65 20 74 68 65 20 53 79 73   Provide the Sys
34590 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 20  tem.Data.SQLite 
345a0 74 65 73 74 20 70 61 63 6b 61 67 65 20 74 6f 20  test package to 
345b0 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
345c0 0d 0a 20 20 23 0d 0a 20 20 70 61 63 6b 61 67 65  ..  #..  package
345d0 20 70 72 6f 76 69 64 65 20 53 79 73 74 65 6d 2e   provide System.
345e0 44 61 74 61 2e 53 51 4c 69 74 65 2e 54 65 73 74  Data.SQLite.Test
345f0 20 31 2e 30 0d 0a 7d 0d 0a                        1.0..}..