public function testAddAndDropForeignKey() { $referencedTableName = 'phpunit_foreign'; $referencedTableXml = "\n <table>\n <name>{$referencedTableName}</name>\n <version>1</version>\n <declaration>\n <field>\n <name>id</name>\n <type>integer</type>\n <autoincrement>true</autoincrement>\n </field>\n <field>\n <name>name</name>\n <type>text</type>\n <length>128</length>\n <notnull>true</notnull>\n </field>\n <index>\n <name>id</name>\n <primary>true</primary>\n <field>\n <name>id</name>\n </field>\n </index>\n </declaration>\n </table>"; $referencedTable = Setup_Backend_Schema_Table_Factory::factory('Xml', $referencedTableXml); $this->_tableNames[] = $referencedTableName; $this->_backend->createTable($referencedTable); $fieldString = "\n <field>\n <name>foreign_id</name>\n <type>integer</type>\n </field>"; $field = Setup_Backend_Schema_Field_Factory::factory('Xml', $fieldString); $this->_backend->addCol($this->_table->name, $field); $string = "\n <index>\n <field>\n <name>foreign_id</name>\n </field>\n <foreign>true</foreign>\n <reference>\n <table>{$referencedTableName}</table>\n <field>id</field>\n </reference>\n </index>"; $foreignKey = Setup_Backend_Schema_Index_Factory::factory('Xml', $string); $this->_backend->addForeignKey($this->_table->name, $foreignKey); $schema = $this->_backend->getExistingSchema($this->_table->name); $this->assertEquals(2, count($schema->indices)); $index = $schema->indices[1]; $this->assertEquals('true', $index->foreign); $this->assertEquals('false', $index->primary); // $this->assertFalse(empty($index->referencetable)); // $this->assertFalse(empty($index->referencefield)); $db = Tinebase_Core::getDb(); $db->insert(SQL_TABLE_PREFIX . $referencedTableName, array('name' => 'test')); $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 1)); try { $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 999)); $this->fail('Expected Zend_Db_Statement_Exception not thrown'); } catch (Zend_Db_Statement_Exception $e) { //we expected this exception, everything is alright } $this->_backend->dropForeignKey($this->_table->name, $index->name); //now this should work without throwing an Exception $db->insert(SQL_TABLE_PREFIX . $this->_table->name, array('name' => 'test', 'foreign_id' => 999)); }
/** * takes the xml stream and creates a table * * @param object $_table xml stream */ public function createTable(Setup_Backend_Schema_Table_Abstract $_table) { $this->_table = $_table->name; parent::createTable($_table); if (!empty($this->_autoincrementId)) { $statement = $this->getIncrementSequence($_table->name); $this->execQueryVoid($statement); $statement = $this->getIncrementTrigger($_table->name); $this->execQueryVoid($statement); unset($this->_autoincrementId); } foreach ($_table->indices as $index) { if (empty($index->primary) && empty($index->unique) && !$index->foreign) { $this->addIndex($_table->name, $index); } } foreach ($_table->fields as $field) { if (isset($field->comment)) { $this->setFieldComment($_table->name, $field->name, $field->comment); } } }