From: Steve W. <wai...@us...> - 2001-01-09 19:02:36
|
Update of /cvsroot/phpwiki/phpwiki/lib In directory usw-pr-cvs1:/tmp/cvs-serv28892 Modified Files: dbmlib.php Log Message: Reverted to version 1.4; there is a bug in Jan Hidders' patch for dbmlib. It causes a stack overflow in stdlib.php line 318. Index: dbmlib.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/dbmlib.php,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** dbmlib.php 2000/12/15 03:11:41 1.5 --- dbmlib.php 2001/01/09 19:02:52 1.6 *************** *** 6,23 **** Database functions: ! OpenDataBase($table) ! CloseDataBase($dbi) ! RetrievePage($dbi, $pagename, $pagestore) ! InsertPage($dbi, $pagename, $pagehash) SaveCopyToArchive($dbi, $pagename, $pagehash) ! IsWikiPage($dbi, $pagename) ! InitTitleSearch($dbi, $search) ! TitleSearchNextMatch($dbi, $res) ! InitFullSearch($dbi, $search) ! FullSearchNextMatch($dbi, $res) ! IncreaseHitCount($dbi, $pagename) ! GetHitCount($dbi, $pagename) ! InitMostPopular($dbi, $limit) ! MostPopularNextMatch($dbi, $res) */ --- 6,27 ---- Database functions: ! OpenDataBase($dbname) ! CloseDataBase($dbi) ! PadSerializedData($data) ! UnPadSerializedData($data) ! RetrievePage($dbi, $pagename, $pagestore) ! InsertPage($dbi, $pagename, $pagehash) SaveCopyToArchive($dbi, $pagename, $pagehash) ! IsWikiPage($dbi, $pagename) ! IsInArchive($dbi, $pagename) ! InitTitleSearch($dbi, $search) ! TitleSearchNextMatch($dbi, &$pos) ! InitFullSearch($dbi, $search) ! FullSearchNextMatch($dbi, &$pos) ! IncreaseHitCount($dbi, $pagename) ! GetHitCount($dbi, $pagename) ! InitMostPopular($dbi, $limit) ! MostPopularNextMatch($dbi, &$res) ! GetAllWikiPagenames($dbi) */ *************** *** 88,101 **** // Either insert or replace a key/value (a page) function InsertPage($dbi, $pagename, $pagehash) { - - global $WikiPageStore; - - $linklist = ExtractWikiPageLinks($pagehash['content']); - $SetWikiPageLinks($dbi, $pagename, $linklist); - $pagedata = PadSerializedData(serialize($pagehash)); ! if (dbminsert($dbi[$WikiPageStore], $pagename, $pagedata)) { ! if (dbmreplace($dbi[$WikiPageStore], $pagename, $pagedata)) { ExitWiki("Error inserting page '$pagename'"); } --- 92,99 ---- // Either insert or replace a key/value (a page) function InsertPage($dbi, $pagename, $pagehash) { $pagedata = PadSerializedData(serialize($pagehash)); ! if (dbminsert($dbi['wiki'], $pagename, $pagedata)) { ! if (dbmreplace($dbi['wiki'], $pagename, $pagedata)) { ExitWiki("Error inserting page '$pagename'"); } *************** *** 128,163 **** - function RemovePage($dbi, $pagename) { - - dbmdelete($dbi['wiki'], $pagename); // report error if this fails? - dbmdelete($dbi['archive'], $pagename); // no error if this fails - dbmdelete($dbi['hitcount'], $pagename); // no error if this fails - - $linkinfo = RetrievePage($dbi, $pagename, 'wikilinks'); - - // remove page from fromlinks of pages it had links to - if (is_array($linkinfo)) { // page exists? - $tolinks = $linkinfo['tolinks']; - reset($tolinks); - while (list($tolink, $dummy) = each($tolinks)) { - $tolinkinfo = RetrievePage($dbi, $tolink, 'wikilinks'); - if (is_array($tolinkinfo)) { // page found? - $oldFromlinks = $tolinkinfo['fromlinks']; - $tolinkinfo['fromlinks'] = array(); // erase fromlinks - reset($oldFromlinks); - while (list($fromlink, $dummy) = each($oldFromlinks)) { - if ($fromlink != $pagename) // not to be erased? - $tolinkinfo['fromlinks'][$fromlink] = 1; // put link back - } // put link info back in DBM file - InsertPage($dbi, $tolink, $tolinkinfo, 'wikilinks'); - } - } - - // remove page itself - dbmdelete($dbi['wikilinks'], $pagename); - } - } - - // setup for title-search function InitTitleSearch($dbi, $search) { --- 126,129 ---- *************** *** 168,172 **** } - // iterating through database function TitleSearchNextMatch($dbi, &$pos) { --- 134,137 ---- *************** *** 182,186 **** } - // setup for full-text search function InitFullSearch($dbi, $search) { --- 147,150 ---- *************** *** 188,192 **** } - //iterating through database function FullSearchNextMatch($dbi, &$pos) { --- 152,155 ---- *************** *** 207,214 **** } - //////////////////////// // new database features function IncreaseHitCount($dbi, $pagename) { --- 170,177 ---- } //////////////////////// // new database features + function IncreaseHitCount($dbi, $pagename) { *************** *** 221,224 **** --- 184,188 ---- } else { // add it, set the hit count to one + // echo "adding $pagename to hitcount...<br>\n"; $count = 1; dbminsert($dbi['hitcount'], $pagename, $count); *************** *** 226,230 **** } - function GetHitCount($dbi, $pagename) { --- 190,193 ---- *************** *** 244,290 **** // n..$limit results - // Because sorting all the pages may be a lot of work - // we only get the top $limit. A page is only added if it's score is - // higher than the lowest score in the list. If the list is full then - // one of the pages with the lowest scores is removed. - $pagename = dbmfirstkey($dbi['hitcount']); ! $score = dbmfetch($dbi['hitcount'], $pagename); ! $res = array($pagename => (int) $score); ! $lowest = $score; while ($pagename = dbmnextkey($dbi['hitcount'], $pagename)) { ! $score = dbmfetch($dbi['hitcount'], $pagename); ! if (count($res) < $limit) { // room left in $res? ! if ($score < $lowest) ! $lowest = $score; ! $res[$pagename] = (int) $score; // add page to $res ! } elseif ($score > $lowest) { ! $oldres = $res; // save old result ! $res = array(); ! $removed = 0; // nothing removed yet ! $newlowest = $score; // new lowest score ! $res[$pagename] = (int) $score; // add page to $res ! reset($oldres); ! while(list($pname, $pscore) = each($oldres)) { ! if (!$removed and ($pscore = $lowest)) ! $removed = 1; // don't copy this entry ! else { ! $res[$pname] = (int) $pscore; ! if ($pscore < $newlowest) ! $newlowest = $pscore; ! } ! } ! $lowest = $newlowest; ! } } ! ! arsort($res); // sort ! reset($res); ! return($res); } - function MostPopularNextMatch($dbi, &$res) { --- 207,222 ---- // n..$limit results $pagename = dbmfirstkey($dbi['hitcount']); ! $res[$pagename] = dbmfetch($dbi['hitcount'], $pagename); while ($pagename = dbmnextkey($dbi['hitcount'], $pagename)) { ! $res[$pagename] = dbmfetch($dbi['hitcount'], $pagename); ! //echo "got $pagename with value " . $res[$pagename] . "<br>\n"; } ! ! arsort($res); return($res); } function MostPopularNextMatch($dbi, &$res) { *************** *** 292,300 **** --- 224,238 ---- // and 'pagename' as the keys + if (count($res) == 0) + return 0; + if (list($pagename, $hits) = each($res)) { + //echo "most popular next match called<br>\n"; + //echo "got $pagename, $hits back<br>\n"; $nextpage = array( "hits" => $hits, "pagename" => $pagename ); + // $dbm_mostpopular_cntr++; return $nextpage; } else { *************** *** 303,307 **** } - function GetAllWikiPagenames($dbi) { $namelist = array(); --- 241,244 ---- *************** *** 316,482 **** return $namelist; - } - - - //////////////////////////////////////////// - // functionality for the wikilinks DBM file - - // format of the 'wikilinks' DBM file : - // pagename => - // { tolinks => ( pagename => 1}, fromlinks => { pagename => 1 } } - - // takes a page name, returns array of scored incoming and outgoing links - function GetWikiPageLinks($dbi, $pagename) { - - $linkinfo = RetrievePage($dbi, $pagename, 'wikilinks'); - if (is_array($linkinfo)) { // page exists? - $tolinks = $linkinfo['tolinks']; // outgoing links - $fromlinks = $linkinfo['fromlinks']; // incoming links - } else { // new page, but pages may already point to it - // create info for page - $tolinks = array(); - $fromlinks = array(); - // look up pages that link to $pagename - $pname = dbmfirstkey($dbi['wikilinks']); - while ($pname) { - $linkinfo = RetrievePage($dbi, $pname, 'wikilinks'); - if ($linkinfo['tolinks'][$pagename]) // $pname links to $pagename? - $fromlinks[$pname] = 1; - $pname = dbmnextkey($dbi['wikilinks'], $pname); - } - } - - // get and sort the outgoing links - $outlinks = array(); - reset($tolinks); // look up scores for tolinks - while(list($tolink, $dummy) = each($tolinks)) { - $toPage = RetrievePage($dbi, $tolink, 'wikilinks'); - if (is_array($toPage)) // link to internal page? - $outlinks[$tolink] = count($toPage['fromlinks']); - } - arsort($outlinks); // sort on score - $links['out'] = array(); - reset($outlinks); // convert to right format - while(list($link, $score) = each($outlinks)) - $links['out'][] = array($link, $score); - - // get and sort the incoming links - $inlinks = array(); - reset($fromlinks); // look up scores for fromlinks - while(list($fromlink, $dummy) = each($fromlinks)) { - $fromPage = RetrievePage($dbi, $fromlink, 'wikilinks'); - $inlinks[$fromlink] = count($fromPage['fromlinks']); - } - arsort($inlinks); // sort on score - $links['in'] = array(); - reset($inlinks); // convert to right format - while(list($link, $score) = each($inlinks)) - $links['in'][] = array($link, $score); - - // sort all the incoming and outgoing links - $allLinks = $outlinks; // copy the outlinks - reset($inlinks); // add the inlinks - while(list($key, $value) = each($inlinks)) - $allLinks[$key] = $value; - reset($allLinks); // lookup hits - while(list($key, $value) = each($allLinks)) - $allLinks[$key] = (int) dbmfetch($dbi['hitcount'], $key); - arsort($allLinks); // sort on hits - $links['popular'] = array(); - reset($allLinks); // convert to right format - while(list($link, $hits) = each($allLinks)) - $links['popular'][] = array($link, $hits); - - return $links; - } - - - // takes page name, list of links it contains - // the $linklist is an array where the keys are the page names - function SetWikiPageLinks($dbi, $pagename, $linklist) { - - $cache = array(); - - // Phase 1: fetch the relevant pairs from 'wikilinks' into $cache - // --------------------------------------------------------------- - - // first the info for $pagename - $linkinfo = RetrievePage($dbi, $pagename, 'wikilinks'); - if (is_array($linkinfo)) // page exists? - $cache[$pagename] = $linkinfo; - else { - // create info for page - $cache[$pagename] = array( 'fromlinks' => array(), - 'tolinks' => array() - ); - // look up pages that link to $pagename - $pname = dbmfirstkey($dbi['wikilinks']); - while ($pname) { - $linkinfo = RetrievePage($dbi, $pname, 'wikilinks'); - if ($linkinfo['tolinks'][$pagename]) - $cache[$pagename]['fromlinks'][$pname] = 1; - $pname = dbmnextkey($dbi['wikilinks'], $pname); - } - } - - // then the info for the pages that $pagename used to point to - $oldTolinks = $cache[$pagename]['tolinks']; - reset($oldTolinks); - while (list($link, $dummy) = each($oldTolinks)) { - $linkinfo = RetrievePage($dbi, $link, 'wikilinks'); - if (is_array($linkinfo)) - $cache[$link] = $linkinfo; - } - - // finally the info for the pages that $pagename will point to - reset($linklist); - while (list($link, $dummy) = each($linklist)) { - $linkinfo = RetrievePage($dbi, $link, 'wikilinks'); - if (is_array($linkinfo)) - $cache[$link] = $linkinfo; - } - - // Phase 2: delete the old links - // --------------------------------------------------------------- - - // delete the old tolinks for $pagename - // $cache[$pagename]['tolinks'] = array(); - // (overwritten anyway in Phase 3) - - // remove $pagename from the fromlinks of pages in $oldTolinks - - reset($oldTolinks); - while (list($oldTolink, $dummy) = each($oldTolinks)) { - if ($cache[$oldTolink]) { // links to existing page? - $oldFromlinks = $cache[$oldTolink]['fromlinks']; - $cache[$oldTolink]['fromlinks'] = array(); // erase fromlinks - reset($oldFromlinks); // comp. new fr.links - while (list($fromlink, $dummy) = each($oldFromlinks)) { - if ($fromlink != $pagename) - $cache[$oldTolink]['fromlinks'][$fromlink] = 1; - } - } - } - - // Phase 3: add the new links - // --------------------------------------------------------------- - - // set the new tolinks for $pagename - $cache[$pagename]['tolinks'] = $linklist; - - // add $pagename to the fromlinks of pages in $linklist - reset($linklist); - while (list($link, $dummy) = each($linklist)) { - if ($cache[$link]) // existing page? - $cache[$link]['fromlinks'][$pagename] = 1; - } - - // Phase 4: write $cache back to 'wikilinks' - // --------------------------------------------------------------- - - reset($cache); - while (list($link,$fromAndTolinks) = each($cache)) - InsertPage($dbi, $link, $fromAndTolinks, 'wikilinks'); - } --- 253,256 ---- |