From 41347bf2bee1c00beac8c72c687529cd4dc546d1 Mon Sep 17 00:00:00 2001 From: zYne Date: Wed, 7 Mar 2007 10:55:35 +0000 Subject: [PATCH] added Frontbase export driver --- lib/Doctrine/Export/Frontbase.php | 309 ++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 lib/Doctrine/Export/Frontbase.php diff --git a/lib/Doctrine/Export/Frontbase.php b/lib/Doctrine/Export/Frontbase.php new file mode 100644 index 000000000..686327ed4 --- /dev/null +++ b/lib/Doctrine/Export/Frontbase.php @@ -0,0 +1,309 @@ +. + */ +Doctrine::autoload('Doctrine_Export'); +/** + * Doctrine_Export_Frontbase + * + * @package Doctrine + * @author Konsta Vesterinen + * @author Lukas Smith (PEAR MDB2 library) + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision: 1113 $ + */ +class Doctrine_Export_Frontbase extends Doctrine_Export +{ + /** + * create a new database + * + * @param string $name name of the database that should be created + * @return boolean + */ + public function createDatabase($name) + { + $name = $this->conn->quoteIdentifier($name, true); + $query = 'CREATE DATABASE ' . $name; + + return $this->conn->exec($query); + } + /** + * drop an existing database + * + * @param string $name name of the database that should be dropped + * @return boolean + */ + public function dropDatabase($name) + { + $name = $this->conn->quoteIdentifier($name, true); + $query = 'DELETE DATABASE ' . $name; + + return $this->conn->exec($query); + } + /** + * drop an existing table + * + * @param object $this->conns database object that is extended by this class + * @param string $name name of the table that should be dropped + * @return integer + */ + public function dropTable($name) + { + $name = $this->conn->quoteIdentifier($name, true); + return $this->conn->exec('DROP TABLE ' . $name . ' CASCADE'); + } + /** + * alter an existing table + * + * @param string $name name of the table that is intended to be changed. + * @param array $changes associative array that contains the details of each type + * of change that is intended to be performed. The types of + * changes that are currently supported are defined as follows: + * + * name + * + * New name for the table. + * + * add + * + * Associative array with the names of fields to be added as + * indexes of the array. The value of each entry of the array + * should be set to another associative array with the properties + * of the fields to be added. The properties of the fields should + * be the same as defined by the MDB2 parser. + * + * + * remove + * + * Associative array with the names of fields to be removed as indexes + * of the array. Currently the values assigned to each entry are ignored. + * An empty array should be used for future compatibility. + * + * rename + * + * Associative array with the names of fields to be renamed as indexes + * of the array. The value of each entry of the array should be set to + * another associative array with the entry named name with the new + * field name and the entry named Declaration that is expected to contain + * the portion of the field declaration already in DBMS specific SQL code + * as it is used in the CREATE TABLE statement. + * + * change + * + * Associative array with the names of the fields to be changed as indexes + * of the array. Keep in mind that if it is intended to change either the + * name of a field and any other properties, the change array entries + * should have the new names of the fields as array indexes. + * + * The value of each entry of the array should be set to another associative + * array with the properties of the fields to that are meant to be changed as + * array entries. These entries should be assigned to the new values of the + * respective properties. The properties of the fields should be the same + * as defined by the MDB2 parser. + * + * Example + * array( + * 'name' => 'userlist', + * 'add' => array( + * 'quota' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * ) + * ), + * 'remove' => array( + * 'file_limit' => array(), + * 'time_limit' => array() + * ), + * 'change' => array( + * 'name' => array( + * 'length' => '20', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 20, + * ), + * ) + * ), + * 'rename' => array( + * 'sex' => array( + * 'name' => 'gender', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 1, + * 'default' => 'M', + * ), + * ) + * ) + * ) + * + * @param boolean $check indicates whether the function should just check if the DBMS driver + * can perform the requested table alterations if the value is true or + * actually perform them otherwise. + * @access public + * + * @return boolean + */ + public function alterTable($name, $changes, $check) + { + foreach ($changes as $changeName => $change){ + switch ($changeName) { + case 'add': + case 'remove': + case 'change': + case 'rename': + case 'name': + break; + default: + throw new Doctrine_Export_Exception('change type "'.$changeName.'" not yet supported'); + } + } + + if ($check) { + return true; + } + + $query = ''; + if (!empty($changes['name'])) { + $changeName = $this->conn->quoteIdentifier($changes['name'], true); + $query .= 'RENAME TO ' . $changeName; + } + + if (!empty($changes['add']) && is_array($changes['add'])) { + foreach ($changes['add'] as $fieldName => $field) { + if ($query) { + $query.= ', '; + } + $query.= 'ADD ' . $this->conn->getDeclaration($field['type'], $fieldName, $field); + } + } + + if (!empty($changes['remove']) && is_array($changes['remove'])) { + foreach ($changes['remove'] as $fieldName => $field) { + if ($query) { + $query.= ', '; + } + $fieldName = $this->conn->quoteIdentifier($fieldName, true); + $query.= 'DROP ' . $fieldName; + } + } + + $rename = array(); + if (!empty($changes['rename']) && is_array($changes['rename'])) { + foreach ($changes['rename'] as $fieldName => $field) { + $rename[$field['name']] = $fieldName; + } + } + + if (!empty($changes['change']) && is_array($changes['change'])) { + foreach ($changes['change'] as $fieldName => $field) { + if ($query) { + $query.= ', '; + } + if (isset($rename[$fieldName])) { + $oldFieldName = $rename[$fieldName]; + unset($rename[$fieldName]); + } else { + $oldFieldName = $fieldName; + } + $oldFieldName = $this->conn->quoteIdentifier($oldFieldName, true); + $query.= "CHANGE $oldFieldName " . $this->conn->getDeclaration($field['definition']['type'], $oldFieldName, $field['definition']); + } + } + + if (!empty($rename) && is_array($rename)) { + foreach ($rename as $renamedFieldName => $renamed_field) { + if ($query) { + $query.= ', '; + } + $oldFieldName = $rename[$renamedFieldName]; + $field = $changes['rename'][$oldFieldName]; + $query.= 'CHANGE ' . $this->conn->getDeclaration($field['definition']['type'], $oldFieldName, $field['definition']); + } + } + + if (!$query) { + return true; + } + + $name = $this->conn->quoteIdentifier($name, true); + return $this->conn->exec("ALTER TABLE $name $query"); + } + /** + * create sequence + * + * @param string $seqName name of the sequence to be created + * @param string $start start value of the sequence; default is 1 + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + public function createSequence($seqName, $start = 1) + { + $sequenceName = $this->conn->quoteIdentifier($this->conn->getSequenceName($seqName), true); + $seqcolName = $this->conn->quoteIdentifier($this->conn->getAttribute(Doctrine::ATTR_SEQCOL_NAME), true); + + $query = 'CREATE TABLE ' . $sequenceName . ' (' . $seqcolName . ' INTEGER DEFAULT UNIQUE, PRIMARY KEY(' . $seqcolName . '))'; + $res = $this->conn->exec($query); + $res = $this->conn->exec('SET UNIQUE = 1 FOR ' . $sequenceName); + + if ($start == 1) { + return true; + } + + try { + $this->conn->exec('INSERT INTO ' . $sequenceName . ' (' . $seqcolName . ') VALUES (' . ($start-1) . ')'); + } catch(Doctrine_Connection_Exception $e) { + // Handle error + try { + $this->conn->exec('DROP TABLE ' . $sequenceName); + } catch(Doctrine_Connection_Exception $e) { + throw new Doctrine_Export_Exception('could not drop inconsistent sequence table'); + } + + throw new Doctrine_Export_Exception('could not create sequence table'); + } + } + /** + * drop existing sequence + * + * @param string $seqName name of the sequence to be dropped + * @return boolean + */ + public function dropSequence($seqName) + { + $sequenceName = $this->conn->quoteIdentifier($this->conn->getSequenceName($seqName), true); + + return $this->conn->exec('DROP TABLE ' . $sequenceName . ' CASCADE'); + } + /** + * drop existing index + * + * @param string $table name of table that should be used in method + * @param string $name name of the index to be dropped + * @return boolean + */ + public function dropIndex($table, $name) + { + $table = $this->conn->quoteIdentifier($table, true); + $name = $this->conn->quoteIdentifier($this->conn->getIndexName($name), true); + + return $this->conn->exec('ALTER TABLE ' . $table . ' DROP INDEX ' . $name); + } +}