/** * drop existing constraint * * @param string $table name of table that should be used in method * @param string $name name of the constraint to be dropped * @param string $primary hint if the constraint is primary * * @return mixed MDB2_OK on success, a MDB2 error on failure * @access public */ function dropConstraint($table, $name, $primary = false) { $db = $this->getDBInstance(); if (MDB2::isError($db)) { return $db; } // is it an UNIQUE index? $query = 'SELECT relname FROM pg_class WHERE oid IN ( SELECT indexrelid FROM pg_index, pg_class WHERE pg_class.relname = ' . $db->quote($table, 'text') . ' AND pg_class.oid = pg_index.indrelid AND indisunique = \'t\') EXCEPT SELECT conname FROM pg_constraint, pg_class WHERE pg_constraint.conrelid = pg_class.oid AND relname = ' . $db->quote($table, 'text'); $unique = $db->queryCol($query, 'text'); if (MDB2::isError($unique) || empty($unique)) { // not an UNIQUE index, maybe a CONSTRAINT return parent::dropConstraint($table, $name, $primary); } if (in_array($name, $unique)) { $result = $db->exec('DROP INDEX ' . $db->quoteIdentifier($name, true)); if (MDB2::isError($result)) { return $result; } return MDB2_OK; } $idxname = $db->getIndexName($name); if (in_array($idxname, $unique)) { $result = $db->exec('DROP INDEX ' . $db->quoteIdentifier($idxname, true)); if (MDB2::isError($result)) { return $result; } return MDB2_OK; } return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, $name . ' is not an existing constraint for table ' . $table, __FUNCTION__); }
/** * drop existing constraint * * @param string $table name of table that should be used in method * @param string $name name of the constraint to be dropped * @param string $primary hint if the constraint is primary * @return mixed MDB2_OK on success, a MDB2 error on failure * @access public */ function dropConstraint($table, $name, $primary = false) { $db = $this->getDBInstance(); if (PEAR::isError($db)) { return $db; } //is it a FK constraint? If so, also delete the associated triggers $db->loadModule('Reverse', null, true); $definition = $db->reverse->getTableConstraintDefinition($table, $name); if (!PEAR::isError($definition) && !empty($definition['foreign'])) { //first drop the FK enforcing triggers $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); if (PEAR::isError($result)) { return $result; } } return parent::dropConstraint($table, $name, $primary); }