Alzabo

 view release on metacpan or  search on metacpan

lib/Alzabo/RDBMSRules/PostgreSQL.pm  view on Meta::CPAN

    $self->{state}{rename_sequence_sql}{ $p{new}->name } = 1;

    return @sql;
}

sub drop_foreign_key_sql
{
    my $self = shift;
    my $fk = shift;

    if ( grep { $_->is_primary_key } $fk->columns_from )
    {
        return unless $fk->from_is_dependent;
    }

    return () if $self->{state}{drop_fk_sql}{ $fk->id };

    $self->{state}{drop_fk_sql}{ $fk->id } = 1;

    return 'ALTER TABLE "' . $fk->table_from->name . '" DROP CONSTRAINT '
           . $self->_fk_name($fk);
}

sub drop_index_sql
{
    my $self = shift;
    my $index = shift;

    return 'DROP INDEX "' . $index->id . '"';
}

sub column_sql_add
{
    my $self = shift;
    my $col = shift;

    return () if $self->{state}{table_sql}{ $col->table->name };

    # Skip default and not null while adding column
    my @sql = 'ALTER TABLE "' . $col->table->name . '" ADD COLUMN ' . $self->column_sql($col, { skip_default => 1, skip_nullable => 1 });

    my $def = $self->_default_for_column($col);
    if ($def)
    {
        push @sql,
            ( 'ALTER TABLE "' . $col->table->name . '" ALTER COLUMN "' .
              $col->name . qq|" SET DEFAULT $def| );
    }

    if ( ! $col->nullable )
    {
        push @sql,
            ( 'UPDATE "' . $col->table->name
              . '" SET "' . $col->name . qq|" = $def WHERE "|
              . $col->name . '" IS NULL'
            );

        push @sql,
            ( 'ALTER TABLE "' . $col->table->name
              . '" ADD CONSTRAINT "'
              . $col->table->name . '_' . $col->name . '_not_null" CHECK ( "'
              . $col->name . '" IS NOT NULL )'
            );
    }

    return @sql;
}

sub column_sql_diff
{
    my $self = shift;
    my %p = @_;

    return $self->drop_column_sql( new_table => $p{new}->table,
                                   old => $p{old} )
        unless $self->_columns_are_equivalent( $p{new}, $p{old} );

    return;
}

sub _columns_are_equivalent
{
    my $self = shift;
    my $new = shift;
    my $old = shift;

    return 0 unless $self->_types_are_equivalent( $new, $old );

    return 0 unless $self->_defaults_are_equivalent( $new, $old );

    return 0 unless $new->sequenced == $old->sequenced;

    my $new_att = join "\0", sort $new->attributes;
    $new_att ||= '';

    my $old_att = join "\0", sort $old->attributes;
    $old_att ||= '';

    return 0 unless $new_att eq $old_att;

    return 1;
}

{
    my %CanonicalTypes =
        ( BOOL    => 'BOOLEAN',
          INT     => 'INTEGER',
          INT4    => 'INTEGER',
          INT2    => 'SMALLINT',
          INT8    => 'BIGINT',
          VARBIT  => 'BIT VARYING',
          VARCHAR => 'CHARACTER VARYING',
          CHAR    => 'CHARACTER',
          FLOAT   => 'DOUBLE PRECISION',
          FLOAT8  => 'DOUBLE PRECISION',
          FLOAT4  => 'REAL',
          DECIMAL => 'NUMERIC',
        );

    sub _types_are_equivalent
    {



( run in 0.474 second using v1.01-cache-2.11-cpan-ceb78f64989 )