diff --git a/recess/lib/recess/apps/tools/controllers/RecessToolsAppsController.class.php b/recess/lib/recess/apps/tools/controllers/RecessToolsAppsController.class.php index 6a3ccd7..19e9af4 100644 --- a/recess/lib/recess/apps/tools/controllers/RecessToolsAppsController.class.php +++ b/recess/lib/recess/apps/tools/controllers/RecessToolsAppsController.class.php @@ -217,8 +217,12 @@ public function generateModel($app) { $property->isPrimaryKey = true; } if($types[$i] == 'Integer Autoincrement') { - $property->type = RecessType::INTEGER; - $property->isAutoIncrement = true; + if($property->isPrimaryKey) { + $property->type = RecessType::INTEGER; + $property->isAutoIncrement = true; + } else { + $property->type = RecessType::INTEGER; + } } else { $property->type = $types[$i]; } diff --git a/recess/lib/recess/database/pdo/MysqlDataSourceProvider.class.php b/recess/lib/recess/database/pdo/MysqlDataSourceProvider.class.php index 75a053f..870a9f7 100644 --- a/recess/lib/recess/database/pdo/MysqlDataSourceProvider.class.php +++ b/recess/lib/recess/database/pdo/MysqlDataSourceProvider.class.php @@ -6,7 +6,8 @@ * @author Kris Jordan */ class MysqlDataSourceProvider implements IPdoDataSourceProvider { - protected static $mappings; + protected static $mysqlToRecessMappings; + protected static $recessToMysqlMappings; protected $pdo = null; /** @@ -77,16 +78,19 @@ function getTableDefinition($table) { $tableDefinition->addColumn( $result['Field'], $this->getRecessType($result['Type']), - $result['Null'] == 'No' ? false : true, + $result['Null'] == 'NO' ? false : true, $result['Key'] == 'PRI' ? true : false, - $result['Default'] == null ? '' : $result['Default']); - array($result['Extra']); + $result['Default'] == null ? '' : $result['Default'], + $result['Extra'] == 'auto_increment' ? array('autoincrement' => true) : array()); } return $tableDefinition; } function getRecessType($mysqlType) { + if($mysqlType == 'TINYINT(1)') + return RecessType::BOOLEAN; + if( ($parenPos = strpos($mysqlType,'(')) !== false ) { $mysqlType = substr($mysqlType,0,$parenPos); } @@ -95,17 +99,17 @@ function getRecessType($mysqlType) { } $mysqlType = strtolower(rtrim($mysqlType)); - $mappings = MysqlDataSourceProvider::getMysqlToRecessMappings(); - if(isset($mappings[$mysqlType])) { - return $mappings[$mysqlType]; + $mysqlToRecessMappings = MysqlDataSourceProvider::getMysqlToRecessMappings(); + if(isset($mysqlToRecessMappings[$mysqlType])) { + return $mysqlToRecessMappings[$mysqlType]; } else { return RecessType::STRING; } } static function getMysqlToRecessMappings() { - if(!isset(self::$mappings)) { - self::$mappings = array( + if(!isset(self::$mysqlToRecessMappings)) { + self::$mysqlToRecessMappings = array( 'enum' => RecessType::STRING, 'binary' => RecessType::STRING, 'varbinary' => RecessType::STRING, @@ -147,7 +151,25 @@ static function getMysqlToRecessMappings() { 'time' => RecessType::TIME, ); } - return self::$mappings; + return self::$mysqlToRecessMappings; + } + + static function getRecessToMysqlMappings() { + if(!isset(self::$recessToMysqlMappings)) { + self::$recessToMysqlMappings = array( + RecessType::BLOB => 'BLOB', + RecessType::BOOLEAN => 'TINYINT(1)', + RecessType::DATE => 'DATE', + RecessType::DATETIME => 'DATETIME', + RecessType::FLOAT => 'FLOAT', + RecessType::INTEGER => 'INTEGER', + RecessType::STRING => 'VARCHAR(255)', + RecessType::TEXT => 'TEXT', + RecessType::TIME => 'TIME', + RecessType::TIMESTAMP => 'TIMESTAMP', + ); + } + return self::$recessToMysqlMappings; } /** @@ -175,7 +197,27 @@ function emptyTable($table) { * @param RecessTableDefinition $tableDefinition */ function createTableSql(RecessTableDefinition $definition) { - throw new RecessException("Not implemented.", get_defined_vars()); + $sql = 'CREATE TABLE ' . $definition->name; + + $mappings = MysqlDataSourceProvider::getRecessToMysqlMappings(); + + $columnSql = null; + foreach($definition->getColumns() as $column) { + if(isset($columnSql)) { $columnSql .= ', '; } + $columnSql .= "\n\t" . $column->name . ' ' . $mappings[$column->type]; + if($column->isPrimaryKey) { + $columnSql .= ' NOT NULL'; + + if(isset($column->options['autoincrement'])) { + $columnSql .= ' AUTO_INCREMENT'; + } + + $columnSql .= ' PRIMARY KEY'; + } + } + $columnSql .= "\n"; + + return $sql . ' (' . $columnSql . ')'; } } ?> \ No newline at end of file diff --git a/recess/lib/recess/database/pdo/SqliteDataSourceProvider.class.php b/recess/lib/recess/database/pdo/SqliteDataSourceProvider.class.php index c66d85c..ae7567a 100644 --- a/recess/lib/recess/database/pdo/SqliteDataSourceProvider.class.php +++ b/recess/lib/recess/database/pdo/SqliteDataSourceProvider.class.php @@ -136,12 +136,8 @@ function createTableSql(RecessTableDefinition $definition) { $columnSql .= "\n\t" . $column->name . ' ' . strtoupper($column->type); if($column->isPrimaryKey) { $columnSql .= ' PRIMARY KEY'; - } - if(isset($column->options['autoincrement'])) { - if($column->isPrimaryKey) { + if(isset($column->options['autoincrement'])) { $columnSql .= ' AUTOINCREMENT'; - } else { - throw new RecessException('Only primary key columns can be "Integer Autoincrement" in SQLite.', get_defined_vars()); } } }