. */ namespace Doctrine\DBAL\Schema; /** * SqliteSchemaManager * * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @author Konsta Vesterinen * @author Lukas Smith (PEAR MDB2 library) * @author Jonathan H. Wage * @version $Revision$ * @since 2.0 */ class SqliteSchemaManager extends AbstractSchemaManager { /** * {@inheritdoc} * * @override */ public function dropDatabase($database) { if (file_exists($database)) { unlink($database); } } /** * {@inheritdoc} * * @override */ public function createDatabase($database) { $params = $this->_conn->getParams(); $driver = $params['driver']; $options = array( 'driver' => $driver, 'path' => $database ); $conn = \Doctrine\DBAL\DriverManager::getConnection($options); $conn->connect(); $conn->close(); } protected function _getPortableTableDefinition($table) { return $table['name']; } /** * @license New BSD License * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html * @param array $tableIndexes * @param string $tableName * @return array */ protected function _getPortableTableIndexesList($tableIndexes, $tableName=null) { $indexBuffer = array(); // fetch primary $stmt = $this->_conn->executeQuery( "PRAGMA TABLE_INFO ('$tableName')" ); $indexArray = $stmt->fetchAll(\PDO::FETCH_ASSOC); foreach($indexArray as $indexColumnRow) { if($indexColumnRow['pk'] == "1") { $indexBuffer[] = array( 'key_name' => 'primary', 'primary' => true, 'non_unique' => false, 'column_name' => $indexColumnRow['name'] ); } } // fetch regular indexes foreach($tableIndexes as $tableIndex) { // Ignore indexes with reserved names, e.g. autoindexes if (strpos($tableIndex['name'], 'sqlite_') !== 0) { $keyName = $tableIndex['name']; $idx = array(); $idx['key_name'] = $keyName; $idx['primary'] = false; $idx['non_unique'] = $tableIndex['unique']?false:true; $stmt = $this->_conn->executeQuery( "PRAGMA INDEX_INFO ( '{$keyName}' )" ); $indexArray = $stmt->fetchAll(\PDO::FETCH_ASSOC); foreach ( $indexArray as $indexColumnRow ) { $idx['column_name'] = $indexColumnRow['name']; $indexBuffer[] = $idx; } } } return parent::_getPortableTableIndexesList($indexBuffer, $tableName); } protected function _getPortableTableIndexDefinition($tableIndex) { return array( 'name' => $tableIndex['name'], 'unique' => (bool) $tableIndex['unique'] ); } protected function _getPortableTableColumnDefinition($tableColumn) { $e = explode('(', $tableColumn['type']); $tableColumn['type'] = $e[0]; if (isset($e[1])) { $length = trim($e[1], ')'); $tableColumn['length'] = $length; } $dbType = strtolower($tableColumn['type']); $length = isset($tableColumn['length']) ? $tableColumn['length'] : null; $unsigned = (boolean) isset($tableColumn['unsigned']) ? $tableColumn['unsigned'] : false; $fixed = false; $type = $this->_platform->getDoctrineTypeMapping($dbType); $default = $tableColumn['dflt_value']; if ($default == 'NULL') { $default = null; } if ($default !== null) { // SQLite returns strings wrapped in single quotes, so we need to strip them $default = preg_replace("/^'(.*)'$/", '\1', $default); } $notnull = (bool) $tableColumn['notnull']; if ( ! isset($tableColumn['name'])) { $tableColumn['name'] = ''; } $precision = null; $scale = null; switch ($dbType) { case 'char': $fixed = true; break; case 'float': case 'double': case 'real': case 'decimal': case 'numeric': if (isset($tableColumn['length'])) { list($precision, $scale) = array_map('trim', explode(', ', $tableColumn['length'])); } $length = null; break; } $options = array( 'length' => $length, 'unsigned' => (bool) $unsigned, 'fixed' => $fixed, 'notnull' => $notnull, 'default' => $default, 'precision' => $precision, 'scale' => $scale, 'autoincrement' => false, ); return new Column($tableColumn['name'], \Doctrine\DBAL\Types\Type::getType($type), $options); } protected function _getPortableViewDefinition($view) { return new View($view['name'], $view['sql']); } }