|
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 ----
|