| | |
| | | // | Author: Lukas Smith <smith@pooteeweet.org> |
|
| | | // +----------------------------------------------------------------------+
|
| | | //
|
| | | // $Id: mysql.php,v 1.108 2008/03/11 19:58:12 quipo Exp $
|
| | | // $Id: mysql.php 292715 2009-12-28 14:06:34Z quipo $ |
| | | //
|
| | |
|
| | | require_once 'MDB2/Driver/Manager/Common.php';
|
| | |
| | | $autoincrement = $fieldname;
|
| | | }
|
| | | }
|
| | | if (!is_null($autoincrement) && count($pk_fields) > 1) {
|
| | | if ((null !== $autoincrement) && count($pk_fields) > 1) { |
| | | $options['primary'] = $pk_fields;
|
| | | } else {
|
| | | // the PK constraint is on max one field => OK
|
| | |
| | | return $query;
|
| | | }
|
| | |
|
| | | if (!is_null($autoincrement)) {
|
| | | if (null !== $autoincrement) { |
| | | // we have to remove the PK clause added by _getIntegerDeclaration()
|
| | | $query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query);
|
| | | }
|
| | |
| | | }
|
| | |
|
| | | $query = 'SHOW TRIGGERS';
|
| | | if (!is_null($table)) {
|
| | | if (null !== $table) { |
| | | $table = $db->quote($table, 'text');
|
| | | $query .= " LIKE $table";
|
| | | }
|
| | |
| | | }
|
| | |
|
| | | $query = "SHOW /*!50002 FULL*/ TABLES";
|
| | | if (!is_null($database)) {
|
| | | if (null !== $database) { |
| | | $query .= " FROM $database";
|
| | | }
|
| | | $query.= "/*!50002 WHERE Table_type = 'BASE TABLE'*/";
|
| | |
| | | }
|
| | |
|
| | | $query = 'SHOW FULL TABLES';
|
| | | if (!is_null($database)) {
|
| | | if (null !== $database) { |
| | | $query.= " FROM $database";
|
| | | }
|
| | | $query.= " WHERE Table_type = 'VIEW'";
|
| | |
| | | }
|
| | |
|
| | | $type = '';
|
| | | $name = $db->quoteIdentifier($db->getIndexName($name), true);
|
| | | $idx_name = $db->quoteIdentifier($db->getIndexName($name), true); |
| | | if (!empty($definition['primary'])) {
|
| | | $type = 'PRIMARY';
|
| | | $name = 'KEY';
|
| | | $idx_name = 'KEY'; |
| | | } elseif (!empty($definition['unique'])) {
|
| | | $type = 'UNIQUE';
|
| | | } elseif (!empty($definition['foreign'])) {
|
| | |
| | | }
|
| | |
|
| | | $table_quoted = $db->quoteIdentifier($table, true);
|
| | | $query = "ALTER TABLE $table_quoted ADD $type $name";
|
| | | $query = "ALTER TABLE $table_quoted ADD $type $idx_name"; |
| | | if (!empty($definition['foreign'])) {
|
| | | $query .= ' FOREIGN KEY';
|
| | | }
|
| | | $fields = array();
|
| | | foreach (array_keys($definition['fields']) as $field) {
|
| | | $fields[] = $db->quoteIdentifier($field, true);
|
| | | foreach ($definition['fields'] as $field => $fieldinfo) { |
| | | $quoted = $db->quoteIdentifier($field, true); |
| | | if (!empty($fieldinfo['length'])) { |
| | | $quoted .= '(' . $fieldinfo['length'] . ')'; |
| | | } |
| | | $fields[] = $quoted; |
| | | }
|
| | | $query .= ' ('. implode(', ', $fields) . ')';
|
| | | if (!empty($definition['foreign'])) {
|
| | |
| | | }
|
| | | $query .= ' ('. implode(', ', $referenced_fields) . ')';
|
| | | $query .= $this->_getAdvancedFKOptions($definition);
|
| | | |
| | | // add index on FK column(s) or we can't add a FK constraint |
| | | // @see http://forums.mysql.com/read.php?22,19755,226009 |
| | | $result = $this->createIndex($table, $name.'_fkidx', $definition); |
| | | if (PEAR::isError($result)) { |
| | | return $result; |
| | | } |
| | | }
|
| | | $res = $db->exec($query);
|
| | | if (PEAR::isError($res)) {
|
| | |
| | | }
|
| | | // create triggers to enforce FOREIGN KEY constraints
|
| | | if ($db->supports('triggers') && !empty($foreign_keys)) {
|
| | | $table = $db->quoteIdentifier($table, true);
|
| | | $table_quoted = $db->quoteIdentifier($table, true); |
| | | foreach ($foreign_keys as $fkname => $fkdef) {
|
| | | if (empty($fkdef)) {
|
| | | continue;
|
| | | }
|
| | | //set actions to 'RESTRICT' if not set
|
| | | $fkdef['onupdate'] = empty($fkdef['onupdate']) ? 'RESTRICT' : strtoupper($fkdef['onupdate']);
|
| | | $fkdef['ondelete'] = empty($fkdef['ondelete']) ? 'RESTRICT' : strtoupper($fkdef['ondelete']);
|
| | | //set actions to default if not set |
| | | $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); |
| | | $fkdef['ondelete'] = empty($fkdef['ondelete']) ? $db->options['default_fk_action_ondelete'] : strtoupper($fkdef['ondelete']); |
| | |
|
| | | $trigger_names = array(
|
| | | 'insert' => $fkname.'_insert_trg',
|
| | |
| | | $restrict_action = ' IF (SELECT ';
|
| | | $aliased_fields = array();
|
| | | foreach ($table_fields as $field) {
|
| | | $aliased_fields[] = $table .'.'.$field .' AS '.$field;
|
| | | $aliased_fields[] = $table_quoted .'.'.$field .' AS '.$field; |
| | | }
|
| | | $restrict_action .= implode(',', $aliased_fields)
|
| | | .' FROM '.$table
|
| | | .' FROM '.$table_quoted |
| | | .' WHERE ';
|
| | | $conditions = array();
|
| | | $new_values = array();
|
| | |
| | | $new_values[] = $table_fields[$i] .' = NEW.'.$referenced_fields[$i];
|
| | | $null_values[] = $table_fields[$i] .' = NULL';
|
| | | }
|
| | | $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'
|
| | | .' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();'
|
| | | $conditions2 = array(); |
| | | if ('NO ACTION' != $fkdef['ondelete']) { |
| | | // There is no NEW row in on DELETE trigger |
| | | for ($i=0; $i<count($referenced_fields); $i++) { |
| | | $conditions2[] = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i]; |
| | | } |
| | | } |
| | | |
| | | $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'; |
| | | if (!empty($conditions2)) { |
| | | $restrict_action .= ' AND (' .implode(' OR ', $conditions2) .')'; |
| | | } |
| | | $restrict_action .= ' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();' |
| | | .' END IF;';
|
| | |
|
| | | $cascade_action_update = 'UPDATE '.$table.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';';
|
| | | $cascade_action_delete = 'DELETE FROM '.$table.' WHERE '.implode(' AND ', $conditions). ';';
|
| | | $setnull_action = 'UPDATE '.$table.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions). ';';
|
| | | $cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';'; |
| | | $cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';'; |
| | | $setnull_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $null_values).' WHERE '.implode(' AND ', $conditions). ';'; |
| | |
|
| | | if ('SET DEFAULT' == $fkdef['onupdate'] || 'SET DEFAULT' == $fkdef['ondelete']) {
|
| | | $db->loadModule('Reverse', null, true);
|
| | |
| | | }
|
| | | $default_values[] = $table_field .' = '. $field_definition[0]['default'];
|
| | | }
|
| | | $setdefault_action = 'UPDATE '.$table.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';';
|
| | | $setdefault_action = 'UPDATE '.$table_quoted.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; |
| | | }
|
| | |
|
| | | $query = 'CREATE TRIGGER %s'
|
| | |
| | | $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action;
|
| | | } elseif ('NO ACTION' == $fkdef['onupdate']) {
|
| | | $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'AFTER UPDATE', 'update');
|
| | | } else {
|
| | | //'RESTRICT'
|
| | | } elseif ('RESTRICT' == $fkdef['onupdate']) { |
| | | $sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update');
|
| | | }
|
| | | if ('CASCADE' == $fkdef['ondelete']) {
|
| | |
| | | $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action;
|
| | | } elseif ('NO ACTION' == $fkdef['ondelete']) {
|
| | | $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete');
|
| | | } else {
|
| | | //'RESTRICT'
|
| | | } elseif ('RESTRICT' == $fkdef['ondelete']) { |
| | | $sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete');
|
| | | }
|
| | | $sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
|
| | |
| | | }
|
| | |
|
| | | $query = "SHOW TABLES";
|
| | | if (!is_null($database)) {
|
| | | if (null !== $database) { |
| | | $query .= " FROM $database";
|
| | | }
|
| | | $table_names = $db->queryCol($query);
|