Postgres::getConstraintsWithFields PHP Method

getConstraintsWithFields() public method

Returns a list of all constraints on a table, including constraint name, definition, related col and referenced namespace, table and col if needed
public getConstraintsWithFields ( $table ) : a
$table the table where we are looking for fk
return a recordset
    function getConstraintsWithFields($table)
    {
        $c_schema = $this->_schema;
        $this->clean($c_schema);
        $this->clean($table);
        // get the max number of col used in a constraint for the table
        $sql = "SELECT DISTINCT\n\t\t\tmax(SUBSTRING(array_dims(c.conkey) FROM  \$patern\$^\\[.*:(.*)\\]\$\$patern\$)) as nb\n\t\tFROM pg_catalog.pg_constraint AS c\n\t\t\tJOIN pg_catalog.pg_class AS r ON (c.conrelid=r.oid)\n\t\t\tJOIN pg_catalog.pg_namespace AS ns ON (r.relnamespace=ns.oid)\n\t\tWHERE\n\t\t\tr.relname = '{$table}' AND ns.nspname='{$c_schema}'";
        $rs = $this->selectSet($sql);
        if ($rs->EOF) {
            $max_col = 0;
        } else {
            $max_col = $rs->fields['nb'];
        }
        $sql = '
			SELECT
				c.oid AS conid, c.contype, c.conname, pg_catalog.pg_get_constraintdef(c.oid, true) AS consrc,
				ns1.nspname as p_schema, r1.relname as p_table, ns2.nspname as f_schema,
				r2.relname as f_table, f1.attname as p_field, f1.attnum AS p_attnum, f2.attname as f_field,
				f2.attnum AS f_attnum, pg_catalog.obj_description(c.oid, \'pg_constraint\') AS constcomment,
				c.conrelid, c.confrelid
			FROM
				pg_catalog.pg_constraint AS c
				JOIN pg_catalog.pg_class AS r1 ON (c.conrelid=r1.oid)
				JOIN pg_catalog.pg_attribute AS f1 ON (f1.attrelid=r1.oid AND (f1.attnum=c.conkey[1]';
        for ($i = 2; $i <= $rs->fields['nb']; $i++) {
            $sql .= " OR f1.attnum=c.conkey[{$i}]";
        }
        $sql .= '))
				JOIN pg_catalog.pg_namespace AS ns1 ON r1.relnamespace=ns1.oid
				LEFT JOIN (
					pg_catalog.pg_class AS r2 JOIN pg_catalog.pg_namespace AS ns2 ON (r2.relnamespace=ns2.oid)
				) ON (c.confrelid=r2.oid)
				LEFT JOIN pg_catalog.pg_attribute AS f2 ON
					(f2.attrelid=r2.oid AND ((c.confkey[1]=f2.attnum AND c.conkey[1]=f1.attnum)';
        for ($i = 2; $i <= $rs->fields['nb']; $i++) {
            $sql .= " OR (c.confkey[{$i}]=f2.attnum AND c.conkey[{$i}]=f1.attnum)";
        }
        $sql .= sprintf("))\n\t\t\tWHERE\n\t\t\t\tr1.relname = '%s' AND ns1.nspname='%s'\n\t\t\tORDER BY 1", $table, $c_schema);
        return $this->selectSet($sql);
    }
Postgres