wikimedia/mediawiki-core

View on GitHub
includes/libs/rdbms/dbal/MWPostgreSqlPlatform.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php

namespace Wikimedia\Rdbms;

use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Wikimedia\Timestamp\ConvertibleTimestamp;

class MWPostgreSqlPlatform extends PostgreSQLPlatform {
    /**
     * Handles Postgres unique timestamp format
     * @inheritDoc
     *
     * @param mixed[] $column The column definition array.
     * @return string Postgres specific SQL code portion needed to set a default value.
     */
    public function getDefaultValueDeclarationSQL( $column ) {
        $type = $column['type'];
        $default = $column['default'] ?? null;

        if ( $type instanceof TimestampType && $default ) {
            if ( isset( $column['allowInfinite'] ) &&
                $column['allowInfinite'] &&
                $default === 'infinity'
            ) {
                $pgTimestamp = $default;
            } else {
                $timestamp = new ConvertibleTimestamp( $default );
                $pgTimestamp = $timestamp->getTimestamp( TS_POSTGRES );
            }

            return " DEFAULT '$pgTimestamp' ";
        }

        return parent::getDefaultValueDeclarationSQL( $column );
    }

    /**
     * @inheritDoc
     * phpcs:disable PSR2.Methods.MethodDeclaration.Underscore
     */
    protected function _getCreateTableSQL( $name, $columns, array $options = [] ) {
        // phpcs:enable
        $tableSql = parent::_getCreateTableSQL( $name, $columns, $options );
        foreach ( $columns as $column ) {
            if ( $column['type'] instanceof EnumType && $column['fixed'] ) {
                // PostgreSQL does support ENUM datatype but they need to be
                // created severally with CREATE TYPE command for each column
                // as it's not possible to feed the values directly in the
                // column declaration as it could be done in MySQL.
                $typeSql = $column['type']->makeEnumTypeSql( $column, $this );
                array_unshift( $tableSql, $typeSql );
            }
        }

        return $tableSql;
    }

    /**
     * @inheritDoc
     */
    public function getBlobTypeDeclarationSQL( array $column ) {
        // MySQL goes with varbinary for collation reasons, but postgres can't
        // properly understand BYTEA type and works just fine with TEXT type
        // FIXME: This should be fixed at some point (T257755)
        return 'TEXT';
    }

    /**
     * @inheritDoc
     */
    public function getBinaryTypeDeclarationSQL( array $column ) {
        // MySQL goes with varbinary for collation reasons, but postgres can't
        // properly understand BYTEA type and works just fine with TEXT type
        // FIXME: This should be fixed at some point (T257755)
        return 'TEXT';
    }

    /**
     * @inheritDoc
     */
    public function getFloatDeclarationSQL( array $column ) {
        return 'FLOAT';
    }

    /**
     * @inheritDoc
     */
    public function getDateTimeTzTypeDeclarationSQL( array $column ) {
        return 'TIMESTAMPTZ';
    }
}