. */ namespace Doctrine\DBAL\Schema; use Doctrine\DBAL\Platforms\AbstractPlatform; /** * The abstract asset allows to reset the name of all assets without publishing this to the public userland. * * This encapsulation hack is necessary to keep a consistent state of the database schema. Say we have a list of tables * array($tableName => Table($tableName)); if you want to rename the table, you have to make sure * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 2.0 * @version $Revision$ * @author Benjamin Eberlei */ abstract class AbstractAsset { /** * @var string */ protected $_name; protected $_quoted = false; /** * Set name of this asset * * @param string $name */ protected function _setName($name) { if (strlen($name)) { // TODO: find more elegant way to solve this issue. if ($name[0] == '`') { $this->_quoted = true; $name = trim($name, '`'); } else if ($name[0] == '"') { $this->_quoted = true; $name = trim($name, '"'); } } $this->_name = $name; } /** * Return name of this schema asset. * * @return string */ public function getName() { return $this->_name; } /** * Get the quoted representation of this asset but only if it was defined with one. Otherwise * return the plain unquoted value as inserted. * * @param AbstractPlatform $platform * @return string */ public function getQuotedName(AbstractPlatform $platform) { return ($this->_quoted) ? $platform->quoteIdentifier($this->_name) : $this->_name; } /** * Generate an identifier from a list of column names obeying a certain string length. * * This is especially important for Oracle, since it does not allow identifiers larger than 30 chars, * however building idents automatically for foreign keys, composite keys or such can easily create * very long names. * * @param array $columnNames * @param string $postfix * @param int $maxSize * @return string */ protected function _generateIdentifierName($columnNames, $postfix='', $maxSize=30) { $columnCount = count($columnNames); $postfixLen = strlen($postfix); $parts = array_map(function($columnName) use($columnCount, $postfixLen, $maxSize) { return substr($columnName, -floor(($maxSize-$postfixLen)/$columnCount - 1)); }, $columnNames); $parts[] = $postfix; $identifier = trim(implode("_", $parts), '_'); // using implicit schema support of DB2 and Postgres there might be dots in the auto-generated // identifier names which can easily be replaced by underscores. $identifier = str_replace(".", "_", $identifier); if (is_numeric(substr($identifier, 0, 1))) { $identifier = "i" . substr($identifier, 0, strlen($identifier)-1); } return $identifier; } }