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