Geoffrey

 view release on metacpan or  search on metacpan

lib/Geoffrey/Action/Column.pm  view on Meta::CPAN

package Geoffrey::Action::Column;

use utf8;
use 5.016;
use strict;
use warnings;

$Geoffrey::Action::Column::VERSION = '0.000206';

use parent 'Geoffrey::Role::Action';

sub add {
    my ($self, $hr_params, $constraint) = @_;
    require Ref::Util;
    if (!Ref::Util::is_hashref($hr_params)) {
        require Geoffrey::Exception::General;
        Geoffrey::Exception::General::throw_wrong_ref(__PACKAGE__ . '::add', 'hash');
    }
    return $self->appending($hr_params->{table}, $hr_params, $constraint) if $self->for_table;
    my $tables = $self->converter->table;
    if (!$tables || !$tables->can('add_column')) {
        require Geoffrey::Exception::NotSupportedException;
        Geoffrey::Exception::NotSupportedException::throw_column('add', $self->converter);
    }
    if (defined $hr_params->{primarykey}) {
        require Geoffrey::Exception::RequiredValue;
        Geoffrey::Exception::RequiredValue::throw_column_default($hr_params->{table},
            $hr_params->{name});
    }
    require Geoffrey::Utils;
    my $sql = Geoffrey::Utils::replace_spare(
        $tables->add_column,
        [
            $hr_params->{table},
            (
                join q/ /,
                (
                    $hr_params->{name}, $self->converter()->type($hr_params),
                    $constraint // (), $self->defaults($hr_params) // ()))]);
    return $self->do($sql);

}

sub drop {
    my ($self, $hr_params) = @_;
    require Ref::Util;
    if (!Ref::Util::is_hashref($hr_params)) {
        require Geoffrey::Exception::General;
        Geoffrey::Exception::General::throw_wrong_ref(__PACKAGE__ . '::drop', 'hash');
    }
    my $table = $self->converter->table;
    if (!$table || !$table->can('drop_column')) {
        require Geoffrey::Exception::NotSupportedException;
        Geoffrey::Exception::NotSupportedException::throw_column('drop', $self->converter);
    }
    require Geoffrey::Utils;
    return [
        map {
            $self->do(
                Geoffrey::Utils::replace_spare($table->drop_column, [$hr_params->{table}, $_]))
        } @{$hr_params->{dropcolumn}}];
}

sub list_from_schema {
    my ($self, $schema, $table) = @_;
    my $converter = $self->converter;
    return $converter->colums_information(
        $self->do_arrayref($converter->table->s_list_columns($schema), [$table]));
}

sub appending {
    my ($self, $s_table_name, $hr_params, $constraint) = @_;
    my $b_primarykey = (defined $hr_params->{primarykey}) ? 1 : 0;
    my $b_has_value = (exists $hr_params->{default} || exists $hr_params->{foreignkey}) ? 1 : 0;
    if ($b_primarykey && !$b_has_value) {
        require Geoffrey::Exception::RequiredValue;
        Geoffrey::Exception::RequiredValue::throw_column_default($s_table_name, $hr_params->{name});
    }
    return join q/ /,
        (
        $hr_params->{name}, $self->converter()->type($hr_params),
        $constraint,        $self->defaults($hr_params),
        );
}

sub defaults {
    my ($self, $params) = @_;
    return () if !defined $params->{default};
    my $defaults       = $self->converter()->defaults;
    my $default_by_key = $defaults->{$params->{default}};

    unless ($default_by_key) {
        return 'DEFAULT ' . $params->{default} if $params->{default} eq q/''/;
        return 'DEFAULT ' . $self->converter()->convert_defaults($params);
    }

    if ($params->{default} eq 'autoincrement') {
        return $self->sequences->add($params) if $defaults->{$params->{default}} eq 'sequence';
        return $defaults->{$params->{default}};
    }
    elsif (defined $defaults->{$params->{default}}) {
        return 'DEFAULT ' . $defaults->{$params->{default}};
    }
    return ();
}

1;



( run in 1.394 second using v1.01-cache-2.11-cpan-98e64b0badf )