Select Git revision
FunctionManager.php
Anthony Gautreau authored
Les mots-clés réservés par Postgre posait soucis (schema, name, etc..) donc rajout de quote autour. rajout d'une correspondance au type "character" qui n'était pas présent.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FunctionManager.php 3.59 KiB
<?php
namespace Unicaen\BddAdmin\Driver\Postgresql;
use Unicaen\BddAdmin\Manager\AbstractManager;
use Unicaen\BddAdmin\Manager\FunctionManagerInteface;
use Unicaen\BddAdmin\Ddl\DdlFilter;
use Unicaen\BddAdmin\Util;
class FunctionManager extends AbstractManager implements FunctionManagerInteface
{
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 = 'f'
$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 exists(string $name): bool
{
[$schema, $name] = Util::explodedFullObjectName($name);
if (!$schema) {
$schema = 'public';
}
$sql = "
SELECT
count(*) nbr
FROM
pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE
p.prokind = 'f'
AND n.nspname = :schema
AND p.proname = :name
";
$params = ['schema' => $schema, 'name' => $name];
$nbr = (int)$this->bdd->selectOne($sql, $params, 'nbr');
return $nbr > 0;
}
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 fonction ' . $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 fonction ' . $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 fonction ' . $oldName . ' en ' . $newName);
}
}