SourceForge logo
SourceForge logo
Menu

phpwiki-checkins

From: Steve W. <wai...@us...> - 2001年01月31日 03:11:29
Update of /cvsroot/phpwiki/phpwiki/lib
In directory usw-pr-cvs1:/tmp/cvs-serv32083
Modified Files:
	dbmlib.php 
Log Message:
Going back to version 1.5, this time with the signature Jan Hidder
used for InsertPage() that I removed, thus causing a bug. It feels
slower now though.
Index: dbmlib.php
===================================================================
RCS file: /cvsroot/phpwiki/phpwiki/lib/dbmlib.php,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** dbmlib.php	2001年01月09日 19:02:52	1.6
--- dbmlib.php	2001年01月31日 03:11:25	1.7
***************
*** 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) 
 */
 
--- 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)
 */
 
***************
*** 91,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'");
 }
--- 87,101 ----
 
 // Either insert or replace a key/value (a page)
! function InsertPage($dbi, $pagename, $pagehash, $pagestore='wiki') {
! 
! if ($pagestore == 'wiki') { // a bit of a hack
! $linklist = ExtractWikiPageLinks($pagehash['content']);
! SetWikiPageLinks($dbi, $pagename, $linklist);
! }
! 
 $pagedata = PadSerializedData(serialize($pagehash));
 
! if (dbminsert($dbi[$pagestore], $pagename, $pagedata)) {
! if (dbmreplace($dbi[$pagestore], $pagename, $pagedata)) {
 ExitWiki("Error inserting page '$pagename'");
 }
***************
*** 102,106 ****
 
 
! // for archiving pages to a seperate dbm
 function SaveCopyToArchive($dbi, $pagename, $pagehash) {
 global $ArchivePageStore;
--- 104,108 ----
 
 
! // for archiving pages to a separate dbm
 function SaveCopyToArchive($dbi, $pagename, $pagehash) {
 global $ArchivePageStore;
***************
*** 126,129 ****
--- 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) {
***************
*** 134,137 ****
--- 168,172 ----
 }
 
+ 
 // iterating through database
 function TitleSearchNextMatch($dbi, &$pos) {
***************
*** 147,150 ****
--- 182,186 ----
 }
 
+ 
 // setup for full-text search
 function InitFullSearch($dbi, $search) {
***************
*** 152,155 ****
--- 188,192 ----
 }
 
+ 
 //iterating through database
 function FullSearchNextMatch($dbi, &$pos) {
***************
*** 170,177 ****
 }
 
 ////////////////////////
 // new database features
 
- 
 function IncreaseHitCount($dbi, $pagename) {
 
--- 207,214 ----
 }
 
+ 
 ////////////////////////
 // new database features
 
 function IncreaseHitCount($dbi, $pagename) {
 
***************
*** 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);
--- 221,224 ----
***************
*** 190,193 ****
--- 226,230 ----
 }
 
+ 
 function GetHitCount($dbi, $pagename) {
 
***************
*** 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) {
 
--- 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) {
 
***************
*** 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 {
--- 292,300 ----
***************
*** 241,244 ****
--- 303,307 ----
 } 
 
+ 
 function GetAllWikiPagenames($dbi) {
 $namelist = array();
***************
*** 253,256 ****
--- 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');
+ 
 }
 
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /