Commit 8802ad1a authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Fonctions, procédures & triggers OK

parent e5748110
Loading
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -12,11 +12,13 @@ use Unicaen\BddAdmin\Exception\BddException;
use Unicaen\BddAdmin\Exception\BddIndexExistsException;
use Unicaen\BddAdmin\Logger\LoggerAwareTrait;
use Unicaen\BddAdmin\Manager\CompilableInterface;
use Unicaen\BddAdmin\Manager\FunctionManagerInteface;
use Unicaen\BddAdmin\Manager\IndexManagerInterface;
use Unicaen\BddAdmin\Manager\ManagerInterface;
use Unicaen\BddAdmin\Manager\MaterializedViewManagerInteface;
use Unicaen\BddAdmin\Manager\PackageManagerInteface;
use Unicaen\BddAdmin\Manager\PrimaryConstraintManagerInterface;
use Unicaen\BddAdmin\Manager\ProcedureManagerInteface;
use Unicaen\BddAdmin\Manager\RefConstraintManagerInterface;
use Unicaen\BddAdmin\Manager\SchemaManagerInterface;
use Unicaen\BddAdmin\Manager\SequenceManagerInterface;
@@ -48,6 +50,8 @@ class Bdd
        Ddl::SEQUENCE,
        Ddl::TABLE,
        Ddl::PRIMARY_CONSTRAINT,
        Ddl::FUNCTION,
        Ddl::PROCEDURE,
        Ddl::PACKAGE,
        Ddl::VIEW,
        Ddl::MATERIALIZED_VIEW,
@@ -64,6 +68,8 @@ class Bdd
        Ddl::TABLE . '.rename'              => 'Renommage des tables',
        Ddl::VIEW . '.rename'               => 'Renommage des vues',
        Ddl::MATERIALIZED_VIEW . '.rename'  => 'Renommage des vues matérialisées',
        Ddl::PROCEDURE . '.rename'          => 'Renommage des procédures',
        Ddl::FUNCTION . '.rename'           => 'Renommage des fonctions',
        Ddl::PACKAGE . '.rename'            => 'Renommage des packages',
        Ddl::INDEX . '.rename'              => 'Renommage des indexes',
        Ddl::TRIGGER . '.rename'            => 'Renommage des triggers',
@@ -74,6 +80,8 @@ class Bdd
        Ddl::SEQUENCE . '.drop'             => 'Suppression des séquences',
        Ddl::VIEW . '.drop'                 => 'Suppression des vues',
        Ddl::MATERIALIZED_VIEW . '.drop'    => 'Suppression des vues matérialisées',
        Ddl::PROCEDURE . '.drop'            => 'Suppression des procédures',
        Ddl::FUNCTION . '.drop'             => 'Suppression des fonctions',
        Ddl::PACKAGE . '.drop'              => 'Suppression des packages',
        Ddl::REF_CONSTRAINT . '.drop'       => 'Suppression des clés étrangères',
        Ddl::PRIMARY_CONSTRAINT . '.drop'   => 'Suppression des clés primaires',
@@ -83,8 +91,12 @@ class Bdd
        Ddl::TABLE . '.create'              => 'Création des tables',
        Ddl::TABLE . '.alter'               => 'Modification des tables',
        Ddl::VIEW . '.create'               => 'Création des vues',
        Ddl::PROCEDURE . '.create'          => 'Création des procédures',
        Ddl::FUNCTION . '.create'           => 'Création des fonctions',
        Ddl::PACKAGE . '.create'            => 'Création des packages',
        Ddl::SEQUENCE . '.alter'            => 'Modification des séquences',
        Ddl::PROCEDURE . '.alter'           => 'Modification des procédures',
        Ddl::FUNCTION . '.alter'            => 'Modification des fonctions',
        Ddl::PACKAGE . '.alter'             => 'Modification des packages',
        Ddl::VIEW . '.alter'                => 'Modification des vues',
        Ddl::MATERIALIZED_VIEW . '.create'  => 'Création des vues matérialisées',
@@ -408,6 +420,7 @@ class Bdd
    }



    public function index(): IndexManagerInterface
    {
        return $this->manager(Ddl::INDEX);
@@ -422,6 +435,20 @@ class Bdd



    public function procedure(): ProcedureManagerInteface
    {
        return $this->manager(Ddl::PROCEDURE);
    }



    public function function (): FunctionManagerInteface
    {
        return $this->manager(Ddl::FUNCTION);
    }



    public function package(): PackageManagerInteface
    {
        return $this->manager(Ddl::PACKAGE);
+5 −1
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@ class Ddl implements \Iterator, \ArrayAccess
    const SEQUENCE           = 'sequence';
    const MATERIALIZED_VIEW  = 'materialized-view';
    const PRIMARY_CONSTRAINT = 'primary-constraint';
    const FUNCTION           = 'function';
    const PROCEDURE          = 'procedure';
    const PACKAGE            = 'package';
    const REF_CONSTRAINT     = 'ref-constraint';
    const INDEX              = 'index';
@@ -370,6 +372,8 @@ class Ddl implements \Iterator, \ArrayAccess
                        break;
                        case self::VIEW:
                        case self::MATERIALIZED_VIEW:
                        case self::PROCEDURE:
                        case self::FUNCTION:
                        case self::TRIGGER:
                            file_put_contents($file . '.sql', $d['definition']);
                        break;
@@ -429,7 +433,7 @@ class Ddl implements \Iterator, \ArrayAccess
            }
        }

        $sqls = [self::VIEW, self::MATERIALIZED_VIEW, self::TRIGGER];
        $sqls = [self::VIEW, self::MATERIALIZED_VIEW, self::TRIGGER, self::PROCEDURE, self::FUNCTION];
        foreach ($sqls as $type) {
            if (file_exists($dir . $type) && is_dir($dir . $type)) {
                $this->data[$type] = [];
+2 −14
Original line number Diff line number Diff line
@@ -103,10 +103,7 @@ class TriggerManager extends AbstractManager implements TriggerManagerInterface,



    /***
     * @param string $name
     */
    public function enable($name): void
    public function enable(array|string $name): void
    {
        if ($this->sendEvent()->getReturn('no-exec')) return;

@@ -117,10 +114,7 @@ class TriggerManager extends AbstractManager implements TriggerManagerInterface,



    /***
     * @param string $name
     */
    public function disable($name): void
    public function disable(array|string $name): void
    {
        if ($this->sendEvent()->getReturn('no-exec')) return;

@@ -131,9 +125,6 @@ class TriggerManager extends AbstractManager implements TriggerManagerInterface,



    /**
     * @return TriggerManagerInterface
     */
    public function enableAll(): TriggerManagerInterface
    {
        $this->bdd->logBegin("Activation de tous les déclencheurs");
@@ -153,9 +144,6 @@ class TriggerManager extends AbstractManager implements TriggerManagerInterface,



    /**
     * @return TriggerManagerInterface
     */
    public function disableAll(): TriggerManagerInterface
    {
        $this->bdd->logBegin("Désactivation de tous les déclencheurs");
+2 −0
Original line number Diff line number Diff line
@@ -259,6 +259,8 @@ class Driver implements DriverInterface
            Ddl::SEQUENCE           => SequenceManager::class,
            Ddl::TABLE              => TableManager::class,
            Ddl::PRIMARY_CONSTRAINT => PrimaryConstraintManager::class,
            Ddl::FUNCTION           => FunctionManager::class,
            Ddl::PROCEDURE          => ProcedureManager::class,
            Ddl::VIEW               => ViewManager::class,
            Ddl::MATERIALIZED_VIEW  => MaterializedViewManager::class,
            Ddl::REF_CONSTRAINT     => RefConstraintManager::class,
+157 −0
Original line number Diff line number Diff line
<?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 getList(): array
    {
        $list = [];
        $sql = "
        SELECT
          n.nspname schema,
          p.proname name
        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'
        ORDER BY
          n.nspname, p.proname
        ";
        $r = $this->bdd->select($sql);
        foreach ($r as $l) {
            $list[] = $l['schema'] . '.' . $l['name'];
        }

        return $list;
    }



    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) {
            $data[$r['schema'].'.'.$r['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);
    }

}
 No newline at end of file
Loading