1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
<?php
namespace Wikimedia\Rdbms;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Types\Type;
use InvalidArgumentException;
/**
* @experimental
* @unstable
*/
class DoctrineSchemaBuilderFactory {
/**
* @param string $platform one of strings 'mysql', 'postgres' or 'sqlite'
* @return DoctrineSchemaBuilder
*/
public function getSchemaBuilder( string $platform ) {
return new DoctrineSchemaBuilder( $this->getPlatform( $platform ) );
}
/**
* @param string $platform one of strings 'mysql', 'postgres' or 'sqlite'
* @return DoctrineSchemaChangeBuilder
*/
public function getSchemaChangeBuilder( $platform ) {
return new DoctrineSchemaChangeBuilder( $this->getPlatform( $platform ) );
}
/**
* @param string $platform
* @return AbstractPlatform
*/
private function getPlatform( string $platform ) {
switch ( $platform ) {
case 'mysql':
$platformObject = new MWMySQLPlatform;
break;
case 'postgres':
$platformObject = new MWPostgreSqlPlatform;
break;
case 'sqlite':
$platformObject = new SqlitePlatform;
break;
default:
throw new InvalidArgumentException( 'Unknown platform: ' . $platform );
}
$customTypes = [
'Enum' => [ EnumType::class, EnumType::ENUM ],
'Tinyint' => [ TinyIntType::class, TinyIntType::TINYINT ],
'Timestamp' => [ TimestampType::class, TimestampType::TIMESTAMP ],
];
foreach ( $customTypes as $type => [ $class, $name ] ) {
if ( !Type::hasType( $name ) ) {
Type::addType( $name, $class );
}
$platformObject->registerDoctrineTypeMapping( $type, $name );
}
return $platformObject;
}
}
|