Skip to content
Snippets Groups Projects
Select Git revision
  • e258684a04cf629a3f2b34df60641b51ba5945a9
  • main default
  • detached3
  • detached2
  • modernisation-gestion-donnees
  • detached
  • 1.5.0
  • 1.4.3
  • 1.4.2
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.2
  • 1.1.1
  • 1.1.0
  • 1.0.6
  • 1.0.5
  • 1.0.4
  • 1.0.3
  • 1.0.2
  • 1.0.1
  • 1.0.0
  • 0.9.10
  • 0.9.9
  • 0.9.8
26 results

FunctionManager.php

Blame
  • Anthony Gautreau's avatar
    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.
    f6728d84
    History
    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);
        }
    
    }