maintenir une table des canaux de données
This commit is contained in:
parent
41bba56895
commit
f3c07d7665
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PhpTestFrameworkVersionCache">
|
||||||
|
<tools_cache>
|
||||||
|
<tool tool_name="PHPUnit">
|
||||||
|
<cache>
|
||||||
|
<versions>
|
||||||
|
<info id="Local/vendor/autoload.php" version="9.6.20" />
|
||||||
|
</versions>
|
||||||
|
</cache>
|
||||||
|
</tool>
|
||||||
|
</tools_cache>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -19,12 +19,15 @@ Application::run(new class extends Application {
|
||||||
"merge" => parent::ARGS,
|
"merge" => parent::ARGS,
|
||||||
"purpose" => "gestion d'un capacitor sqlite",
|
"purpose" => "gestion d'un capacitor sqlite",
|
||||||
"usage" => [
|
"usage" => [
|
||||||
"-f DBFILE -c CHANNEL [--query] key=value...",
|
"-f DBFILE -n CHANNEL [--query] key=value...",
|
||||||
"-f DBFILE -c CHANNEL --sql-create",
|
"-f DBFILE -n CHANNEL --sql-create",
|
||||||
],
|
],
|
||||||
["-f", "--dbfile", "args" => 1,
|
["-f", "--dbfile", "args" => 1,
|
||||||
"help" => "chemin vers la base de données",
|
"help" => "chemin vers la base de données",
|
||||||
],
|
],
|
||||||
|
["-n", "--name", "args" => 1,
|
||||||
|
"help" => "nom du canal de données. table-name et channel-class sont chargés depuis la base de données",
|
||||||
|
],
|
||||||
["-t", "--table-name", "args" => 1,
|
["-t", "--table-name", "args" => 1,
|
||||||
"help" => "nom de la table porteuse du canal de données",
|
"help" => "nom de la table porteuse du canal de données",
|
||||||
],
|
],
|
||||||
|
@ -41,6 +44,8 @@ Application::run(new class extends Application {
|
||||||
|
|
||||||
protected ?string $dbfile = null;
|
protected ?string $dbfile = null;
|
||||||
|
|
||||||
|
protected ?string $name = null;
|
||||||
|
|
||||||
protected ?string $tableName = null;
|
protected ?string $tableName = null;
|
||||||
|
|
||||||
protected ?string $channelClass = null;
|
protected ?string $channelClass = null;
|
||||||
|
@ -57,12 +62,25 @@ Application::run(new class extends Application {
|
||||||
$dbfile = $this->dbfile;
|
$dbfile = $this->dbfile;
|
||||||
if ($dbfile === null) self::die("Vous devez spécifier la base de données");
|
if ($dbfile === null) self::die("Vous devez spécifier la base de données");
|
||||||
if (!file_exists($dbfile)) self::die("$dbfile: fichier introuvable");
|
if (!file_exists($dbfile)) self::die("$dbfile: fichier introuvable");
|
||||||
|
$storage = new SqliteStorage($dbfile);
|
||||||
|
|
||||||
if ($this->channelClass !== null) {
|
$name = $this->name;
|
||||||
$channelClass = str_replace("/", "\\", $this->channelClass);
|
$channelClass = $this->channelClass;
|
||||||
|
$tableName = $this->tableName;
|
||||||
|
if ($name !== null) {
|
||||||
|
$row = $storage->db()->one([
|
||||||
|
"select from _channels",
|
||||||
|
"where" => ["name" => $name],
|
||||||
|
]);
|
||||||
|
if ($row === null) self::die("$name: nom de canal de données introuvable");
|
||||||
|
if ($row["class"] !== "class@anonymous") $channelClass = $row["class"];
|
||||||
|
else $tableName = $row["table_name"];
|
||||||
|
}
|
||||||
|
if ($channelClass !== null) {
|
||||||
|
$channelClass = str_replace("/", "\\", $channelClass);
|
||||||
$channel = new $channelClass;
|
$channel = new $channelClass;
|
||||||
} elseif ($this->tableName !== null) {
|
} elseif ($tableName !== null) {
|
||||||
$channel = new class($this->tableName) extends CapacitorChannel {
|
$channel = new class($tableName) extends CapacitorChannel {
|
||||||
function __construct(?string $name=null) {
|
function __construct(?string $name=null) {
|
||||||
parent::__construct($name);
|
parent::__construct($name);
|
||||||
$this->tableName = $name;
|
$this->tableName = $name;
|
||||||
|
@ -71,8 +89,6 @@ Application::run(new class extends Application {
|
||||||
} else {
|
} else {
|
||||||
self::die("Vous devez spécifier le canal de données");
|
self::die("Vous devez spécifier le canal de données");
|
||||||
}
|
}
|
||||||
|
|
||||||
$storage = new SqliteStorage($dbfile);
|
|
||||||
$capacitor = new Capacitor($storage, $channel);
|
$capacitor = new Capacitor($storage, $channel);
|
||||||
|
|
||||||
switch ($this->action) {
|
switch ($this->action) {
|
||||||
|
|
|
@ -27,7 +27,7 @@ class CapacitorChannel {
|
||||||
if ($name !== null) {
|
if ($name !== null) {
|
||||||
$name = strtolower($name);
|
$name = strtolower($name);
|
||||||
if ($tableName === null) {
|
if ($tableName === null) {
|
||||||
$tableName = str_replace("-", "_", $tableName) . "_channel";
|
$tableName = str_replace("-", "_", $name) . "_channel";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$name = static::class;
|
$name = static::class;
|
||||||
|
|
|
@ -154,10 +154,14 @@ EOT;
|
||||||
return $this->_getCreateSql($this->getChannel($channel));
|
return $this->_getCreateSql($this->getChannel($channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function _afterCreate(CapacitorChannel $channel): void {
|
||||||
|
}
|
||||||
|
|
||||||
protected function _create(CapacitorChannel $channel): void {
|
protected function _create(CapacitorChannel $channel): void {
|
||||||
$channel->ensureSetup();
|
$channel->ensureSetup();
|
||||||
if (!$channel->isCreated()) {
|
if (!$channel->isCreated()) {
|
||||||
$this->db->exec($this->_createSql($channel));
|
$this->db->exec($this->_createSql($channel));
|
||||||
|
$this->_afterCreate($channel);
|
||||||
$channel->setCreated();
|
$channel->setCreated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,8 +182,12 @@ EOT;
|
||||||
$this->_ensureExists($this->getChannel($channel));
|
$this->_ensureExists($this->getChannel($channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function _beforeReset(CapacitorChannel $channel): void {
|
||||||
|
}
|
||||||
|
|
||||||
/** supprimer le canal spécifié */
|
/** supprimer le canal spécifié */
|
||||||
function _reset(CapacitorChannel $channel, bool $recreate=false): void {
|
function _reset(CapacitorChannel $channel, bool $recreate=false): void {
|
||||||
|
$this->_beforeReset($channel);
|
||||||
$this->db->exec([
|
$this->db->exec([
|
||||||
"drop table if exists",
|
"drop table if exists",
|
||||||
$channel->getTableName(),
|
$channel->getTableName(),
|
||||||
|
|
|
@ -22,8 +22,8 @@ trait Tinsert {
|
||||||
if (($prefix = $query["prefix"] ?? null) !== null) $sql[] = $prefix;
|
if (($prefix = $query["prefix"] ?? null) !== null) $sql[] = $prefix;
|
||||||
|
|
||||||
## insert
|
## insert
|
||||||
self::consume('insert\s*', $tmpsql);
|
self::consume('(insert(?:\s+or\s+(?:ignore|replace))?)\s*', $tmpsql, $ms);
|
||||||
$sql[] = "insert";
|
$sql[] = $ms[1];
|
||||||
|
|
||||||
## into
|
## into
|
||||||
self::consume('into\s*', $tmpsql);
|
self::consume('into\s*', $tmpsql);
|
||||||
|
|
|
@ -28,6 +28,39 @@ class SqliteStorage extends CapacitorStorage {
|
||||||
return self::format_sql($channel, $query->getSql());
|
return self::format_sql($channel, $query->getSql());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function _afterCreate(CapacitorChannel $channel): void {
|
||||||
|
$db = $this->db;
|
||||||
|
$db->exec([
|
||||||
|
"create table if not exists",
|
||||||
|
"table" => "_channels",
|
||||||
|
"cols" => [
|
||||||
|
"name" => "varchar primary key",
|
||||||
|
"table_name" => "varchar",
|
||||||
|
"class" => "varchar",
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
$db->exec([
|
||||||
|
"insert",
|
||||||
|
"into" => "_channels",
|
||||||
|
"values" => [
|
||||||
|
"name" => $channel->getName(),
|
||||||
|
"table_name" => $channel->getTableName(),
|
||||||
|
"class" => get_class($channel),
|
||||||
|
],
|
||||||
|
"suffix" => "on conflict do nothing",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function _beforeReset(CapacitorChannel $channel): void {
|
||||||
|
$this->db->exec([
|
||||||
|
"delete",
|
||||||
|
"from" => "_channels",
|
||||||
|
"where" => [
|
||||||
|
"name" => $channel->getName(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
function _exists(CapacitorChannel $channel): bool {
|
function _exists(CapacitorChannel $channel): bool {
|
||||||
$tableName = $this->db->get([
|
$tableName = $this->db->get([
|
||||||
"select name from sqlite_schema",
|
"select name from sqlite_schema",
|
||||||
|
|
Loading…
Reference in New Issue