From: Geoffrey T. D. <da...@us...> - 2001-08-18 00:35:14
|
Update of /cvsroot/phpwiki/phpwiki/lib In directory usw-pr-cvs1:/tmp/cvs-serv8120/lib Modified Files: Tag: release-1_2-branch db_filesystem.php dbalib.php dbmlib.php mysql.php pgsql.php Added Files: Tag: release-1_2-branch backlinks.php Log Message: Added real back-link searches. The pgsql and msql backends are completely untested at this point, but they "should work". (I.e.: they're probably broken now.) ***** Error reading new file: [Errno 2] No such file or directory: 'backlinks.php' Index: db_filesystem.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/db_filesystem.php,v retrieving revision 1.4 retrieving revision 1.4.2.1 diff -C2 -r1.4 -r1.4.2.1 *** db_filesystem.php 2001/01/01 23:18:46 1.4 --- db_filesystem.php 2001/08/18 00:35:10 1.4.2.1 *************** *** 13,16 **** --- 13,19 ---- InitFullSearch($dbi, $search) FullSearchNextMatch($dbi, $res) + MakeBackLinkSearchRegexp($pagename) + InitBackLinkSearch($dbi, $pagename) + BackLinkSearchNextMatch($dbi, &$pos) IncreaseHitCount($dbi, $pagename) GetHitCount($dbi, $pagename) *************** *** 152,155 **** --- 155,207 ---- // new database features + // Compute PCRE suitable for searching for links to the given page. + function MakeBackLinkSearchRegexp($pagename) { + global $WikiNameRegexp; + + // Note that in (at least some) PHP 3.x's, preg_quote only takes + // (at most) one argument. Also it doesn't quote '/'s. + // It does quote '='s, so we'll use that for the delimeter. + $quoted_pagename = preg_quote($pagename); + if (preg_match("/^$WikiNameRegexp\$/", $pagename)) { + # FIXME: This may need modification for non-standard (non-english) $WikiNameRegexp. + return "=(?<![A-Za-z0-9!])$quoted_pagename(?![A-Za-z0-9])="; + } + else { + // Note from author: Sorry. :-/ + return ( '=' + . '(?<!\[)\[(?!\[)' // Single, isolated '[' + . '([^]|]*\|)?' // Optional stuff followed by '|' + . '\s*' // Optional space + . $quoted_pagename // Pagename + . '\s*\]=' ); // Optional space, followed by ']' + // FIXME: the above regexp is still not quite right. + // Consider the text: " [ [ test page ]". This is a link to a page + // named '[ test page'. The above regexp will recognize this + // as a link either to '[ test page' (good) or to 'test page' (wrong). + } + } + + // setup for back-link search + function InitBackLinkSearch($dbi, $pagename) { + return InitTitleSearch($dbi, MakeBackLinkSearchRegexp($pagename)); + } + + // iterating through back-links + function BackLinkSearchNextMatch($dbi, &$pos) { + global $WikiPageStore; + while (list($key, $page) = each($pos['data'])) { + $pagedata = RetrievePage($dbi, $page, $WikiPageStore); + printf("Page: '%s' => '%s'<br>\n", + htmlspecialchars($page), + htmlspecialchars($pagedata)); + + while (list($i, $line) = each($pagedata['content'])) { + if (preg_match($pos['search'], $line)) + return $page; + } + } + return 0; + } + function IncreaseHitCount($dbi, $pagename) { return; *************** *** 226,234 **** function GetAllWikiPagenames($dbi) { $namelist = array(); ! $d = opendir($dbi); ! $curr = 0; ! while($entry = readdir($d)) { ! $namelist[$curr++] = $entry; ! } return $namelist; --- 278,286 ---- function GetAllWikiPagenames($dbi) { $namelist = array(); ! $d = opendir($dbi); ! while($entry = readdir($d)) { ! if ($entry != '.' && $entry != '..') ! $namelist[] = $entry; ! } return $namelist; Index: dbalib.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/dbalib.php,v retrieving revision 1.2 retrieving revision 1.2.2.1 diff -C2 -r1.2 -r1.2.2.1 *** dbalib.php 2001/01/31 02:01:27 1.2 --- dbalib.php 2001/08/18 00:35:10 1.2.2.1 *************** *** 19,22 **** --- 19,25 ---- InitFullSearch($dbi, $search) FullSearchNextMatch($dbi, &$pos) + MakeBackLinkSearchRegexp($pagename) + InitBackLinkSearch($dbi, $pagename) + BackLinkSearchNextMatch($dbi, &$pos) IncreaseHitCount($dbi, $pagename) GetHitCount($dbi, $pagename) *************** *** 173,177 **** --- 176,227 ---- // new database features + // Compute PCRE suitable for searching for links to the given page. + function MakeBackLinkSearchRegexp($pagename) { + global $WikiNameRegexp; + + $quoted_pagename = preg_quote($pagename, '/'); + if (preg_match("/^$WikiNameRegexp\$/", $pagename)) { + // FIXME: This may need modification for non-standard (non-english) $WikiNameRegexp. + return "/(?<![A-Za-z0-9!])$quoted_pagename(?![A-Za-z0-9])/"; + } + else { + // Note from author: Sorry. :-/ + return ( '/' + . '(?<!\[)\[(?!\[)' // Single, isolated '[' + . '([^]|]*\|)?' // Optional stuff followed by '|' + . '\s*' // Optional space + . $quoted_pagename // Pagename + . '\s*\]/' ); // Optional space, followed by ']' + // FIXME: the above regexp is still not quite right. + // Consider the text: " [ [ test page ]". This is a link to a page + // named '[ test page'. The above regexp will recognize this + // as a link either to '[ test page' (good) or to 'test page' (wrong). + } + } + + // setup for back-link search + function InitBackLinkSearch($dbi, $pagename) { + return InitTitleSearch($dbi, MakeBackLinkSearchRegexp($pagename)); + } + // iterating through back-links + function BackLinkSearchNextMatch($dbi, &$pos) { + while ($pos['key']) { + $page = $pos['key']; + $pos['key'] = dba_nextkey($dbi['wiki']); + + $rawdata = dba_fetch($page, $dbi['wiki']); + if ( ! preg_match($pos['search'], $rawdata)) + continue; + + $pagedata = unserialize(UnPadSerializedData($rawdata)); + while (list($i, $line) = each($pagedata['content'])) { + if (preg_match($pos['search'], $line)) + return $page; + } + } + return 0; + } + function IncreaseHitCount($dbi, $pagename) { *************** *** 201,205 **** } - function InitMostPopular($dbi, $limit) { // iterate through the whole dbm file for hit counts --- 251,254 ---- *************** *** 255,257 **** } ! ?> \ No newline at end of file --- 304,306 ---- } ! ?> Index: dbmlib.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/dbmlib.php,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -C2 -r1.7 -r1.7.2.1 *** dbmlib.php 2001/01/31 03:11:25 1.7 --- dbmlib.php 2001/08/18 00:35:10 1.7.2.1 *************** *** 16,19 **** --- 16,22 ---- InitFullSearch($dbi, $search) FullSearchNextMatch($dbi, $res) + MakeBackLinkSearchRegexp($pagename) + InitBackLinkSearch($dbi, $pagename) + BackLinkSearchNextMatch($dbi, &$pos) IncreaseHitCount($dbi, $pagename) GetHitCount($dbi, $pagename) *************** *** 210,213 **** --- 213,267 ---- //////////////////////// // new database features + + // Compute PCRE suitable for searching for links to the given page. + function MakeBackLinkSearchRegexp($pagename) { + global $WikiNameRegexp; + + // Note that in (at least some) PHP 3.x's, preg_quote only takes + // (at most) one argument. Also it doesn't quote '/'s. + // It does quote '='s, so we'll use that for the delimeter. + $quoted_pagename = preg_quote($pagename); + if (preg_match("/^$WikiNameRegexp\$/", $pagename)) { + # FIXME: This may need modification for non-standard (non-english) $WikiNameRegexp. + return "=(?<![A-Za-z0-9!])$quoted_pagename(?![A-Za-z0-9])="; + } + else { + // Note from author: Sorry. :-/ + return ( '=' + . '(?<!\[)\[(?!\[)' // Single, isolated '[' + . '([^]|]*\|)?' // Optional stuff followed by '|' + . '\s*' // Optional space + . $quoted_pagename // Pagename + . '\s*\]=' ); // Optional space, followed by ']' + // FIXME: the above regexp is still not quite right. + // Consider the text: " [ [ test page ]". This is a link to a page + // named '[ test page'. The above regexp will recognize this + // as a link either to '[ test page' (good) or to 'test page' (wrong). + } + } + + // setup for back-link search + function InitBackLinkSearch($dbi, $pagename) { + return InitTitleSearch($dbi, MakeBackLinkSearchRegexp($pagename)); + } + + // iterating through back-links + function BackLinkSearchNextMatch($dbi, &$pos) { + while ($pos['key']) { + $page = $pos['key']; + $pos['key'] = dbmnextkey($dbi['wiki'], $pos['key']); + + $rawdata = dbmfetch($dbi['wiki'], $page); + if ( ! preg_match($pos['search'], $rawdata)) + continue; + + $pagedata = unserialize(UnPadSerializedData($rawdata)); + while (list($i, $line) = each($pagedata['content'])) { + if (preg_match($pos['search'], $line)) + return $page; + } + } + return 0; + } function IncreaseHitCount($dbi, $pagename) { Index: mysql.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/mysql.php,v retrieving revision 1.10 retrieving revision 1.10.2.1 diff -C2 -r1.10 -r1.10.2.1 *** mysql.php 2001/01/04 18:37:56 1.10 --- mysql.php 2001/08/18 00:35:10 1.10.2.1 *************** *** 20,23 **** --- 20,25 ---- InitFullSearch($dbi, $search) FullSearchNextMatch($dbi, $res) + InitBackLinkSearch($dbi, $pagename) + BackLinkSearchNextMatch($dbi, &$pos) InitMostPopular($dbi, $limit) MostPopularNextMatch($dbi, $res) *************** *** 262,265 **** --- 264,291 ---- } } + + // setup for back-link search + function InitBackLinkSearch($dbi, $pagename) { + global $WikiLinksStore; + + $topage = addslashes($pagename); + $res = mysql_query( "SELECT DISTINCT frompage FROM $WikiLinksStore" + . " WHERE topage='$topage'" + . " ORDER BY frompage", + $dbi["dbc"]); + return $res; + } + + + // iterating through database + function BackLinkSearchNextMatch($dbi, $res) { + if($a = mysql_fetch_row($res)) { + return $a[0]; + } + else { + return 0; + } + } + function InitMostPopular($dbi, $limit) { Index: pgsql.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/pgsql.php,v retrieving revision 1.4 retrieving revision 1.4.2.1 diff -C2 -r1.4 -r1.4.2.1 *** pgsql.php 2000/11/02 04:23:59 1.4 --- pgsql.php 2001/08/18 00:35:10 1.4.2.1 *************** *** 16,19 **** --- 16,21 ---- InitFullSearch($dbi, $search) FullSearchNextMatch($dbi, $res) + InitBackLinkSearch($dbi, $pagename) + BackLinkSearchNextMatch($dbi, &$pos) IncreaseHitCount($dbi, $pagename) GetHitCount($dbi, $pagename) *************** *** 289,292 **** --- 291,317 ---- //////////////////////// // new database features + + // setup for back-link search + function InitBackLinkSearch($dbi, $pagename) { + global $WikiLinksPageStore; + + $topage = addslashes($pagename); + $res['res'] = pg_exec( $dbi["dbc"], ( "SELECT DISTINCT frompage FROM $WikiLinksPageStore" + . " WHERE topage='$topage'" + . " ORDER BY frompage" )); + $res['row'] = 0; + return $res; + } + + + // iterating through database + function BackLinkSearchNextMatch($dbi, $res) { + if($a = @pg_fetch_row($res['res'], $res['row']++)) { + return $a[0]; + } + else { + return 0; + } + } |