diff --git a/bibtexbrowser.php b/bibtexbrowser.php index eb01627..5607b14 100755 --- a/bibtexbrowser.php +++ b/bibtexbrowser.php @@ -379,12 +379,20 @@ define('BIBTEXBROWSER','v__MTIME__'); @error_reporting(/*pp4php:serl*/E_ALL/*lres*/); -/** sets the database of bibtex entries (object of type BibDataBase) +/** parses $_GET[Q_FILE] and puts the result (an object of type BibDataBase) * in $_GET[Q_DB] - * Uses a caching mechanism on disk for sake of performance + * See also zetDB() */ function setDB() { + $_GET[Q_DB] = zetDB($_GET[Q_FILE]); +} + +/** parses the $bibtex_filenames (usually semi-column separated) and returns an object of type BibDataBase + * See also setDB() + */ +function zetDB($bibtex_filenames) { + $db = null; // Check if magic_quotes_runtime is active if(get_magic_quotes_runtime()) { @@ -394,7 +402,7 @@ function setDB() { } // default bib file, if no file is specified in the query string. - if (!isset($_GET[Q_FILE]) || $_GET[Q_FILE] == "") { + if (!isset($bibtex_filenames) || $bibtex_filenames == "") { ?>
Congratulations! bibtexbrowser is correctly installed!
@@ -409,12 +417,12 @@ function setDB() { } // first does the bibfiles exist: - // $_GET[Q_FILE] can be urlencoded for instance if they contain slashes + // $bibtex_filenames can be urlencoded for instance if they contain slashes // so we decode it - $_GET[Q_FILE] = urldecode($_GET[Q_FILE]); + $bibtex_filenames = urldecode($bibtex_filenames); // ---------------------------- HANDLING unexistent files - foreach(explode(MULTIPLE_BIB_SEPARATOR, $_GET[Q_FILE]) as $bib) { + foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) { // this is a security protection if (BIBTEXBROWSER_LOCAL_BIB_ONLY && !file_exists($bib)) { @@ -431,7 +439,7 @@ function setDB() { // save bandwidth and server cpu // (imagine the number of requests from search engine bots...) $bib_is_unmodified = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ; - foreach(explode(MULTIPLE_BIB_SEPARATOR, $_GET[Q_FILE]) as $bib) { + foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) { $bib_is_unmodified = $bib_is_unmodified && (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>filemtime($bib)); @@ -446,22 +454,18 @@ function setDB() { // ---------------------------- HANDLING caching of compiled bibtex files // for sake of performance, once the bibtex file is parsed // we try to save a "compiled" in a txt file - $compiledbib = 'bibtexbrowser_'.md5($_GET[Q_FILE]).'.dat'; + $compiledbib = 'bibtexbrowser_'.md5($bibtex_filenames).'.dat'; $parse=false; - foreach(explode(MULTIPLE_BIB_SEPARATOR, $_GET[Q_FILE]) as $bib) { + foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) { // do we have a compiled version ? if (is_file($compiledbib) && is_readable($compiledbib)) { - // is it up to date ? wrt to the bib file and the script - // then upgrading with a new version of bibtexbrowser triggers a new compilation of the bib file - if (filemtime($bib)'; // then parsing the file $db = new BibDataBase(); - foreach(explode(MULTIPLE_BIB_SEPARATOR, $_GET[Q_FILE]) as $bib) { + foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) { $db->load($bib); } - $_GET[Q_DB]=$db; - - // are we able to save the compiled version ? - // note that the compiled version is saved in the current working directory - if ((!is_file($compiledbib) && is_writable(getcwd())) || (is_file($compiledbib) && is_writable($compiledbib)) ) { - // we can use file_put_contents - // but don't do it for compatibility with PHP 4.3 - $f = fopen($compiledbib,'w'); - //we use a lock to avoid that a call to bbtexbrowser made while we write the object loads an incorrect object - if (flock($f,LOCK_EX)) fwrite($f,serialize($_GET[Q_DB])); - fclose($f); - } - //else echo ''; - } // end parsing and saving + } + + // now we may update the database + foreach(explode(MULTIPLE_BIB_SEPARATOR, $bibtex_filenames) as $bib) { + // is it up to date ? wrt to the bib file and the script + // then upgrading with a new version of bibtexbrowser triggers a new compilation of the bib file + if (filemtime($bib)>filemtime($compiledbib) || filemtime(__FILE__)>filemtime($compiledbib)) { + $db->update($bib); + } + } + + // are we able to save the compiled version ? + // note that the compiled version is saved in the current working directory + if ((!is_file($compiledbib) && is_writable(getcwd())) || (is_file($compiledbib) && is_writable($compiledbib)) ) { + // we can use file_put_contents + // but don't do it for compatibility with PHP 4.3 + $f = fopen($compiledbib,'w'); + //we use a lock to avoid that a call to bibbtexbrowser made while we write the object loads an incorrect object + if (flock($f,LOCK_EX)) fwrite($f,serialize($db)); + fclose($f); + } // end saving the cached verions + //else echo ''; - return $parse; + return $db; } // end function setDB @@ -825,7 +837,10 @@ class BibDBBuilder { function endEntry($entrysource) { - // we can set the fulltext + // we add a timestamp + $this->currentEntry->setTimestamp(); + + // we set the fulltext $this->currentEntry->text = $entrysource; // we format the author names in a special field @@ -848,7 +863,7 @@ class BibDBBuilder { // we add it to the database else { - $this->builtdb[$this->currentEntry->getKey()] = $this->currentEntry; + $this->builtdb[$this->currentEntry->getKey()] = $this->currentEntry; } } } // end class BibDBBuilder @@ -994,6 +1009,9 @@ class BibEntry { /** The verbatim copy (i.e., whole text) of this bib entry. */ var $text; + /** A timestamp to trace when entries have been created */ + var $timestamp; + /** Creates an empty new bib entry. Each bib entry is assigned a unique * identification number. */ function BibEntry() { @@ -1002,6 +1020,15 @@ class BibEntry { $this->text =''; } + /** Adds timestamp to this object */ + function setTimestamp() { + $this->timestamp = time(); + } + /** Returns the timestamp of this object */ + function getTimestamp() { + return $this->timestamp; + } + /** Returns the type of this bib entry. */ function getType() { // strtolower is important to be case-insensitive @@ -2492,11 +2519,38 @@ class BibDataBase { /** Creates a new database by parsing bib entries from the given * file. */ function load($filename) { - $db = new BibDBBuilder($filename, $this->bibdb, $this->stringdb); - //print_r($parser); - $this->bibdb = $db->builtdb; + $this->update($filename); + } + + /** Updates a database (replaces the new bibtex entries by the most recent ones) */ + function update($filename) { + + $empty_array = array(); + $db = new BibDBBuilder($filename, $empty_array, $this->stringdb); + $this->stringdb = $db->stringdb; - //print_r($this->stringdb); + $result = $db->builtdb; + + + foreach ($result as $b) { + + // new entries: + if (!isset($this->bibdb[$b->getKey()])) { + $this->bibdb[$b->getKey()] = $b; + } + // update entry + else if (isset($this->bibdb[$b->getKey()]) && ($b->getText() !== $this->bibdb[$b->getKey()]->getText())) { + $this->bibdb[$b->getKey()] = $b; + } + } + + // some entries have been removed + foreach ($this->bibdb as $e) { + if (!isset($result[$e->getKey()])) { + unset($this->bibdb[$e->getKey()]); + } + } + } /** Creates a new empty database */ @@ -2931,7 +2985,7 @@ class RSSDisplay { - + class Dispatcher { /** this is the query */ @@ -3032,7 +3086,7 @@ class Dispatcher { function keywords() { $this->query[Q_TAG]=$_GET[Q_TAG]; } - function author() { + function author() { // Friday, October 29 2010 // changed fomr 'author' to '_author' // because '_author' is already formatted