Example #1
0
 public function fillParentTables(&$schemas)
 {
     $this->em->clear();
     //Inherit
     $sql = "WITH RECURSIVE inh AS (\n                   SELECT i.inhrelid, i.inhparent\n                   FROM pg_catalog.pg_inherits i\n                   UNION\n                   SELECT i.inhrelid, inh.inhparent\n                   FROM inh INNER JOIN pg_catalog.pg_inherits i ON (inh.inhrelid = i.inhparent)\n            )\n            SELECT n.nspname as schema,\n                   c.oid,\n                   c.oid::pg_catalog.regclass as name,\n                   c.relname as table_name,\n                   --c2.relname as parent_name,\n                   c2.oid as table\n            FROM inh\n                   INNER JOIN pg_catalog.pg_class c ON (inh.inhrelid = c.oid)\n                   INNER JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid)\n                   INNER JOIN pg_catalog.pg_class c2 ON (inh.inhparent = c2.oid)\n           WHERE n.nspname <> 'pg_catalog'\n               AND n.nspname <> 'information_schema'\n               AND n.nspname !~ '^pg_toast'\n               AND n.nspname !~ '^pg_temp'\n               AND n.nspname <> 'londiste'\n               AND n.nspname <> 'pgq'";
     $rsm = new ResultSetMapping();
     $rsm->addScalarResult('oid', 'oid');
     $rsm->addScalarResult('name', 'name');
     $rsm->addScalarResult('schema', 'schema');
     $rsm->addScalarResult('table', 'table');
     $rsm->addScalarResult('table_name', 'table_name');
     $stmt = $this->em->createNativeQuery($sql, $rsm);
     $stmt->useResultCache(true, PgRetriever::CACHE_LIFETIME);
     foreach ($stmt->getResult(AbstractQuery::HYDRATE_ARRAY) as $row) {
         $child = new ParentTable($row['schema'], $row['table']);
         foreach ($row as $key => $value) {
             $child->__set($key, $value);
         }
         try {
             if ($this->index_type == PgRetriever::INDEX_TYPE_OID) {
                 $schemas[$row['schema']]->addTableParentTable($row['oid'], $child);
             } elseif ($this->index_type == PgRetriever::INDEX_TYPE_NAME) {
                 $schemas[$row['schema']]->addTableParentTable($row['table_name'], $child);
             }
         } catch (\Exception $e) {
             $this->logger->addAlert($e->getMessage() . ' ' . json_encode($row), $e->getTrace());
         }
         unset($child);
     }
     unset($stmt);
 }
Example #2
0
 /**
  * @param $schema
  * @param $tableOid
  * @return array
  */
 public function getParentTables($schema, $tableOid)
 {
     //Inherit
     $sql = "\n        WITH RECURSIVE inh AS (\n                   SELECT i.inhrelid, i.inhparent\n                   FROM pg_catalog.pg_inherits i\n                   WHERE i.inhrelid = '" . pg_escape_string($tableOid) . "'\n                   UNION\n                   SELECT i.inhrelid, inh.inhparent\n                   FROM inh INNER JOIN pg_catalog.pg_inherits i ON (inh.inhrelid = i.inhparent)\n            )\n            SELECT n.nspname as schema,\n                   c.oid,\n                   c.oid::pg_catalog.regclass as name,\n                   c.relname as table_name,\n                   --c2.relname as parent_name,\n                   c2.oid as table\n            FROM inh\n                   INNER JOIN pg_catalog.pg_class c ON (inh.inhrelid = c.oid)\n                   INNER JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid)\n                   INNER JOIN pg_catalog.pg_class c2 ON (inh.inhparent = c2.oid)\n        ";
     $rsm = new ResultSetMapping();
     $rsm->addScalarResult('oid', 'oid');
     $rsm->addScalarResult('name', 'name');
     $rsm->addScalarResult('schema', 'schema');
     $rsm->addScalarResult('table', 'table');
     $rsm->addScalarResult('table_name', 'table_name');
     $stmt = $this->em->createNativeQuery($sql, $rsm);
     $stmt->useResultCache(true, self::CACHE_LIFETIME);
     $parents = [];
     foreach ($stmt->getResult(AbstractQuery::HYDRATE_ARRAY) as $row) {
         $child = new ParentTable($schema, $row['table']);
         foreach ($row as $key => $value) {
             $child->__set($key, $value);
         }
         if ($this->index_type == self::INDEX_TYPE_OID) {
             $parents[$row['oid']] = $child;
         } elseif ($this->index_type == self::INDEX_TYPE_NAME) {
             $parents[$row['name']] = $child;
         }
     }
     return $parents;
 }