Postgres::getLinkingKeys PHP Method

getLinkingKeys() public method

A function for getting all columns linked by foreign keys given a group of tables
public getLinkingKeys ( $tables ) : -1
$tables multi dimensional assoc array that holds schema and table name
return -1 recordset of linked tables and columns
    function getLinkingKeys($tables)
    {
        if (!is_array($tables)) {
            return -1;
        }
        $this->clean($tables[0]['tablename']);
        $this->clean($tables[0]['schemaname']);
        $tables_list = "'{$tables[0]['tablename']}'";
        $schema_list = "'{$tables[0]['schemaname']}'";
        $schema_tables_list = "'{$tables[0]['schemaname']}.{$tables[0]['tablename']}'";
        for ($i = 1; $i < sizeof($tables); $i++) {
            $this->clean($tables[$i]['tablename']);
            $this->clean($tables[$i]['schemaname']);
            $tables_list .= ", '{$tables[$i]['tablename']}'";
            $schema_list .= ", '{$tables[$i]['schemaname']}'";
            $schema_tables_list .= ", '{$tables[$i]['schemaname']}.{$tables[$i]['tablename']}'";
        }
        $maxDimension = 1;
        $sql = "\n\t\t\tSELECT DISTINCT\n\t\t\t\tarray_dims(pc.conkey) AS arr_dim,\n\t\t\t\tpgc1.relname AS p_table\n\t\t\tFROM\n\t\t\t\tpg_catalog.pg_constraint AS pc,\n\t\t\t\tpg_catalog.pg_class AS pgc1\n\t\t\tWHERE\n\t\t\t\tpc.contype = 'f'\n\t\t\t\tAND (pc.conrelid = pgc1.relfilenode OR pc.confrelid = pgc1.relfilenode)\n\t\t\t\tAND pgc1.relname IN ({$tables_list})\n\t\t\t";
        //parse our output to find the highest dimension of foreign keys since pc.conkey is stored in an array
        $rs = $this->selectSet($sql);
        while (!$rs->EOF) {
            $arrData = explode(':', $rs->fields['arr_dim']);
            $tmpDimension = intval(substr($arrData[1], 0, strlen($arrData[1] - 1)));
            $maxDimension = $tmpDimension > $maxDimension ? $tmpDimension : $maxDimension;
            $rs->MoveNext();
        }
        //we know the highest index for foreign keys that conkey goes up to, expand for us in an IN query
        $cons_str = '( (pfield.attnum = conkey[1] AND cfield.attnum = confkey[1]) ';
        for ($i = 2; $i <= $maxDimension; $i++) {
            $cons_str .= "OR (pfield.attnum = conkey[{$i}] AND cfield.attnum = confkey[{$i}]) ";
        }
        $cons_str .= ') ';
        $sql = "\n\t\t\tSELECT\n\t\t\t\tpgc1.relname AS p_table,\n\t\t\t\tpgc2.relname AS f_table,\n\t\t\t\tpfield.attname AS p_field,\n\t\t\t\tcfield.attname AS f_field,\n\t\t\t\tpgns1.nspname AS p_schema,\n\t\t\t\tpgns2.nspname AS f_schema\n\t\t\tFROM\n\t\t\t\tpg_catalog.pg_constraint AS pc,\n\t\t\t\tpg_catalog.pg_class AS pgc1,\n\t\t\t\tpg_catalog.pg_class AS pgc2,\n\t\t\t\tpg_catalog.pg_attribute AS pfield,\n\t\t\t\tpg_catalog.pg_attribute AS cfield,\n\t\t\t\t(SELECT oid AS ns_id, nspname FROM pg_catalog.pg_namespace WHERE nspname IN ({$schema_list}) ) AS pgns1,\n \t\t\t\t(SELECT oid AS ns_id, nspname FROM pg_catalog.pg_namespace WHERE nspname IN ({$schema_list}) ) AS pgns2\n\t\t\tWHERE\n\t\t\t\tpc.contype = 'f'\n\t\t\t\tAND pgc1.relnamespace = pgns1.ns_id\n \t\t\t\tAND pgc2.relnamespace = pgns2.ns_id\n\t\t\t\tAND pc.conrelid = pgc1.relfilenode\n\t\t\t\tAND pc.confrelid = pgc2.relfilenode\n\t\t\t\tAND pfield.attrelid = pc.conrelid\n\t\t\t\tAND cfield.attrelid = pc.confrelid\n\t\t\t\tAND {$cons_str}\n\t\t\t\tAND pgns1.nspname || '.' || pgc1.relname IN ({$schema_tables_list})\n\t\t\t\tAND pgns2.nspname || '.' || pgc2.relname IN ({$schema_tables_list})\n\t\t";
        return $this->selectSet($sql);
    }
Postgres