<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=VbzCart%2Farchive%2Fcode%2Fadmin.cache</id>
	<title>VbzCart/archive/code/admin.cache - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=VbzCart%2Farchive%2Fcode%2Fadmin.cache"/>
	<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;action=history"/>
	<updated>2026-06-25T17:39:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=28628&amp;oldid=prev</id>
		<title>Woozle at 12:56, 14 October 2022</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=28628&amp;oldid=prev"/>
		<updated>2022-10-14T12:56:26Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:56, 14 October 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Code==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Code==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;php&amp;gt;&amp;lt;?php&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight lang=&lt;/ins&gt;php&amp;gt;&amp;lt;?php&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;/*&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;/*&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   LIBRARY: admin.cache.php - administration of cache management tables using MW UI&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   LIBRARY: admin.cache.php - administration of cache management tables using MW UI&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l688&quot;&gt;Line 688:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 688:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;php&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
	<entry>
		<id>https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=20380&amp;oldid=prev</id>
		<title>Woozle: Woozle moved page VbzCart/code/admin.cache to VbzCart/archive/code/admin.cache</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=20380&amp;oldid=prev"/>
		<updated>2014-12-19T02:09:03Z</updated>

		<summary type="html">&lt;p&gt;Woozle moved page &lt;a href=&quot;/mw/index.php?title=VbzCart/code/admin.cache&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;VbzCart/code/admin.cache (page does not exist)&quot;&gt;VbzCart/code/admin.cache&lt;/a&gt; to &lt;a href=&quot;/VbzCart/archive/code/admin.cache&quot; title=&quot;VbzCart/archive/code/admin.cache&quot;&gt;VbzCart/archive/code/admin.cache&lt;/a&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:09, 19 December 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
	<entry>
		<id>https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=17881&amp;oldid=prev</id>
		<title>Woozle: current version (can&#039;t save it!)</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=VbzCart/archive/code/admin.cache&amp;diff=17881&amp;oldid=prev"/>
		<updated>2012-05-13T12:14:07Z</updated>

		<summary type="html">&lt;p&gt;current version (can&amp;#039;t save it!)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Code==&lt;br /&gt;
&amp;lt;php&amp;gt;&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
  LIBRARY: admin.cache.php - administration of cache management tables using MW UI&lt;br /&gt;
  HISTORY:&lt;br /&gt;
    2010-11-08 extracting from SpecialVbzAdmin&lt;br /&gt;
    2010-11-09 renaming &amp;quot;data&amp;quot; to &amp;quot;cache&amp;quot;&lt;br /&gt;
	Also renamed everything &amp;quot;Proc&amp;quot; to &amp;quot;Query&amp;quot;, but then later decided this was not&lt;br /&gt;
	  as great an idea as I originally thought because procs are really the way to do this.&lt;br /&gt;
    2010-11-11 renaming &amp;quot;query&amp;quot; back to &amp;quot;proc&amp;quot;&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
class clsAdminCacheMgr extends clsCacheMgr {&lt;br /&gt;
// STATIC methods -- these should later be methods of descendent classes of the component tables&lt;br /&gt;
    &lt;br /&gt;
    /*----&lt;br /&gt;
      INPUT:&lt;br /&gt;
	iName: what to display for a page (or interwiki) link&lt;br /&gt;
	iPfx: full name of page (or interwiki) link, but without the name (iPfx+iName = full page name)&lt;br /&gt;
    */&lt;br /&gt;
    static public function PageLink($iName,$iPfx) {&lt;br /&gt;
	global $vgOut;&lt;br /&gt;
&lt;br /&gt;
	return $vgOut-&amp;gt;InternalLink($iPfx.$iName,$iName);&lt;br /&gt;
    }&lt;br /&gt;
    static public function TableLinkDoc($iName) {&lt;br /&gt;
	return self::PageLink($iName,kwp_DocTblPfx);&lt;br /&gt;
    }&lt;br /&gt;
    static public function ProcLinkDoc($iName) {&lt;br /&gt;
	return self::PageLink($iName,kwp_DocPrcPfx);&lt;br /&gt;
    }&lt;br /&gt;
// OVERRIDE methods&lt;br /&gt;
    protected function NewTblTables($iName) {&lt;br /&gt;
	return new clsAdminCacheTables($this, $iName);&lt;br /&gt;
    }&lt;br /&gt;
    protected function NewTblProcs($iName) {&lt;br /&gt;
	return new clsAdminCacheProcs($this,$iName);&lt;br /&gt;
    }&lt;br /&gt;
    protected function NewTblFlows($iName) {&lt;br /&gt;
	return new clsAdminCacheFlows($this,$iName);&lt;br /&gt;
    }&lt;br /&gt;
    protected function NewTblEvents($iName) {&lt;br /&gt;
	return new clsAdminCacheEvents($this,$iName);&lt;br /&gt;
    }&lt;br /&gt;
// DYNAMIC methods&lt;br /&gt;
    public function MenuDispatch($iAction,$iID=NULL) {&lt;br /&gt;
	switch ($iAction) {&lt;br /&gt;
	  case &amp;#039;cache&amp;#039;:&lt;br /&gt;
	    $this-&amp;gt;AdminPage();&lt;br /&gt;
	    break;&lt;br /&gt;
	  case &amp;#039;cache.tbl&amp;#039;:&lt;br /&gt;
	    $obj = $this-&amp;gt;Tables-&amp;gt;GetItem($iID);&lt;br /&gt;
	    $obj-&amp;gt;AdminPage();&lt;br /&gt;
	    break;&lt;br /&gt;
	  case &amp;#039;cache.proc&amp;#039;:&lt;br /&gt;
	    $obj = $this-&amp;gt;Procs-&amp;gt;GetItem($iID);&lt;br /&gt;
	    $obj-&amp;gt;AdminPage();&lt;br /&gt;
	    break;&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminPage() {&lt;br /&gt;
	global $wgRequest, $wgOut;&lt;br /&gt;
	global $vgPage, $vgOut;&lt;br /&gt;
	$vgPage-&amp;gt;UseWiki();&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;#039;==Cache Management==&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	$wgOut-&amp;gt;addWikiText($out,TRUE);	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	$dbVBZ = $this-&amp;gt;Engine();&lt;br /&gt;
&lt;br /&gt;
// check for action requests&lt;br /&gt;
	$strDo = $vgPage-&amp;gt;Arg(&amp;#039;do&amp;#039;);&lt;br /&gt;
	//$strTbls = $vgPage-&amp;gt;Arg(&amp;#039;id.table&amp;#039;);&lt;br /&gt;
	if ($strDo != &amp;#039;&amp;#039;) {&lt;br /&gt;
	    $idTbl = $vgPage-&amp;gt;Arg(&amp;#039;id&amp;#039;);&lt;br /&gt;
	    if (is_numeric($idTbl)) {&lt;br /&gt;
		$objTbl = $this-&amp;gt;Tables-&amp;gt;GetItem($idTbl);&lt;br /&gt;
	    }&lt;br /&gt;
	    switch ($strDo) {&lt;br /&gt;
	      case &amp;#039;update&amp;#039;:&lt;br /&gt;
		$out .= $objTbl-&amp;gt;UpdateData_Verbose();&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;br&amp;gt;Update of &amp;#039;.$objTbl-&amp;gt;AdminLink_Name().&amp;#039; complete.&amp;#039;;&lt;br /&gt;
		break;&lt;br /&gt;
	      case &amp;#039;stamp&amp;#039;:&lt;br /&gt;
		$arRes = $objTbl-&amp;gt;UpdateTime(__METHOD__);&lt;br /&gt;
		$out .= &amp;#039;Stamped &amp;#039;.$objTbl-&amp;gt;AdminLink_Name();&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Was&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$arRes[&amp;#039;was&amp;#039;];&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;SQL&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$arRes[&amp;#039;sql&amp;#039;];&lt;br /&gt;
		break;&lt;br /&gt;
	      case &amp;#039;clear&amp;#039;:&lt;br /&gt;
		$arRes = $objTbl-&amp;gt;ClearTime(__METHOD__);&lt;br /&gt;
		$out .= &amp;#039;Cleared &amp;#039;.$objTbl-&amp;gt;AdminLink_Name();&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Was&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$arRes[&amp;#039;was&amp;#039;];&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;SQL&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$arRes[&amp;#039;sql&amp;#039;];&lt;br /&gt;
		break;&lt;br /&gt;
/*	      case &amp;#039;table-info&amp;#039;:&lt;br /&gt;
		$out = $this-&amp;gt;AdminTable($idTbl);&lt;br /&gt;
		break;&lt;br /&gt;
	      case &amp;#039;table-update&amp;#039;:&lt;br /&gt;
		$out = $this-&amp;gt;UpdateTable($idTbl,&amp;#039;Special:VbzAdmin&amp;#039;);&lt;br /&gt;
		break;&lt;br /&gt;
	      case &amp;#039;table-stamp&amp;#039;;&lt;br /&gt;
		$out = $dbVBZ-&amp;gt;StampTable($idTbl);&lt;br /&gt;
		break;&lt;br /&gt;
*/&lt;br /&gt;
	    }&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText($out,TRUE);	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
// display the current status&lt;br /&gt;
	    $out = &amp;#039;===Cache Tables===&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText($out,TRUE);	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
	    //$out = $this-&amp;gt;ShowTables($strTbls);&lt;br /&gt;
	    $out = $this-&amp;gt;ShowTables();&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText($out,TRUE);	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
	    $out = &amp;#039;===Cache Procedures===&amp;#039;.&amp;quot;\n&amp;quot;;&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText($out,TRUE);	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
	    $this-&amp;gt;ShowProcs();&lt;br /&gt;
	}&lt;br /&gt;
	$dbVBZ-&amp;gt;Shut();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public function ShowProcs() {&lt;br /&gt;
	global $vgPage,$vgOut;&lt;br /&gt;
&lt;br /&gt;
	$vgPage-&amp;gt;UseHTML();&lt;br /&gt;
&lt;br /&gt;
	$tblProcs = $this-&amp;gt;Procs;&lt;br /&gt;
&lt;br /&gt;
	$objRows = $tblProcs-&amp;gt;DataSet();	// get all rows&lt;br /&gt;
&lt;br /&gt;
	if ($objRows-&amp;gt;hasRows()) {&lt;br /&gt;
	    $out = $vgOut-&amp;gt;TableOpen(&amp;#039;class=sortable&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblRowOpen(NULL,TRUE);&lt;br /&gt;
	      $out .= $vgOut-&amp;gt;TblCell(&amp;#039;procedure name&amp;#039;);&lt;br /&gt;
	      $out .= $vgOut-&amp;gt;TblCell(&amp;#039;A?&amp;#039;);&lt;br /&gt;
	      $out .= $vgOut-&amp;gt;TblCell(&amp;#039;Clr?&amp;#039;);&lt;br /&gt;
	      $out .= $vgOut-&amp;gt;TblCell(&amp;#039;notes&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblRowShut();&lt;br /&gt;
	    while ($objRows-&amp;gt;NextRow()) {&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowOpen();&lt;br /&gt;
		  //$ftName = $this-&amp;gt;ProcLinkDoc($objRows-&amp;gt;Name);&lt;br /&gt;
		  $ftName = $objRows-&amp;gt;AdminLink_Name();&lt;br /&gt;
		  $isActive = $objRows-&amp;gt;Value(&amp;#039;isActive&amp;#039;);&lt;br /&gt;
		  if (!$isActive) {&lt;br /&gt;
		      $ftName = &amp;#039;&amp;lt;s&amp;gt;&amp;#039;.$ftName.&amp;#039;&amp;lt;/s&amp;gt;&amp;#039;;&lt;br /&gt;
		  }&lt;br /&gt;
		  $out .= $vgOut-&amp;gt;TblCell($ftName);&lt;br /&gt;
		  $out .= $vgOut-&amp;gt;TblCell($isActive?&amp;#039;&amp;amp;radic;&amp;#039;:&amp;#039;-&amp;#039;);&lt;br /&gt;
		  $out .= $vgOut-&amp;gt;TblCell(($objRows-&amp;gt;Value(&amp;#039;doesClear&amp;#039;))?&amp;#039;&amp;amp;radic;&amp;#039;:&amp;#039;-&amp;#039;);&lt;br /&gt;
		  $out .= $vgOut-&amp;gt;TblCell($objRows-&amp;gt;Value(&amp;#039;Notes&amp;#039;));&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowShut();&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TableShut();&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;No procedures found!&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$vgOut-&amp;gt;AddText($out);&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      FUTURE:&lt;br /&gt;
	Rename ShowTables() -&amp;gt; AdminTables()&lt;br /&gt;
	Move most of the code into clsAdminTables&lt;br /&gt;
    */&lt;br /&gt;
    public function ShowTables() {&lt;br /&gt;
	global $vgPage,$vgOut;&lt;br /&gt;
&lt;br /&gt;
	$objPage = $vgPage;&lt;br /&gt;
	$vgPage-&amp;gt;UseWiki();&lt;br /&gt;
&lt;br /&gt;
	//$objTbls = $this-&amp;gt;objDB-&amp;gt;DataSet(&amp;#039;SELECT * FROM &amp;#039;.$this-&amp;gt;Tables-&amp;gt;Name().&amp;#039; WHERE Name != &amp;quot;&amp;quot; ORDER BY Name&amp;#039;);&lt;br /&gt;
	$objTbls = $this-&amp;gt;Tables-&amp;gt;GetData(&amp;#039;Name != &amp;quot;&amp;quot;&amp;#039;,NULL,&amp;#039;Name&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	if ($objTbls-&amp;gt;hasRows()) {&lt;br /&gt;
	    $out = &amp;quot;{| class=sortable \n|-\n! table name || last update || sources || targets || notes&amp;quot;;&lt;br /&gt;
	    while ($objTbls-&amp;gt;NextRow()) {&lt;br /&gt;
		if ($objTbls-&amp;gt;Value(&amp;#039;isActive&amp;#039;)) {&lt;br /&gt;
		    //$strTbl = $objTbls-&amp;gt;Name;&lt;br /&gt;
		    $idTbl =  $objTbls-&amp;gt;KeyValue();&lt;br /&gt;
&lt;br /&gt;
		    $objSrces = $this-&amp;gt;Sources($idTbl);&lt;br /&gt;
		    $objTargs = $this-&amp;gt;Targets($idTbl);&lt;br /&gt;
		    $cntSrces = $objSrces-&amp;gt;RowCount();&lt;br /&gt;
		    $cntTargs = $objTargs-&amp;gt;RowCount();&lt;br /&gt;
&lt;br /&gt;
// table info open/shut calculations&lt;br /&gt;
//		    $doInfo = isset($lstTbls[$idTbl]);&lt;br /&gt;
&lt;br /&gt;
		    $htTblName = $objTbls-&amp;gt;AdminLink_Name();&lt;br /&gt;
&lt;br /&gt;
		    // common elements in action links&lt;br /&gt;
		    $arLink = $vgPage-&amp;gt;Args(array(&amp;#039;page&amp;#039;));&lt;br /&gt;
		    $arLink[&amp;#039;id&amp;#039;] = $idTbl;&lt;br /&gt;
&lt;br /&gt;
// source table list:&lt;br /&gt;
		    if ($cntSrces) {&lt;br /&gt;
/*&lt;br /&gt;
			$arLink = array(&lt;br /&gt;
			  &amp;#039;id&amp;#039;	=&amp;gt; $idTbl,&lt;br /&gt;
			  &amp;#039;do&amp;#039;	=&amp;gt; &amp;#039;table-update&amp;#039;&lt;br /&gt;
			  );&lt;br /&gt;
			$txtSrces .= $objPage-&amp;gt;SelfLink($arLink,&amp;#039;update&amp;#039;).&amp;#039; (&amp;#039;.$cntSrces.&amp;#039;)&amp;#039;;&lt;br /&gt;
*/&lt;br /&gt;
			$arLink[&amp;#039;do&amp;#039;] = &amp;#039;update&amp;#039;;&lt;br /&gt;
			$ftLink = $vgOut-&amp;gt;SelfLink($arLink,&amp;#039;update&amp;#039;,&amp;#039;update this table from its sources&amp;#039;);&lt;br /&gt;
			$txtSrces = $cntSrces.&amp;#039;&amp;amp;rarr;&amp;#039;.$ftLink;&lt;br /&gt;
		    } else { $txtSrces = &amp;#039;&amp;#039;; }&lt;br /&gt;
// target table list:&lt;br /&gt;
&lt;br /&gt;
		    if ($cntTargs) {&lt;br /&gt;
			$arLink[&amp;#039;do&amp;#039;] = &amp;#039;clear&amp;#039;;&lt;br /&gt;
			$ftLink1 = $vgOut-&amp;gt;SelfLink($arLink,&amp;#039;un&amp;#039;,&amp;#039;clear the time-updated stamp for this table&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			$arLink[&amp;#039;do&amp;#039;] = &amp;#039;stamp&amp;#039;;&lt;br /&gt;
			$ftLink2 = $vgOut-&amp;gt;SelfLink($arLink,&amp;#039;stamp&amp;#039;,&amp;#039;update the time-updated stamp for this table&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			$txtTargs = &amp;#039;(&amp;#039;.$ftLink1.&amp;#039;)&amp;#039;.$ftLink2.&amp;#039;&amp;amp;rarr;&amp;#039;.$cntTargs;&lt;br /&gt;
		    } else { $txtTargs = &amp;#039;&amp;#039;; }&lt;br /&gt;
		    &lt;br /&gt;
		    $out .= &amp;quot;\n|-\n| &amp;quot;.$htTblName. &amp;#039; || &amp;#039; . $objTbls-&amp;gt;Value(&amp;#039;WhenUpdated&amp;#039;) . &lt;br /&gt;
		      &amp;#039; || &amp;#039;.$txtSrces.&lt;br /&gt;
		      &amp;#039; || &amp;#039;.$txtTargs.&lt;br /&gt;
		      &amp;#039; || &amp;#039;.$objTbls-&amp;gt;Value(&amp;#039;Notes&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		    // if table is selected to show info, add a row for that:&lt;br /&gt;
/*&lt;br /&gt;
		    if ($doInfo) {&lt;br /&gt;
			$out .= &amp;quot;\n|-\n| colspan=5 |&amp;quot;;&lt;br /&gt;
			if ($objSrces-&amp;gt;hasRows()) {&lt;br /&gt;
			    $out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;:&amp;quot;;&lt;br /&gt;
			    while ($objSrces-&amp;gt;NextRow()) {&lt;br /&gt;
				$objSrce = 	$objDataMgr-&amp;gt;Tables-&amp;gt;GetItem($objSrces-&amp;gt;ID_Srce);&lt;br /&gt;
				if ($objSrce-&amp;gt;isActive) {&lt;br /&gt;
				    $strName = $objSrce-&amp;gt;Name;&lt;br /&gt;
				    $out .= &amp;#039; [[&amp;#039;.kwp_DocTblPfx.$strName.&amp;#039;|&amp;#039;.$strName.&amp;#039;]]&amp;#039;;&lt;br /&gt;
				} else {&lt;br /&gt;
				    $out .= &amp;quot; &amp;#039;&amp;#039;N/A id=&amp;quot;.$objSrces-&amp;gt;ID_Srce.&amp;quot;&amp;#039;&amp;#039;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
			if ($objTargs-&amp;gt;hasRows()) {&lt;br /&gt;
			    $out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Targets&amp;#039;&amp;#039;&amp;#039;:&amp;quot;;&lt;br /&gt;
			    while ($objTargs-&amp;gt;NextRow()) {&lt;br /&gt;
				$objTarg = 	$objDataMgr-&amp;gt;Tables-&amp;gt;GetItem($objTargs-&amp;gt;ID_Dest);&lt;br /&gt;
				if ($objTarg-&amp;gt;isActive) {&lt;br /&gt;
				    $strName = $objTarg-&amp;gt;Name;&lt;br /&gt;
				    $out .= &amp;#039; [[&amp;#039;.kwp_DocTblPfx.$strName.&amp;#039;|&amp;#039;.$strName.&amp;#039;]]&amp;#039;;&lt;br /&gt;
				} else {&lt;br /&gt;
				    $out .= &amp;quot; &amp;#039;&amp;#039;N/A id=&amp;quot;.$objTargs-&amp;gt;ID_Dest.&amp;quot;&amp;#039;&amp;#039;&amp;quot;;&lt;br /&gt;
				}&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
*/&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= &amp;quot;\n|}&amp;quot;;&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;ERROR: Mysterious lack of data&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheTables extends clsCacheTables {&lt;br /&gt;
    protected $arMap,$arCkd;&lt;br /&gt;
&lt;br /&gt;
    public function __construct(clsCacheMgr $iMgr,$iName) {&lt;br /&gt;
	parent::__construct($iMgr,$iName);&lt;br /&gt;
	  $this-&amp;gt;ClassSng(&amp;#039;clsAdminCacheTable&amp;#039;);&lt;br /&gt;
	  $this-&amp;gt;ActionKey(&amp;#039;cache.tbl&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// INFORMATION methods&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      RETURNS: recordset of targets with more recently-updated sources&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2011-12-21 created for update-cat maintenance script&lt;br /&gt;
    */&lt;br /&gt;
    public function UpdatedTargets() {&lt;br /&gt;
	// map out the cache and find out what needs to be run initially&lt;br /&gt;
	Write(&amp;#039;Mapping the cache...&amp;#039;);&lt;br /&gt;
	$rcFlows = $this-&amp;gt;Mgr()-&amp;gt;Flow-&amp;gt;GetData();	// get table of all flows&lt;br /&gt;
	$this-&amp;gt;arMap = $rcFlows-&amp;gt;FullMap();&lt;br /&gt;
	$this-&amp;gt;arCkd = array();&lt;br /&gt;
&lt;br /&gt;
	WriteLn(&amp;#039; ok&amp;#039;);&lt;br /&gt;
	$arRun = $this-&amp;gt;arMap[&amp;#039;run&amp;#039;];&lt;br /&gt;
	$cntRun = count($arRun);&lt;br /&gt;
	if ($cntRun &amp;gt; 0) {&lt;br /&gt;
	    WriteLn(&amp;#039;Starting with &amp;#039;.$cntRun.&amp;#039; update&amp;#039;.Pluralize($cntRun).&amp;#039;:&amp;#039;);&lt;br /&gt;
	    $this-&amp;gt;RunUpdates($arRun);&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      INPUT:&lt;br /&gt;
	$arRun: array of procs that need to be run&lt;br /&gt;
      NOTE: This does not take a rigorous approach to preventing loops.&lt;br /&gt;
	It just cuts off execution after the same Proc has been executed&lt;br /&gt;
	more than a preset number of times. There&amp;#039;s probably a very tidy&lt;br /&gt;
	algorithmic way to figure out what order everything should be executed&lt;br /&gt;
	in while rigorously preventing recursion, but I don&amp;#039;t have time&lt;br /&gt;
	to figure it out right now.&lt;br /&gt;
      HISTORY:&lt;br /&gt;
	2011-12-22 created for command line utility&lt;br /&gt;
	2011-12-24 allowing limited number of duplicate Procs&lt;br /&gt;
    */&lt;br /&gt;
    public function RunUpdates(array $arRun) {&lt;br /&gt;
	$tblT = $this-&amp;gt;Mgr()-&amp;gt;Tables;&lt;br /&gt;
	$rcT = $tblT-&amp;gt;SpawnItem();&lt;br /&gt;
	$arDone = array();&lt;br /&gt;
	do {&lt;br /&gt;
	    $isMore = FALSE;&lt;br /&gt;
	    $arRunNext = array();&lt;br /&gt;
&lt;br /&gt;
	    // display run list&lt;br /&gt;
	    WriteLn(&amp;quot;----------\nTO RUN:&amp;quot;);&lt;br /&gt;
	    foreach ($arRun as $idP =&amp;gt; $objP) {&lt;br /&gt;
		$txt = &amp;#039; &amp;#039;.$objP-&amp;gt;NameFull();&lt;br /&gt;
		$msg = NULL;&lt;br /&gt;
		if (array_key_exists($idP,$arDone)) {&lt;br /&gt;
		    $cnt = $arDone[$idP];&lt;br /&gt;
		    if ($cnt &amp;gt; 2) {&lt;br /&gt;
			$msg = &amp;#039; - LOOP DETECTED; quitting.&amp;#039;;&lt;br /&gt;
			die($txt.$msg.&amp;quot;\n&amp;quot;);&lt;br /&gt;
		    }&lt;br /&gt;
		    $msg = &amp;#039; - repeat #&amp;#039;.$cnt;&lt;br /&gt;
		    $arDone[$idP]++;&lt;br /&gt;
		} else {&lt;br /&gt;
		    $arDone[$idP] = 1;&lt;br /&gt;
		}&lt;br /&gt;
		WriteLn($txt.$msg);&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    foreach ($arRun as $idP =&amp;gt; $objP) {&lt;br /&gt;
		Write(&amp;#039;PROC: &amp;#039;.$objP-&amp;gt;NameFull());&lt;br /&gt;
		$arEx = $objP-&amp;gt;Execute(TRUE);	// FALSE = debug mode -- don&amp;#039;t actually write data&lt;br /&gt;
		WriteLn(&amp;#039; - &amp;#039;.$arEx[&amp;#039;text&amp;#039;]);&lt;br /&gt;
&lt;br /&gt;
		if (array_key_exists(&amp;#039;targ&amp;#039;,$arEx)) {&lt;br /&gt;
		    $arT = $arEx[&amp;#039;targ&amp;#039;];	// target tables updated&lt;br /&gt;
		    if (count($arT) &amp;gt; 0) {&lt;br /&gt;
    //		    WriteLn(&amp;#039; - updated:&amp;#039;);&lt;br /&gt;
			// get list of procs that supply those tables&lt;br /&gt;
			foreach ($arT as $idT =&amp;gt; $rowT) {&lt;br /&gt;
			    WriteLn(&amp;#039; - updated TABLE: [&amp;#039;.$idT.&amp;#039;] &amp;#039;.$rowT[&amp;#039;Name&amp;#039;]);&lt;br /&gt;
			    $rcT-&amp;gt;Values($rowT);&lt;br /&gt;
			    $arP = $rcT-&amp;gt;TargProcs();&lt;br /&gt;
			    if (is_array($arP)) {&lt;br /&gt;
				foreach ($arP as $dummy =&amp;gt; $rowP) {&lt;br /&gt;
				    WriteLn(&amp;#039; -- used by PROC: &amp;#039;.$rowP-&amp;gt;NameFull());&lt;br /&gt;
				}&lt;br /&gt;
				$arRunNext = ArrayJoin($arRunNext,$arP,TRUE,TRUE);	// replace = yes (probably n/a), append = yes&lt;br /&gt;
    //			    $isMore = TRUE;&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (array_key_exists($idP,$arRunNext)) {&lt;br /&gt;
		    WriteLn(&amp;#039; - removing &amp;#039;.$objP-&amp;gt;NameFull().&amp;#039; from next run list&amp;#039;);&lt;br /&gt;
		    unset($arRunNext[$idP]);&lt;br /&gt;
		    $txt = &amp;#039;&amp;#039;;&lt;br /&gt;
		    foreach ($arRunNext as $idP =&amp;gt; $objP) {&lt;br /&gt;
			$txt .= &amp;#039; &amp;#039;.$idP;&lt;br /&gt;
		    }&lt;br /&gt;
		    WriteLn(&amp;#039; - list is now:&amp;#039;.$txt);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	    }&lt;br /&gt;
	    // ultimately, this list may need to be sorted too:&lt;br /&gt;
	    $arRun = $arRunNext;&lt;br /&gt;
	    $isMore = Count($arRun) &amp;gt; 0;&lt;br /&gt;
/*&lt;br /&gt;
	    Write(&amp;#039;TO RUN NEXT:&amp;#039;);&lt;br /&gt;
	    foreach ($arRun as $id =&amp;gt; $objP) {&lt;br /&gt;
		Write(&amp;#039; &amp;#039;.$objP-&amp;gt;Name());&lt;br /&gt;
	    }&lt;br /&gt;
	    WriteLn();&lt;br /&gt;
*/&lt;br /&gt;
	} while ($isMore);&lt;br /&gt;
    }&lt;br /&gt;
/*&lt;br /&gt;
    protected function FindFlowSources(array $iSrce) {&lt;br /&gt;
	$arOut = array();&lt;br /&gt;
	foreach ($iSrce as $id =&amp;gt; $obj) {&lt;br /&gt;
//	    Write(&amp;#039; -- source ID=&amp;#039;.$id.&amp;#039; - &amp;#039;.$obj-&amp;gt;Value(&amp;#039;Name&amp;#039;));&lt;br /&gt;
	    if ($obj-&amp;gt;IsActive()) {&lt;br /&gt;
//		WriteLn(&amp;#039;&amp;#039;);&lt;br /&gt;
		$ar = $this-&amp;gt;FindRoots($obj);&lt;br /&gt;
		foreach ($ar as $id =&amp;gt; $row) {&lt;br /&gt;
		    if (!array_key_exists($id,$arOut)) {&lt;br /&gt;
			$arOut[$id] = $row;&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	    } else {&lt;br /&gt;
//		WriteLn(&amp;#039; - INACTIVE&amp;#039;);&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
	return $arOut;&lt;br /&gt;
    }&lt;br /&gt;
*/&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheTable extends clsCacheTable {&lt;br /&gt;
&lt;br /&gt;
// BOILERPLATE methods&lt;br /&gt;
&lt;br /&gt;
    public function AdminLink($iText=NULL,$iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminLink_Name($iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return $this-&amp;gt;AdminLink($this-&amp;gt;Value(&amp;#039;Name&amp;#039;),$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
    public function DocLink() {&lt;br /&gt;
	return $this-&amp;gt;Mgr()-&amp;gt;TableLinkDoc($this-&amp;gt;Value(&amp;#039;Name&amp;#039;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// ACTION methods&lt;br /&gt;
&lt;br /&gt;
    /*----&lt;br /&gt;
      ACTION: Run $this-&amp;gt;UpdateData() and display results&lt;br /&gt;
    */&lt;br /&gt;
    public function UpdateData_Verbose() {&lt;br /&gt;
	global $vgPage, $vgUserName;&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;#039;&amp;#039;;&lt;br /&gt;
	//$arRes = $this-&amp;gt;Update_byID($iID,$vgUserName.&amp;#039;: &amp;#039;.__METHOD__);&lt;br /&gt;
	$arRes = $this-&amp;gt;UpdateData($vgUserName.&amp;#039;: &amp;#039;.__METHOD__);&lt;br /&gt;
	$out .= $arRes[&amp;#039;msgs&amp;#039;];&lt;br /&gt;
	if (is_array($arRes[&amp;#039;proc&amp;#039;])) {&lt;br /&gt;
	    $arDone = $arRes[&amp;#039;proc&amp;#039;];&lt;br /&gt;
	    $out .= &amp;quot;\n===Update Procedures Run===\n&amp;quot;;&lt;br /&gt;
	    foreach($arDone AS $obj) {&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;quot;.$obj-&amp;gt;Value(&amp;#039;Name&amp;#039;);&lt;br /&gt;
	    }&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;&amp;lt;br&amp;gt;No procedures were executed.&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	if (is_array($arRes[&amp;#039;targ&amp;#039;])) {&lt;br /&gt;
	    $arDone = $arRes[&amp;#039;targ&amp;#039;];&lt;br /&gt;
	    $out .= &amp;quot;\n===Tables Updated===\n&amp;quot;;&lt;br /&gt;
	    foreach($arDone AS $id=&amp;gt;$row) {&lt;br /&gt;
		$out .= &amp;quot;\n* &amp;quot;.$row[&amp;#039;Name&amp;#039;];&lt;br /&gt;
	    }&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;&amp;lt;br&amp;gt;No tables were updated.&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// ADMIN DISPLAY methods&lt;br /&gt;
    public function AdminPage() {&lt;br /&gt;
	global $wgRequest;&lt;br /&gt;
	global $vgPage,$vgOut;&lt;br /&gt;
&lt;br /&gt;
	$vgPage-&amp;gt;UseWiki();&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;#039;==Table: &amp;#039;.$this-&amp;gt;Value(&amp;#039;Name&amp;#039;).&amp;quot;==\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;quot;&amp;#039;&amp;#039;&amp;#039;Note&amp;#039;&amp;#039;&amp;#039;: ADD and DELETE have not yet been tested, and they do not yet log changes.\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	$idTbl = $this-&amp;gt;Value(&amp;#039;ID&amp;#039;);&lt;br /&gt;
	$out .= &amp;#039;===Table Record===&amp;#039;;&lt;br /&gt;
	$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;ID&amp;#039;&amp;#039;&amp;#039;: $idTbl&amp;quot;;&lt;br /&gt;
	$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$this-&amp;gt;DocLink();&lt;br /&gt;
	$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Updated&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$this-&amp;gt;Value(&amp;#039;WhenUpdated&amp;#039;);&lt;br /&gt;
	$out .= &amp;quot;\n* &amp;#039;&amp;#039;&amp;#039;Notes&amp;#039;&amp;#039;&amp;#039;: &amp;quot;.$this-&amp;gt;Value(&amp;#039;Notes&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	$vgOut-&amp;gt;AddText($out); $out=&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// check for any form input (adding flows/procs)&lt;br /&gt;
	$doAddSrce = $wgRequest-&amp;gt;getBool(&amp;#039;btnAddSrce&amp;#039;);&lt;br /&gt;
	$doAddTarg = $wgRequest-&amp;gt;getBool(&amp;#039;btnAddTarg&amp;#039;);&lt;br /&gt;
	if ($doAddSrce || $doAddTarg) {&lt;br /&gt;
	    $idProc = $wgRequest-&amp;gt;getBool(&amp;#039;ID_Proc&amp;#039;);&lt;br /&gt;
	    $doWrite = $doAddSrce;	// if proc is a source, then it writes to this table&lt;br /&gt;
	    $txtNotes = $wgRequest-&amp;gt;getText(&amp;#039;Notes&amp;#039;);&lt;br /&gt;
	    $this-&amp;gt;Mgr()-&amp;gt;Flows-&amp;gt;Add($iProc,$this-&amp;gt;ID,$doWrite,$txtNotes);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$vgPage-&amp;gt;UseHTML();&lt;br /&gt;
&lt;br /&gt;
// SOURCES cell (left):&lt;br /&gt;
	$out .= $vgOut-&amp;gt;Header(&amp;#039;Table Sources&amp;#039;,3);&lt;br /&gt;
	$out .= $this-&amp;gt;AdminSources();&lt;br /&gt;
&lt;br /&gt;
// TARGETS cell (right):&lt;br /&gt;
	$out .= $vgOut-&amp;gt;Header(&amp;#039;Table Targets&amp;#039;,3);&lt;br /&gt;
	$out .= $this-&amp;gt;AdminTargets();&lt;br /&gt;
&lt;br /&gt;
	$vgOut-&amp;gt;AddText($out);&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminSources() {&lt;br /&gt;
	$objRows = $this-&amp;gt;Mgr()-&amp;gt;Sources($this-&amp;gt;KeyValue());&lt;br /&gt;
	return $objRows-&amp;gt;AdminList(&amp;#039;btnAddSrce&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminTargets() {&lt;br /&gt;
	$objRows = $this-&amp;gt;Mgr()-&amp;gt;Targets($this-&amp;gt;KeyValue());&lt;br /&gt;
	return $objRows-&amp;gt;AdminList(&amp;#039;btnAddTarg&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheProcs extends clsCacheProcs {&lt;br /&gt;
    public function __construct(clsCacheMgr $iMgr,$iName) {&lt;br /&gt;
	parent::__construct($iMgr,$iName);&lt;br /&gt;
	  $this-&amp;gt;ClassSng(&amp;#039;clsAdminCacheProc&amp;#039;);&lt;br /&gt;
	  $this-&amp;gt;ActionKey(&amp;#039;cache.proc&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheProc extends clsCacheProc {&lt;br /&gt;
    public function AdminLink($iText=NULL,$iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminLink_Name($iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return $this-&amp;gt;AdminLink($this-&amp;gt;Value(&amp;#039;Name&amp;#039;),$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
    public function DocLink() {&lt;br /&gt;
	return $this-&amp;gt;Mgr()-&amp;gt;ProcLinkDoc($this-&amp;gt;Value(&amp;#039;Name&amp;#039;));&lt;br /&gt;
    }&lt;br /&gt;
    public function AdminPage() {&lt;br /&gt;
	global $vgPage,$vgOut;&lt;br /&gt;
&lt;br /&gt;
	$vgPage-&amp;gt;UseHTML();&lt;br /&gt;
&lt;br /&gt;
	$out = $vgOut-&amp;gt;Header(&amp;#039;Procedure: &amp;#039;.$this-&amp;gt;Value(&amp;#039;Name&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;;&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;li&amp;gt; &amp;lt;b&amp;gt;ID&amp;lt;/b&amp;gt;: &amp;#039;.$this-&amp;gt;KeyValue();&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;li&amp;gt; &amp;lt;b&amp;gt;Name&amp;lt;/b&amp;gt;: &amp;#039;.$this-&amp;gt;DocLink();&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;li&amp;gt; &amp;lt;b&amp;gt;Active&amp;lt;/b&amp;gt;: &amp;#039;.NoYes($this-&amp;gt;Value(&amp;#039;isActive&amp;#039;));&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;li&amp;gt; &amp;lt;b&amp;gt;Clears&amp;lt;/b&amp;gt;: &amp;#039;.NoYes($this-&amp;gt;Value(&amp;#039;doesClear&amp;#039;));&lt;br /&gt;
	$out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	$vgOut-&amp;gt;AddText($out); $out=&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	$rcFlows = $this-&amp;gt;Mgr()-&amp;gt;Flow-&amp;gt;Data_forProc($this-&amp;gt;KeyValue());&lt;br /&gt;
	if ($rcFlows-&amp;gt;HasRows()) {&lt;br /&gt;
	    $ar = $rcFlows-&amp;gt;PoolMap();&lt;br /&gt;
/*&lt;br /&gt;
	    while ($rcFlows-&amp;gt;NextRow()) {&lt;br /&gt;
		$idTbl = $rcFlows-&amp;gt;Value(&amp;#039;ID_Table&amp;#039;);&lt;br /&gt;
		$objTbl = $this-&amp;gt;Mgr()-&amp;gt;Tables-&amp;gt;GetItem($idTbl);&lt;br /&gt;
		if ($rcFlows-&amp;gt;Value(&amp;#039;doWrite&amp;#039;)) {&lt;br /&gt;
		    // the proc writes to these tables&lt;br /&gt;
		    $arTarg[$idTbl] = $objTbl;&lt;br /&gt;
		} else {&lt;br /&gt;
		    // the proc reads from these tables&lt;br /&gt;
		    $arSrce[$idTbl] = $objTbl;&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
*/&lt;br /&gt;
	    $arTarg = $ar[&amp;#039;targ&amp;#039;];&lt;br /&gt;
	    $arSrce = $ar[&amp;#039;srce&amp;#039;];&lt;br /&gt;
	    $dtNewest = NULL;&lt;br /&gt;
	    $dtOldest = NULL;&lt;br /&gt;
&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;Header(&amp;#039;Source Tables&amp;#039;,3);&lt;br /&gt;
	    if (isset($arSrce)) {&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;;&lt;br /&gt;
		foreach ($arSrce as $id =&amp;gt; $objTbl) {&lt;br /&gt;
		    $dtThis = $objTbl-&amp;gt;Value(&amp;#039;WhenUpdated&amp;#039;);&lt;br /&gt;
		    if ($dtThis &amp;gt; $dtNewest) {&lt;br /&gt;
			$dtNewest = $dtThis;&lt;br /&gt;
		    }&lt;br /&gt;
		    $strTime = (is_null($dtThis)?&amp;#039;&amp;lt;i&amp;gt;never updated&amp;lt;/i&amp;gt;&amp;#039;:(&amp;#039;updated &amp;#039;.$dtThis));&lt;br /&gt;
		    $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;#039;.$objTbl-&amp;gt;AdminLink_Name().&amp;#039; - &amp;#039;.$strTime;&lt;br /&gt;
		}&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
	    } else {&lt;br /&gt;
		$out .= &amp;#039;No sources found.&amp;#039;;&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;Header(&amp;#039;Target Tables&amp;#039;,3);&lt;br /&gt;
	    if (isset($arTarg)) {&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;ul&amp;gt;&amp;#039;;&lt;br /&gt;
		foreach ($arTarg as $id =&amp;gt; $objTbl) {&lt;br /&gt;
		    $dtThis = $objTbl-&amp;gt;Value(&amp;#039;WhenUpdated&amp;#039;);&lt;br /&gt;
		    if (($dtThis &amp;lt; $dtOldest) || (is_null($dtOldest))) {&lt;br /&gt;
			$dtOldest = $dtThis;&lt;br /&gt;
		    }&lt;br /&gt;
		    $strTime = (is_null($dtThis)?&amp;#039;&amp;lt;i&amp;gt;never updated&amp;lt;/i&amp;gt;&amp;#039;:(&amp;#039;updated &amp;#039;.$dtThis));&lt;br /&gt;
		    $out .= &amp;#039;&amp;lt;li&amp;gt;&amp;#039;.$objTbl-&amp;gt;AdminLink_Name().&amp;#039; - &amp;#039;.$strTime;&lt;br /&gt;
		}&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;/ul&amp;gt;&amp;#039;;&lt;br /&gt;
	    } else {&lt;br /&gt;
		$out .= &amp;#039;No targets found.&amp;#039;;&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;Header(&amp;#039;Status&amp;#039;,3);&lt;br /&gt;
	    if ($dtOldest &amp;lt; $dtNewest) {&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;b&amp;gt;Update needed.&amp;lt;/b&amp;gt;&amp;#039;;&lt;br /&gt;
	    } else {&lt;br /&gt;
		$out .= &amp;#039;This table is up-to-date.&amp;#039;;&lt;br /&gt;
	    }&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;This procedure is not used.&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$vgOut-&amp;gt;AddText($out);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheFlows extends clsCacheFlows {&lt;br /&gt;
    public function __construct(clsCacheMgr $iMgr,$iName) {&lt;br /&gt;
	parent::__construct($iMgr,$iName);&lt;br /&gt;
	  $this-&amp;gt;ClassSng(&amp;#039;clsAdminCacheFlow&amp;#039;);&lt;br /&gt;
	  $this-&amp;gt;ActionKey(&amp;#039;cache.flow&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheFlow extends clsCacheFlow {&lt;br /&gt;
    public function AdminLink($iText=NULL,$iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
    /*----&lt;br /&gt;
      ACTION: Render administrative controls for the current dataset of flows&lt;br /&gt;
      INPUT: name of button for adding another row.&lt;br /&gt;
	If no name given, does not display button.&lt;br /&gt;
      RETURNS: formatted text using $vgOut&lt;br /&gt;
    */&lt;br /&gt;
    public function AdminList($iAddBtn=NULL) {&lt;br /&gt;
	global $vgOut;&lt;br /&gt;
&lt;br /&gt;
	$out = NULL;&lt;br /&gt;
	if ($this-&amp;gt;hasRows()) {&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TableOpen(&amp;#039;class=sortable&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblRowOpen(NULL,TRUE);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblCell(&amp;#039;Procedure&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblCell(&amp;#039;Action&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblCell(&amp;#039;notes&amp;#039;);&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TblRowShut();&lt;br /&gt;
&lt;br /&gt;
	    $doBtn = !is_null($iAddBtn);&lt;br /&gt;
&lt;br /&gt;
	    $objMgr = $this-&amp;gt;Mgr();&lt;br /&gt;
	    assert(&amp;#039;is_object($this-&amp;gt;objMgr)&amp;#039;);&lt;br /&gt;
	    $objProcs = $objMgr-&amp;gt;Procs;&lt;br /&gt;
	    $arProcs = NULL;&lt;br /&gt;
&lt;br /&gt;
	    $isOdd = TRUE;&lt;br /&gt;
	    while ($this-&amp;gt;NextRow()) {&lt;br /&gt;
		$row = $this-&amp;gt;Row;&lt;br /&gt;
&lt;br /&gt;
		$ftStyle = $isOdd?&amp;#039;background:#ffffff;&amp;#039;:&amp;#039;background:#eeeeee;&amp;#039;;&lt;br /&gt;
		$htStyle = &amp;#039;style=&amp;quot;&amp;#039;.$ftStyle.&amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
		$isOdd = !$isOdd;&lt;br /&gt;
&lt;br /&gt;
		$idProc = $this-&amp;gt;Value(&amp;#039;ID_Proc&amp;#039;);&lt;br /&gt;
		$objProc = $objProcs-&amp;gt;GetItem($idProc);&lt;br /&gt;
		$ftProc = $objProc-&amp;gt;AdminLink_Name();&lt;br /&gt;
&lt;br /&gt;
		// exclusion array for drop-down:&lt;br /&gt;
		$arProcs[$idProc] = TRUE;&lt;br /&gt;
&lt;br /&gt;
		$ftAct = $this-&amp;gt;AdminLink(&amp;#039;del&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		$ftNotes = $this-&amp;gt;Value(&amp;#039;Notes&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowOpen($htStyle);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell($ftProc);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell($ftAct);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell($ftNotes);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowShut();&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    // display a row for adding a proc&lt;br /&gt;
	    if ($doBtn) {&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;form method=POST&amp;gt;&amp;#039;;&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowOpen();&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell($objProcs-&amp;gt;DropDown(&amp;#039;ID_Proc&amp;#039;,NULL,$arProcs));&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell(&amp;#039;&amp;lt;input type=submit name=&amp;quot;&amp;#039;.$iAddBtn.&amp;#039;&amp;quot; value=&amp;quot;Add&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblCell(&amp;#039;&amp;lt;input name=&amp;quot;notes&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
		$out .= $vgOut-&amp;gt;TblRowShut();&lt;br /&gt;
		$out .= &amp;#039;&amp;lt;/form&amp;gt;&amp;#039;;&lt;br /&gt;
	    }&lt;br /&gt;
	    $out .= $vgOut-&amp;gt;TableShut();&lt;br /&gt;
	} else {&lt;br /&gt;
	    $out .= &amp;#039;none&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	return $out;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
class clsAdminCacheEvents extends clsCacheEvents {&lt;br /&gt;
    public function __construct(clsCacheMgr $iMgr,$iName) {&lt;br /&gt;
	parent::__construct($iMgr,$iName);&lt;br /&gt;
	  $this-&amp;gt;ClassSng(&amp;#039;clsAdminCacheEvent&amp;#039;);&lt;br /&gt;
	  $this-&amp;gt;ActionKey(&amp;#039;cache.event&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class clsAdminCacheEvent extends clsCacheEvent {&lt;br /&gt;
    public function AdminLink($iText=NULL,$iPopup=NULL,array $iarArgs=NULL) {&lt;br /&gt;
	return clsAdminData::_AdminLink($this,$iText,$iPopup,$iarArgs);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
</feed>