fix warn about escaping \ in getConstraints
authorioguix <ioguix>
Fri, 21 Sep 2007 20:00:38 +0000 (20:00 +0000)
committerioguix <ioguix>
Fri, 21 Sep 2007 20:00:38 +0000 (20:00 +0000)
classes/database/Postgres73.php
classes/database/Postgres82.php

index 62c83f3d344924920bb4932af1fc55cf440eff1b..c5832a4437a1354689cc0741481391aa899c0858 100644 (file)
@@ -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)
index 624f71b651d6eb503a4ca5a6a9de3f38dfb7b3ca..195d8fcd4d375316438c4d5dd16416b0366c9f84 100644 (file)
@@ -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;}