Fixed sqlite connection function binding issue when using Doctrine_Db as well as added proper primary key handling for export methods
This commit is contained in:
parent
56ff937833
commit
65ebec5aa9
@ -138,4 +138,62 @@ class Doctrine_Connection_Mssql extends Doctrine_Connection
|
|||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* return version information about the server
|
||||||
|
*
|
||||||
|
* @param bool $native determines if the raw version string should be returned
|
||||||
|
* @return mixed array/string with version information or MDB2 error object
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function getServerVersion($native = false)
|
||||||
|
{
|
||||||
|
if ($this->connected_server_info) {
|
||||||
|
$serverInfo = $this->connected_server_info;
|
||||||
|
} else {
|
||||||
|
$query = 'SELECT @@VERSION';
|
||||||
|
$serverInfo = $this->fetchOne($query);
|
||||||
|
}
|
||||||
|
// cache server_info
|
||||||
|
$this->connected_server_info = $serverInfo;
|
||||||
|
if ( ! $native) {
|
||||||
|
if (preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $serverInfo, $tmp)) {
|
||||||
|
$serverInfo = array(
|
||||||
|
'major' => $tmp[1],
|
||||||
|
'minor' => $tmp[2],
|
||||||
|
'patch' => $tmp[3],
|
||||||
|
'extra' => null,
|
||||||
|
'native' => $serverInfo,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$serverInfo = array(
|
||||||
|
'major' => null,
|
||||||
|
'minor' => null,
|
||||||
|
'patch' => null,
|
||||||
|
'extra' => null,
|
||||||
|
'native' => $serverInfo,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $serverInfo;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Checks if there's a sequence that exists.
|
||||||
|
*
|
||||||
|
* @param string $seq_name The sequence name to verify.
|
||||||
|
* @return boolean The value if the table exists or not
|
||||||
|
*/
|
||||||
|
public function checkSequence($seqName)
|
||||||
|
{
|
||||||
|
$query = 'SELECT * FROM ' . $seqName;
|
||||||
|
try {
|
||||||
|
$this->exec($query);
|
||||||
|
} catch(Doctrine_Connection_Exception $e) {
|
||||||
|
if ($e->getPortableCode() == Doctrine::ERR_NOSUCHTABLE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ class Doctrine_Connection_Sqlite extends Doctrine_Connection_Common
|
|||||||
$this->options['server_version'] = '';
|
$this->options['server_version'] = '';
|
||||||
*/
|
*/
|
||||||
parent::__construct($manager, $adapter);
|
parent::__construct($manager, $adapter);
|
||||||
$this->initFunctions();
|
//$this->initFunctions();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* initializes database functions missing in sqlite
|
* initializes database functions missing in sqlite
|
||||||
|
@ -144,7 +144,7 @@ class Doctrine_Export extends Doctrine_Connection_Module
|
|||||||
}
|
}
|
||||||
$queryFields = $this->getFieldDeclarationList($fields);
|
$queryFields = $this->getFieldDeclarationList($fields);
|
||||||
|
|
||||||
if (!empty($options['primary'])) {
|
if (isset($options['primary']) && ! empty($options['primary'])) {
|
||||||
$queryFields.= ', PRIMARY KEY('.implode(', ', array_values($options['primary'])).')';
|
$queryFields.= ', PRIMARY KEY('.implode(', ', array_values($options['primary'])).')';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ class Doctrine_Export_Mysql extends Doctrine_Export
|
|||||||
}
|
}
|
||||||
$query_fields = $this->getFieldDeclarationList($fields);
|
$query_fields = $this->getFieldDeclarationList($fields);
|
||||||
|
|
||||||
if ( ! empty($options['primary'])) {
|
if (isset($options['primary']) && ! empty($options['primary'])) {
|
||||||
$query_fields.= ', PRIMARY KEY(' . implode(', ', array_values($options['primary'])) . ')';
|
$query_fields.= ', PRIMARY KEY(' . implode(', ', array_values($options['primary'])) . ')';
|
||||||
}
|
}
|
||||||
$name = $this->conn->quoteIdentifier($name, true);
|
$name = $this->conn->quoteIdentifier($name, true);
|
||||||
@ -110,12 +110,12 @@ class Doctrine_Export_Mysql extends Doctrine_Export
|
|||||||
$optionStrings = array();
|
$optionStrings = array();
|
||||||
|
|
||||||
if (isset($options['comment'])) {
|
if (isset($options['comment'])) {
|
||||||
$optionStrings['comment'] = 'COMMENT = '.$this->dbh->quote($options['comment'], 'text');
|
$optionStrings['comment'] = 'COMMENT = ' . $this->dbh->quote($options['comment'], 'text');
|
||||||
}
|
}
|
||||||
if (isset($options['charset'])) {
|
if (isset($options['charset'])) {
|
||||||
$optionsSting['charset'] = 'DEFAULT CHARACTER SET '.$options['charset'];
|
$optionsSting['charset'] = 'DEFAULT CHARACTER SET ' . $options['charset'];
|
||||||
if (isset($options['collate'])) {
|
if (isset($options['collate'])) {
|
||||||
$optionStrings['charset'].= ' COLLATE '.$options['collate'];
|
$optionStrings['charset'].= ' COLLATE ' . $options['collate'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,6 +89,62 @@ class Doctrine_Export_Sqlite extends Doctrine_Export
|
|||||||
|
|
||||||
return $this->conn->exec($query);
|
return $this->conn->exec($query);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 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:
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function createTable($name, array $fields, array $options = array())
|
||||||
|
{
|
||||||
|
if ( ! $name) {
|
||||||
|
throw new Doctrine_Export_Exception('no valid table name specified');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($fields)) {
|
||||||
|
throw new Doctrine_Export_Exception('no fields specified for table '.$name);
|
||||||
|
}
|
||||||
|
$queryFields = $this->getFieldDeclarationList($fields);
|
||||||
|
|
||||||
|
$autoinc = false;
|
||||||
|
foreach($fields as $field) {
|
||||||
|
if(isset($field['autoincrement']) && $field['autoincrement']) {
|
||||||
|
$autoinc = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $autoinc && isset($options['primary']) && ! empty($options['primary'])) {
|
||||||
|
$queryFields.= ', PRIMARY KEY('.implode(', ', array_values($options['primary'])).')';
|
||||||
|
}
|
||||||
|
|
||||||
|
$name = $this->conn->quoteIdentifier($name, true);
|
||||||
|
$query = 'CREATE TABLE ' . $name . ' (' . $queryFields . ')';
|
||||||
|
|
||||||
|
return $this->conn->exec($query);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* create sequence
|
* create sequence
|
||||||
*
|
*
|
||||||
|
@ -1445,10 +1445,25 @@ abstract class Doctrine_Record extends Doctrine_Access implements Countable, Ite
|
|||||||
{
|
{
|
||||||
$this->_table->setEnumValues($column, $values);
|
$this->_table->setEnumValues($column, $values);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* option
|
||||||
|
* sets or retrieves an option
|
||||||
|
*
|
||||||
|
* @see Doctrine_Table::$options availible options
|
||||||
|
* @param mixed $name
|
||||||
|
* @param mixed $value
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
public function option($name, $value = null)
|
public function option($name, $value = null)
|
||||||
{
|
{
|
||||||
if ($value == null) {
|
if ($value == null) {
|
||||||
$this->_table->getOption($name);
|
if (is_array($name)) {
|
||||||
|
foreach ($name as $k => $v) {
|
||||||
|
$this->_table->setOption($k, $v);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return $this->_table->getOption($name);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->_table->setOption($name, $value);
|
$this->_table->setOption($name, $value);
|
||||||
}
|
}
|
||||||
|
@ -117,6 +117,10 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||||||
*
|
*
|
||||||
* -- name name of the component, for example component name of the GroupTable is 'Group'
|
* -- name name of the component, for example component name of the GroupTable is 'Group'
|
||||||
*
|
*
|
||||||
|
* -- declaringClass name of the table definition declaring class (when using inheritance the class
|
||||||
|
* that defines the table structure can be any class in the inheritance hierarchy,
|
||||||
|
* hence we need reflection to check out which class actually calls setTableDefinition)
|
||||||
|
*
|
||||||
* -- tableName database table name, in most cases this is the same as component name but in some cases
|
* -- tableName database table name, in most cases this is the same as component name but in some cases
|
||||||
* where one-table-multi-class inheritance is used this will be the name of the inherited table
|
* where one-table-multi-class inheritance is used this will be the name of the inherited table
|
||||||
*
|
*
|
||||||
@ -183,6 +187,8 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||||||
$method = new ReflectionMethod($this->options['name'], 'setTableDefinition');
|
$method = new ReflectionMethod($this->options['name'], 'setTableDefinition');
|
||||||
$class = $method->getDeclaringClass();
|
$class = $method->getDeclaringClass();
|
||||||
|
|
||||||
|
$this->options['declaringClass'] = $class;
|
||||||
|
|
||||||
if ( ! isset($this->options['tableName'])) {
|
if ( ! isset($this->options['tableName'])) {
|
||||||
$this->options['tableName'] = Doctrine::tableize($class->getName());
|
$this->options['tableName'] = Doctrine::tableize($class->getName());
|
||||||
}
|
}
|
||||||
@ -247,28 +253,7 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||||||
};
|
};
|
||||||
|
|
||||||
if ($this->getAttribute(Doctrine::ATTR_CREATE_TABLES)) {
|
if ($this->getAttribute(Doctrine::ATTR_CREATE_TABLES)) {
|
||||||
if (Doctrine::isValidClassname($class->getName())) {
|
$this->export();
|
||||||
try {
|
|
||||||
$columns = array();
|
|
||||||
foreach ($this->columns as $name => $column) {
|
|
||||||
$definition = $column[2];
|
|
||||||
$definition['type'] = $column[0];
|
|
||||||
$definition['length'] = $column[1];
|
|
||||||
|
|
||||||
if ($definition['type'] == 'enum' && isset($definition['default'])) {
|
|
||||||
$definition['default'] = $this->enumIndex($name, $definition['default']);
|
|
||||||
}
|
|
||||||
if ($definition['type'] == 'boolean' && isset($definition['default'])) {
|
|
||||||
$definition['default'] = (int) $definition['default'];
|
|
||||||
}
|
|
||||||
$columns[$name] = $definition;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->conn->export->createTable($this->options['tableName'], $columns);
|
|
||||||
} catch(Exception $e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -290,6 +275,48 @@ class Doctrine_Table extends Doctrine_Configurable implements Countable
|
|||||||
}
|
}
|
||||||
$this->repository = new Doctrine_Table_Repository($this);
|
$this->repository = new Doctrine_Table_Repository($this);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* export
|
||||||
|
* exports this table to database based on column and option definitions
|
||||||
|
*
|
||||||
|
* @throws Doctrine_Connection_Exception if some error other than Doctrine::ERR_ALREADY_EXISTS
|
||||||
|
* occurred during the create table operation
|
||||||
|
* @return boolean whether or not the export operation was successful
|
||||||
|
* false if table already existed in the database
|
||||||
|
*/
|
||||||
|
public function export() {
|
||||||
|
if (Doctrine::isValidClassname($this->options['declaringClass']->getName())) {
|
||||||
|
try {
|
||||||
|
$columns = array();
|
||||||
|
$primary = array();
|
||||||
|
foreach ($this->columns as $name => $column) {
|
||||||
|
$definition = $column[2];
|
||||||
|
$definition['type'] = $column[0];
|
||||||
|
$definition['length'] = $column[1];
|
||||||
|
|
||||||
|
if ($definition['type'] == 'enum' && isset($definition['default'])) {
|
||||||
|
$definition['default'] = $this->enumIndex($name, $definition['default']);
|
||||||
|
}
|
||||||
|
if ($definition['type'] == 'boolean' && isset($definition['default'])) {
|
||||||
|
$definition['default'] = (int) $definition['default'];
|
||||||
|
}
|
||||||
|
$columns[$name] = $definition;
|
||||||
|
|
||||||
|
if(isset($definition['primary']) && $definition['primary']) {
|
||||||
|
$primary[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$options['primary'] = $primary;
|
||||||
|
|
||||||
|
$this->conn->export->createTable($this->options['tableName'], $columns, array_merge($this->options, $options));
|
||||||
|
} catch(Doctrine_Connection_Exception $e) {
|
||||||
|
// we only want to silence table already exists errors
|
||||||
|
if($e->getPortableCode !== Doctrine::ERR_ALREADY_EXISTS) {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* createQuery
|
* createQuery
|
||||||
* creates a new Doctrine_Query object and adds the component name
|
* creates a new Doctrine_Query object and adds the component name
|
||||||
|
Loading…
x
Reference in New Issue
Block a user