experimental exclusive lock on index: now you can try and mess around with multiple users (I'm NOT endorsing that, though!!)

This commit is contained in:
real_nowhereman 2010-08-16 08:24:55 +00:00
parent 62f35d502c
commit e8d5060f44

View File

@ -40,8 +40,12 @@
var $_chunksize = 30;
var $_keysize = 12;
var $_lock_file = null;
function entry_index() {
$this->_lock_file = CACHE_DIR.'bpt.lock';
$this->catlist = entry_categories_list();
// only main index s a SBPlus (string BPlus):
@ -79,6 +83,36 @@
}
function _lock_acquire($exclusive=true, $cat=0) {
if (file_exists($this->_lock_file)) {
trigger_error("Could not acquire write lock on INDEX. ".
"Didn't I told you FlatPress is not designed for concurrency, already? ;) ".
"Don't worry: your entry has been saved as draft!", E_USER_WARNING);
return false;
}
// simulates atomic write by writing to a file, then moving in place
$tmp = $this->_lock_file.".tmp";
if (io_write_file($tmp, 'dummy')) {
if (rename($tmp, $this->_lock_file)) {
return true;
}
}
return false;
}
function _lock_release($cat=0) {
if (file_exists($this->_lock_file)) {
return @unlink($this->_lock_file);
} else {
trigger_error("Lock file did not exist: ignoring (index was already unlocked.)", E_USER_NOTICE);
return 2;
}
}
function &get_index($cat=0) {
if (!is_numeric($cat))
trigger_error("CAT must be an integer ($cat was given)", E_USER_ERROR);
@ -105,6 +139,8 @@
$key = entry_idtokey($id);
$val = $entry['subject'];
if (!$this->_lock_acquire()) return false; // we're DOOMED!
$main =& $this->get_index();
$seek = null;
@ -159,13 +195,15 @@
}
}
return true;
return $this->_lock_release();
}
function delete($id, $entry) {
$key = entry_idtokey($id);
if (!$this->_lock_acquire()) return false; // we're DOOMED!
$main =& $this->get_index();
$main->delitem($key);
@ -179,87 +217,12 @@
}
}
return $this->_lock_release();
}
}
class _entry_indexer extends cache_filelister {
var $_varname = 'cache';
var $_cachefile = null;
var $_directory = CONTENT_DIR;
function entry_indexer() {
$this->_cachefile = CACHE_DIR . CACHE_FILE;
return parent::cache_filelister();
}
function _checkFile($directory, $file) {
$f = "$directory/$file";
if ( is_dir($f) && ctype_digit($file)) {
return 1;
}
if (fnmatch('entry*'.EXT, $file)) {
$id=basename($file,EXT);
$arr=entry_parse($id);
$this->addEntry($id, $arr);
return 0;
}
}
function addEntry($id, $arr) {
if ($arr) {
// do_action('publish_post', $id, $arr);
$this->_list[$id]=array(
'subject' => $arr['subject'],
'categories' =>
(
isset($arr['categories'])?
$arr['categories']
:
array()
)
);
}
}
function save() {
do_action('cache_save');
return parent::save();
}
function add($id, $val) {
$this->_list[$id]=array('subject' => $val['subject'],
'categories' =>
(isset($val['categories'])?
$val['categories'] : array()));
return $this->save();
}
function get($id) {
if (isset($this->_list[$id]))
return $this->_list[$id];
else {
//trigger_error("entry_lister: No such element \"$id\" in
//list", E_USER_WARNING);
return false;
}
}
}
class entry_archives extends fs_filelister {
var $_directory = CONTENT_DIR;