90 lines
2.0 KiB
PHP
90 lines
2.0 KiB
PHP
<?php
|
|
namespace nur\sery\wip\app;
|
|
|
|
use nur\sery\cl;
|
|
use nur\sery\file\SharedFile;
|
|
use nur\sery\output\msg;
|
|
use nur\sery\php\time\DateTime;
|
|
|
|
/**
|
|
* Class LockFile: une classe qui permet à une application de verrouiller
|
|
* certaines actions
|
|
*/
|
|
class LockFile {
|
|
const NAME = null;
|
|
|
|
const TITLE = null;
|
|
|
|
function __construct($file, ?string $name=null, ?string $title=null) {
|
|
$this->file = new SharedFile($file);
|
|
$this->name = $name ?? static::NAME;
|
|
$this->title = $title ?? static::TITLE;
|
|
}
|
|
|
|
/** @var SharedFile */
|
|
protected $file;
|
|
|
|
/** @var ?string */
|
|
protected $name;
|
|
|
|
/** @var ?string */
|
|
protected $title;
|
|
|
|
protected function initData(): array {
|
|
return [
|
|
"name" => $this->name,
|
|
"title" => $this->title,
|
|
"locked" => false,
|
|
"date_lock" => null,
|
|
"date_release" => null,
|
|
];
|
|
}
|
|
|
|
function read(bool $close=true): array {
|
|
$data = $this->file->unserialize(null, $close);
|
|
if (!is_array($data)) $data = $this->initData();
|
|
return $data;
|
|
}
|
|
|
|
function isLocked(?array &$data=null): bool {
|
|
$data = $this->read();
|
|
return $data["locked"];
|
|
}
|
|
|
|
function warnIfLocked(?array $data=null): bool {
|
|
if ($data === null) $data = $this->read();
|
|
if ($data["locked"]) {
|
|
msg::warning("$data[name]: possède le verrou depuis $data[date_lock] -- $data[title]");
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function lock(?array &$data=null): bool {
|
|
$file = $this->file;
|
|
$data = $this->read(false);
|
|
if ($data["locked"]) {
|
|
$file->close();
|
|
return false;
|
|
} else {
|
|
$file->ftruncate();
|
|
$file->serialize(cl::merge($data, [
|
|
"locked" => true,
|
|
"date_lock" => new DateTime(),
|
|
"date_release" => null,
|
|
]));
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function release(?array &$data=null): void {
|
|
$file = $this->file;
|
|
$data = $this->read(false);
|
|
$file->ftruncate();
|
|
$file->serialize(cl::merge($data, [
|
|
"locked" => false,
|
|
"date_release" => new DateTime(),
|
|
]));
|
|
}
|
|
}
|