From 1ad4afaf8ae492e7256d2ca0b711405b1d8df6b9 Mon Sep 17 00:00:00 2001 From: zYne Date: Mon, 18 Jun 2007 18:54:48 +0000 Subject: [PATCH] --- lib/Doctrine/Export/Mysql.php | 57 ++----- lib/Doctrine/Export/MysqlRecordTestCase.php | 164 ++++++++++++++++++++ 2 files changed, 179 insertions(+), 42 deletions(-) create mode 100644 lib/Doctrine/Export/MysqlRecordTestCase.php diff --git a/lib/Doctrine/Export/Mysql.php b/lib/Doctrine/Export/Mysql.php index a018235a7..4b3ece1b6 100644 --- a/lib/Doctrine/Export/Mysql.php +++ b/lib/Doctrine/Export/Mysql.php @@ -53,46 +53,6 @@ class Doctrine_Export_Mysql extends Doctrine_Export { return 'DROP DATABASE ' . $this->conn->quoteIdentifier($name); } - /** - * create a new table - * - * @param string $name Name of the database that should be created - * @param array $fields Associative array that contains the definition of each field of the new table - * The indexes of the array entries are the names of the fields of the table an - * the array entry values are associative arrays like those that are meant to be - * passed with the field definitions to get[Type]Declaration() functions. - * array( - * 'id' => array( - * 'type' => 'integer', - * 'unsigned' => 1 - * 'notnull' => 1 - * 'default' => 0 - * ), - * 'name' => array( - * 'type' => 'text', - * 'length' => 12 - * ), - * 'password' => array( - * 'type' => 'text', - * 'length' => 12 - * ) - * ); - * @param array $options An associative array of table options: - * array( - * 'comment' => 'Foo', - * 'charset' => 'utf8', - * 'collate' => 'utf8_unicode_ci', - * 'type' => 'innodb', - * ); - * - * @return void - */ - public function createTable($name, array $fields, array $options = array()) - { - $sql = $this->createTableSql($name, $fields, $options); - - $this->conn->execute($sql); - } /** * create a new table * @@ -158,7 +118,7 @@ class Doctrine_Export_Mysql extends Doctrine_Export if (isset($options['charset'])) { $optionStrings['charset'] = 'DEFAULT CHARACTER SET ' . $options['charset']; if (isset($options['collate'])) { - $optionStrings['charset'].= ' COLLATE ' . $options['collate']; + $optionStrings['charset'] .= ' COLLATE ' . $options['collate']; } } @@ -177,7 +137,20 @@ class Doctrine_Export_Mysql extends Doctrine_Export if (!empty($optionStrings)) { $query.= ' '.implode(' ', $optionStrings); } - return $query; + $sql[] = $query; + + if (isset($options['foreignKeys'])) { + + foreach ((array) $options['foreignKeys'] as $k => $definition) { + if (is_array($definition)) { + if ( ! isset($definition['table'])) { + $definition['table'] = $name; + } + $sql[] = $this->createForeignKeySql($definition['table'], $definition); + } + } + } + return $sql; } /** * alter an existing table diff --git a/lib/Doctrine/Export/MysqlRecordTestCase.php b/lib/Doctrine/Export/MysqlRecordTestCase.php new file mode 100644 index 000000000..07e6fbf3f --- /dev/null +++ b/lib/Doctrine/Export/MysqlRecordTestCase.php @@ -0,0 +1,164 @@ +. + */ + +/** + * Doctrine_Export_MysqlRecord_TestCase + * + * @package Doctrine + * @author Konsta Vesterinen + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + */ +class Doctrine_Export_MysqlRecord_TestCase extends Doctrine_UnitTestCase +{ + public function prepareTables() + { } + public function prepareData() + { } + public function testRecordDefinitionsSupportTableOptions() + { + $r = new MysqlTestRecord; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE mysql_test_record (name TEXT, code BIGINT, PRIMARY KEY(name, code)) ENGINE = INNODB'); + } + public function testExportSupportsIndexes() + { + $r = new MysqlIndexTestRecord; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE mysql_index_test_record (id BIGINT AUTO_INCREMENT, name TEXT, code INT, content TEXT, FULLTEXT INDEX content_idx (content), UNIQUE INDEX namecode_idx (name, code), PRIMARY KEY(id)) ENGINE = MYISAM'); + } + + public function testExportSupportsForeignKeys() + { + $r = new ForeignKeyTest; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE foreign_key_test (id BIGINT AUTO_INCREMENT, name TEXT, code INT, content TEXT, parent_id BIGINT, FOREIGN KEY parent_id REFERENCES foreign_key_test(id), FOREIGN KEY id REFERENCES foreign_key_test(parent_id) ON UPDATE RESTRICT ON DELETE CASCADE, PRIMARY KEY(id)) ENGINE = INNODB'); + } + + public function testExportSupportsForeignKeysWithoutAttributes() + { + $r = new ForeignKeyTest2; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE foreign_key_test2 (id BIGINT AUTO_INCREMENT, name TEXT, foreignkey BIGINT, FOREIGN KEY foreignkey REFERENCES foreign_key_test(id), PRIMARY KEY(id)) ENGINE = INNODB'); + + } + public function testExportSupportsForeignKeysForManyToManyRelations() + { + $r = new MysqlUser; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE mysql_user (id BIGINT AUTO_INCREMENT, name TEXT, PRIMARY KEY(id)) ENGINE = INNODB'); + + $r->MysqlGroup[0]; + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE mysql_group (id BIGINT AUTO_INCREMENT, name TEXT, PRIMARY KEY(id)) ENGINE = INNODB'); + + + $this->assertEqual($this->adapter->pop(), 'CREATE TABLE mysql_group_member (group_id BIGINT, user_id BIGINT, PRIMARY KEY(group_id, user_id)) ENGINE = INNODB'); + } + +} +class ForeignKeyTest extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null); + $this->hasColumn('code', 'integer', 4); + $this->hasColumn('content', 'string', 4000); + $this->hasColumn('parent_id', 'integer'); + + $this->hasOne('ForeignKeyTest as Parent', + 'ForeignKeyTest.parent_id', + array('onDelete' => 'CASCADE', + 'onUpdate' => 'RESTRICT') + ); + + $this->hasMany('ForeignKeyTest as Children', + 'ForeignKeyTest.parent_id'); + + $this->option('type', 'INNODB'); + + } +} +class MysqlGroupMember extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('group_id', 'integer', null, 'primary'); + $this->hasColumn('user_id', 'integer', null, 'primary'); + } +} +class MysqlUser extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null); + + $this->hasMany('MysqlGroup', 'MysqlGroupMember.group_id'); + } +} +class MysqlGroup extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null); + + $this->hasMany('MysqlUser', 'MysqlGroupMember.user_id'); + } +} +class ForeignKeyTest2 extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null); + $this->hasColumn('foreignkey', 'integer'); + + $this->hasOne('ForeignKeyTest', 'ForeignKeyTest2.foreignkey'); + } +} +class MysqlIndexTestRecord extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null); + $this->hasColumn('code', 'integer', 4); + $this->hasColumn('content', 'string', 4000); + + $this->index('content', array('fields' => 'content', 'type' => 'fulltext')); + $this->index('namecode', array('fields' => array('name', 'code'), + 'type' => 'unique')); + + $this->option('type', 'MYISAM'); + + } +} +class MysqlTestRecord extends Doctrine_Record +{ + public function setTableDefinition() + { + $this->hasColumn('name', 'string', null, 'primary'); + $this->hasColumn('code', 'integer', null, 'primary'); + + $this->option('type', 'INNODB'); + } +}