nur-sery/nur_bin/sqlite-storage.php

104 lines
3.0 KiB
PHP
Raw Normal View History

2024-06-06 09:42:16 +04:00
#!/usr/bin/php
<?php
require $_composer_autoload_path?? __DIR__.'/../vendor/autoload.php';
use nur\b\io\CacheFile;
use nur\cli\Application;
use nur\msg;
use nur\path;
use nur\sery\db\Capacitor;
use nur\sery\db\CapacitorChannel;
use nur\sery\db\sqlite\SqliteStorage;
2024-06-07 11:57:15 +04:00
use nur\sery\file\Stream;
2024-06-06 09:42:16 +04:00
use nur\yaml;
Application::run(new class extends Application {
const ARGS = [
"merge" => parent::ARGS,
"purpose" => "gestion d'un capacitor sqlite",
"usage" => "-f DBFILE -c CHANNEL key=value...",
["-f", "--dbfile", "args" => 1,
"help" => "chemin vers la base de données",
],
2024-06-06 12:19:06 +04:00
["-t", "--table-name", "args" => 1,
2024-06-06 09:42:16 +04:00
"help" => "nom de la table porteuse du canal de données",
],
2024-06-06 12:19:06 +04:00
["-c", "--channel-class", "args" => 1,
"help" => "nom de la classe dérivée de CapacitorChannel",
],
2024-06-06 09:42:16 +04:00
];
2024-06-06 12:19:06 +04:00
protected ?string $dbfile = null;
protected ?string $tableName = null;
2024-06-06 09:42:16 +04:00
2024-06-06 12:19:06 +04:00
protected ?string $channelClass = null;
2024-06-06 09:42:16 +04:00
2024-06-06 12:19:06 +04:00
protected ?array $args = null;
2024-06-06 09:42:16 +04:00
protected static function isa_cond(string $arg, ?array &$ms=null): bool {
return preg_match('/^(.+?)\s*(=|<>|<|>|<=|>=|(?:is\s+)?null|(?:is\s+)?not\s+null)\s*(.*)$/', $arg, $ms);
}
function main() {
$dbfile = $this->dbfile;
if ($dbfile === null) self::die("Vous devez spécifier la base de données");
if (!file_exists($dbfile)) self::die("$dbfile: fichier introuvable");
2024-06-06 12:19:06 +04:00
if ($this->channelClass !== null) {
$channelClass = str_replace("/", "\\", $this->channelClass);
$channel = new $channelClass;
} elseif ($this->tableName !== null) {
$channel = new class($this->tableName) extends CapacitorChannel {
public function __construct(?string $name=null) {
parent::__construct($name);
$this->tableName = $name;
}
};
} else {
self::die("Vous devez spécifier le canal de données");
}
2024-06-06 09:42:16 +04:00
$storage = new SqliteStorage($dbfile);
$capacitor = new Capacitor($storage, $channel);
$args = $this->args;
if (!$args) {
# lister les id
2024-06-07 11:57:15 +04:00
$out = new Stream(STDOUT);
$primaryKeys = $storage->getPrimaryKeys($channel);
$rows = $storage->db()->all([
"select",
"cols" => $primaryKeys,
2024-06-06 09:42:16 +04:00
"from" => $channel->getTableName(),
]);
2024-06-07 11:57:15 +04:00
$out->fputcsv($primaryKeys);
2024-06-06 09:42:16 +04:00
foreach ($rows as $row) {
2024-06-07 11:57:15 +04:00
$rowIds = $storage->getRowIds($channel, $row);
$out->fputcsv($rowIds);
2024-06-06 09:42:16 +04:00
}
} else {
# afficher les lignes correspondantes
if (count($args) == 1 && !self::isa_cond($args[0])) {
$filter = $args[0];
} else {
$filter = [];
$ms = null;
foreach ($args as $arg) {
if (self::isa_cond($arg, $ms)) {
$filter[$ms[1]] = [$ms[2], $ms[3]];
} else {
$filter[$arg] = ["not null"];
}
}
}
$first = true;
$capacitor->each($filter, function ($item, $row) use (&$first) {
if ($first) $first = false;
else echo "---\n";
yaml::dump($row);
});
}
}
});