From dc3ff888352c8526e21f3fcebd517db87b888d29 Mon Sep 17 00:00:00 2001 From: ioguix Date: Fri, 21 Sep 2007 20:00:38 +0000 Subject: [PATCH] fix warn about escaping \ in getConstraints --- classes/database/Postgres73.php | 4 +-- classes/database/Postgres82.php | 61 ++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/classes/database/Postgres73.php b/classes/database/Postgres73.php index 62c83f3d..c5832a44 100644 --- a/classes/database/Postgres73.php +++ b/classes/database/Postgres73.php @@ -4,7 +4,7 @@ * A class that implements the DB interface for Postgres * Note: This class uses ADODB and returns RecordSets. * - * $Id: Postgres73.php,v 1.168 2007/09/19 15:31:18 xzilla Exp $ + * $Id: Postgres73.php,v 1.169 2007/09/21 20:00:38 ioguix Exp $ */ // @@@ THOUGHT: What about inherits? ie. use of ONLY??? @@ -1220,7 +1220,7 @@ class Postgres73 extends Postgres72 { // get the max number of col used in a constraint for the table $sql = "SELECT DISTINCT - max(SUBSTRING(array_dims(c.conkey) FROM E'^\\\[.*:(.*)\\\]$')) as nb + max(SUBSTRING(array_dims(c.conkey) FROM '^\\\[.*:(.*)\\\]$')) as nb FROM pg_catalog.pg_constraint AS c JOIN pg_catalog.pg_class AS r ON (c.conrelid = r.oid) diff --git a/classes/database/Postgres82.php b/classes/database/Postgres82.php index 624f71b6..195d8fcd 100644 --- a/classes/database/Postgres82.php +++ b/classes/database/Postgres82.php @@ -3,7 +3,7 @@ /** * PostgreSQL 8.2 support * - * $Id: Postgres82.php,v 1.6 2007/08/31 19:46:24 ioguix Exp $ + * $Id: Postgres82.php,v 1.7 2007/09/21 20:00:38 ioguix Exp $ */ include_once('./classes/database/Postgres81.php'); @@ -197,6 +197,65 @@ class Postgres82 extends Postgres81 { return $this->selectSet($sql); } + // Constraints methods + + /** + * Returns a list of all constraints on a table, + * including constraint name, definition, related col and referenced namespace, + * table and col if needed + * @param $table the table where we are looking for fk + * @return a recordset + */ + function getConstraints($table) { + global $data; + + $data->clean($table); + + // get the max number of col used in a constraint for the table + $sql = "SELECT DISTINCT + max(SUBSTRING(array_dims(c.conkey) FROM E'^\\\[.*:(.*)\\\]$')) as nb + FROM + pg_catalog.pg_constraint AS c + JOIN pg_catalog.pg_class AS r ON (c.conrelid = r.oid) + JOIN pg_catalog.pg_namespace AS ns ON r.relnamespace=ns.oid + WHERE + r.relname = '$table' AND ns.nspname='". $this->_schema ."'"; + + $rs = $this->selectSet($sql); + + if ($rs->EOF) $max_col = 0; + else $max_col = $rs->fields['nb']; + + $sql = ' + SELECT + 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, f2.attname as f_field + 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(")) + WHERE + r1.relname = '%s' AND ns1.nspname='%s' + ORDER BY 1", $table, $this->_schema); + + return $this->selectSet($sql); + } + // Capabilities function hasSharedComments() {return true;} function hasCreateTableLikeWithConstraints() {return true;} -- 2.39.5