Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ProcedureManager.php 2.98 KiB
<?php
namespace Unicaen\BddAdmin\Driver\Postgresql;
use Unicaen\BddAdmin\Manager\AbstractManager;
use Unicaen\BddAdmin\Ddl\DdlFilter;
use Unicaen\BddAdmin\Manager\ProcedureManagerInteface;
use Unicaen\BddAdmin\Util;
class ProcedureManager extends AbstractManager implements ProcedureManagerInteface
{
public function get($includes = null, $excludes = null): array
{
$filter = DdlFilter::normalize2($includes, $excludes);
[$f, $p] = $filter->toSql('n.nspname', 'p.proname');
$data = [];
$q = "
SELECT
n.nspname \"schema\",
p.proname \"name\",
pg_catalog.pg_get_functiondef(p.oid) definition,
pg_catalog.pg_get_function_result(p.oid) return,
pg_catalog.pg_get_function_arguments(p.oid) arguments
FROM
pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE
n.nspname NOT IN ('pg_catalog', 'information_schema')
AND p.prokind = 'p'
$f
ORDER BY
n.nspname, p.proname
";
$p = $this->bdd->select($q, $p);
foreach ($p as $r) {
$name = Util::fullObjectName($r['schema'], $r['name']);
$data[$name] = [
'schema' => $r['schema'],
'name' => $r['name'],
'definition' => $this->purger($r['definition'], true),
'return' => $r['return'],
'arguments' => $r['arguments'],
];
}
return $data;
}
public function create(array $data, $test = null): void
{
if ($this->sendEvent()->getReturn('no-exec')) return;
$name = Util::fullObjectName($data['schema'] ?? null, $data['name']);
$this->addQuery($data['definition'], 'Ajout/modification de la procédure ' . $name);
}
public function drop(array|string $name): void
{
if ($this->sendEvent()->getReturn('no-exec')) return;
if (is_array($name)) {
$name = Util::fullObjectName($name['schema'] ?? null, $name['name']);
$args = '('.$name['arguments'].')';
}else{
$args = '';
}
$this->addQuery("DROP FUNCTION " . $name.$args, 'Suppression de la procédure ' . $name);
}
public function alter(array $old, array $new): void
{
if ($old != $new) {
if ($this->sendEvent()->getReturn('no-exec')) return;
$this->create($new);
}
}
public function rename(string $oldName, array|string $new): void
{
if ($this->sendEvent()->getReturn('no-exec')) return;
if (is_array($new)) {
$newName = $new['name'];
$args = '('.$new['arguments'].')';
} else {
[$null, $newName] = Util::explodedFullObjectName($new);
$args = '';
}
$this->addQuery("ALTER FUNCTION $oldName$args RENAME TO $newName", 'Renommage de la procédure ' . $oldName . ' en ' . $newName);
}
}