Commit 8110cf8e authored by zYne's avatar zYne

Mysql string > 255 now converts to TEXT type

parent 64923b58
......@@ -132,7 +132,11 @@ final class Doctrine {
* default table type attribute
*/
const ATTR_DEFAULT_TABLE_TYPE = 21;
const ATTR_DEF_TEXT_LENGTH = 30;
const ATTR_DEF_VARCHAR_LENGTH = 31;
const ATTR_DEF_TABLESPACE = 32;
const ATTR_EMULATE_DATABASE = 33;
const ATTR_DB_NAME_FORMAT = 34;
/** TODO: REMOVE THE FOLLOWING CONSTANTS AND UPDATE THE DOCS ! */
......
......@@ -148,8 +148,11 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
* @return Doctrine_Connection_Module connection module
*/
public function __get($name) {
if(isset($this->properties[$name]))
return $this->properties[$name];
if( ! isset($this->modules[$name]))
throw new Doctrine_Connection_Exception('Unknown module ' . $name);
throw new Doctrine_Connection_Exception('Unknown module / property ' . $name);
if($this->modules[$name] === false) {
switch($name) {
......@@ -160,10 +163,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
$class = 'Doctrine_' . ucwords($name) . '_' . $this->getName();
$this->modules[$name] = new $class($this);
}
}
if(isset($this->properties[$name]))
return $this->properties[$name];
}
return $this->modules[$name];
}
......@@ -223,7 +223,7 @@ abstract class Doctrine_Connection extends Doctrine_Configurable implements Coun
public function quoteIdentifier($str, $checkOption = true) {
if ($checkOption && ! $this->getAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER)) {
return $str;
}
}
$str = str_replace($this->properties['identifier_quoting']['end'],
$this->properties['identifier_quoting']['escape'] .
$this->properties['identifier_quoting']['end'], $str);
......
......@@ -130,7 +130,8 @@ class Doctrine_DataDict_Mysql extends Doctrine_DataDict {
* @return string DBMS specific SQL code portion that should be used to
* declare the specified field.
*/
public function getNativeDeclaration($field) {
public function getNativeDeclaration($field)
{
switch ($field['type']) {
case 'char':
$length = (! empty($field['length'])) ? $field['length'] : false;
......@@ -140,12 +141,17 @@ class Doctrine_DataDict_Mysql extends Doctrine_DataDict {
case 'array':
case 'object':
case 'string':
if (empty($field['length']) && array_key_exists('default', $field)) {
$field['length'] = $this->conn->varchar_max_length;
if ( ! isset($field['length'])) {
if(array_key_exists('default', $field)) {
$field['length'] = $this->conn->varchar_max_length;
} else {
$field['length'] = false;
}
}
$length = (! empty($field['length'])) ? $field['length'] : false;
$fixed = (! empty($field['fixed'])) ? $field['fixed'] : false;
$length = ($field['length'] < $this->conn->varchar_max_length) ? $field['length'] : false;
$fixed = (isset($field['fixed'])) ? $field['fixed'] : false;
return $fixed ? ($length ? 'CHAR('.$length.')' : 'CHAR(255)')
: ($length ? 'VARCHAR(' . $length . ')' : 'TEXT');
......
......@@ -40,26 +40,28 @@ class Doctrine_Export_Oracle extends Doctrine_Export {
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
*/
public function createDatabase($name) {
if (!$db->options['emulate_database'])
throw new Doctrine_Export_Oracle_Exception('database creation is only supported if the "emulate_database" option is enabled');
public function createDatabase($name)
{
if ( ! $this->conn->getAttribute(Doctrine::ATTR_EMULATE_DATABASE))
throw new Doctrine_Export_Oracle_Exception('database creation is only supported if the "emulate_database" attribute is enabled');
$username = $db->options['database_name_prefix'].$name;
$password = $db->dsn['password'] ? $db->dsn['password'] : $name;
$tablespace = $db->options['default_tablespace']
? ' DEFAULT TABLESPACE '.$db->options['default_tablespace'] : '';
$username = sprintf($this->conn->getAttribute(Doctrine::ATTR_DB_NAME_FORMAT), $name);
$password = $this->conn->dsn['password'] ? $this->conn->dsn['password'] : $name;
$query = 'CREATE USER '.$username.' IDENTIFIED BY '.$password.$tablespace;
$result = $db->standaloneQuery($query, null, true);
$tablespace = $this->conn->getAttribute(Doctrine::ATTR_DB_NAME_FORMAT)
? ' DEFAULT TABLESPACE '.$this->conn->options['default_tablespace'] : '';
$query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '.$username;
$result = $db->standaloneQuery($query, null, true);
$query = 'CREATE USER ' . $username . ' IDENTIFIED BY ' . $password . $tablespace;
$result = $this->conn->query($query);
$query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO ' . $username;
$result = $this->conn->query($query);
if (PEAR::isError($result)) {
$query = 'DROP USER '.$username.' CASCADE';
$result2 = $db->standaloneQuery($query, null, true);
$result2 = $this->conn->query($query);
if (PEAR::isError($result2)) {
return $db->raiseError($result2, null, null,
return $this->conn->raiseError($result2, null, null,
'could not setup the database user', __FUNCTION__);
}
return $result;
......@@ -68,19 +70,21 @@ class Doctrine_Export_Oracle extends Doctrine_Export {
/**
* drop an existing database
*
* @param object $db database object that is extended by this class
* @param object $this->conn database object that is extended by this class
* @param string $name name of the database that should be dropped
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public
*/
public function dropDatabase($name) {
if (!$db->options['emulate_database'])
public function dropDatabase($name)
{
if ( ! $this->conn->getAttribute(Doctrine::ATTR_EMULATE_DATABASE))
throw new Doctrine_Export_Oracle_Exception('database dropping is only supported if the
"emulate_database" option is enabled');
$username = $db->options['database_name_prefix'].$name;
return $db->standaloneQuery('DROP USER '.$username.' CASCADE', null, true);
$username = sprintf($this->conn->getAttribute(Doctrine::ATTR_DB_NAME_FORMAT), $name);
return $this->conn->query('DROP USER ' . $username . ' CASCADE');
}
/**
* add an autoincrement sequence + trigger
......@@ -91,7 +95,8 @@ class Doctrine_Export_Oracle extends Doctrine_Export {
* @return mixed MDB2_OK on success, a MDB2 error on failure
* @access private
*/
public function _makeAutoincrement($name, $table, $start = 1) {
public function _makeAutoincrement($name, $table, $start = 1)
{
$table = strtoupper($table);
$index_name = $table . '_AI_PK';
$definition = array(
......@@ -102,27 +107,27 @@ class Doctrine_Export_Oracle extends Doctrine_Export {
/**
if (PEAR::isError($result)) {
return $db->raiseError($result, null, null,
return $this->conn->raiseError($result, null, null,
'primary key for autoincrement PK could not be created', __FUNCTION__);
}
*/
if (is_null($start)) {
$db->beginTransaction();
$query = 'SELECT MAX(' . $db->quoteIdentifier($name, true) . ') FROM ' . $db->quoteIdentifier($table, true);
$this->conn->beginTransaction();
$query = 'SELECT MAX(' . $this->conn->quoteIdentifier($name, true) . ') FROM ' . $this->conn->quoteIdentifier($table, true);
$start = $this->db->queryOne($query, 'integer');
if (PEAR::isError($start)) {
return $start;
}
++$start;
$result = $this->createSequence($table, $start);
$db->commit();
$this->conn->commit();
} else {
$result = $this->createSequence($table, $start);
}
/**
if (PEAR::isError($result)) {
return $db->raiseError($result, null, null,
return $this->conn->raiseError($result, null, null,
'sequence for autoincrement PK could not be created', __FUNCTION__);
}
*/
......@@ -160,7 +165,8 @@ END;
* @param string $table name of the table
* @return void
*/
public function dropAutoincrement($table) {
public function dropAutoincrement($table)
{
$table = strtoupper($table);
$trigger_name = $table . '_AI_PK';
$trigger_name_quoted = $this->conn->getDbh()->quote($trigger_name);
......@@ -169,7 +175,7 @@ END;
$trigger = $this->conn->fetchOne($query);
if($trigger) {
$trigger_name = $db->quoteIdentifier($table . '_AI_PK', true);
$trigger_name = $this->conn->quoteIdentifier($table . '_AI_PK', true);
$trigger_sql = 'DROP TRIGGER ' . $trigger_name;
// if throws exception, trigger for autoincrement PK could not be dropped
......@@ -215,7 +221,8 @@ END;
*
* @return void
*/
public function createTable($name, $fields, $options = array()) {
public function createTable($name, $fields, $options = array())
{
$this->conn->beginTransaction();
$result = parent::createTable($name, $fields, $options);
......@@ -236,11 +243,12 @@ END;
* @param string $name name of the table that should be dropped
* @return void
*/
public function dropTable($name) {
//$db->beginNestedTransaction();
public function dropTable($name)
{
//$this->conn->beginNestedTransaction();
$result = $this->dropAutoincrement($name);
$result = parent::dropTable($name);
//$db->completeNestedTransaction();
//$this->conn->completeNestedTransaction();
return $result;
}
/**
......@@ -331,10 +339,11 @@ END;
* actually perform them otherwise.
* @return void
*/
public function alterTable($name, array $changes, $check) {
public function alterTable($name, array $changes, $check)
{
foreach ($changes as $change_name => $change) {
switch ($change_name) {
foreach ($changes as $changeName => $change) {
switch ($changeName) {
case 'add':
case 'remove':
case 'change':
......@@ -343,7 +352,7 @@ END;
break;
default:
return $this->conn->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null,
'change type "'.$change_name.'" not yet supported', __FUNCTION__);
'change type "'.$changeName.'" not yet supported', __FUNCTION__);
}
}
......@@ -408,7 +417,7 @@ END;
/**
* create sequence
*
* @param object $db database object that is extended by this class
* @param object $this->conn database object that is extended by this class
* @param string $seqName name of the sequence to be created
* @param string $start start value of the sequence; default is 1
* @return void
......@@ -422,7 +431,7 @@ END;
/**
* drop existing sequence
*
* @param object $db database object that is extended by this class
* @param object $this->conn database object that is extended by this class
* @param string $seqName name of the sequence to be dropped
* @return void
*/
......
......@@ -76,6 +76,11 @@ class Doctrine_DataDict_Mysql_TestCase extends Doctrine_Driver_UnitTestCase {
$this->assertEqual($this->dataDict->GetNativeDeclaration($a), 'TEXT');
}
public function testGetNativeDeclarationSupportsStringTypeWithLongLength() {
$a = array('type' => 'string', 'length' => 2000);
$this->assertEqual($this->dataDict->GetNativeDeclaration($a), 'TEXT');
}
public function testGetNativeDeclarationSupportsArrayType2() {
$a = array('type' => 'array');
......
......@@ -2,7 +2,6 @@
class Doctrine_Export_Pgsql_TestCase extends Doctrine_UnitTestCase {
public function testCreateDatabaseExecutesSql() {
$this->export->createDatabase('db');
$this->assertEqual($this->adapter->pop(), 'CREATE DATABASE db');
}
public function testDropDatabaseExecutesSql() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment