DBIx-ObjectMapper

 view release on metacpan or  search on metacpan

lib/DBIx/ObjectMapper/Metadata/Table.pm  view on Meta::CPAN

    my ( $type, @cond );
    if ( List::MoreUtils::all { exists $col{$_} } @{ $self->primary_key } ) {
        $type = undef;
        @cond = map{ $self->c($_) == $col{$_} } @{$self->primary_key};
    }
    else {
        for my $uinfo ( @{ $self->unique_key } ) {
            if ( List::MoreUtils::all { exists $col{$_} } @{ $uinfo->[1] } ) {
                $type = $uinfo->[0];
                @cond = map { $self->c($_) == $col{$_} } @{ $uinfo->[1] };
            }
        }
    }

    return( $type, @cond );
}

sub insert {
    my $self = shift;
    my $query = $self->query_object->insert(
        $self->_insert_query_callback,
        $self->primary_key
    )->into( $self->table_name );
    $query->values(@_) if @_;
    return $query;
}

sub _insert_query_callback {
    my $self = shift;

    return sub {
        my $query = shift;
        my $dbh = shift;
        my $input_val = $query->values;
        return unless ref($input_val) eq 'HASH'; # XXXXX

        my %context = %$input_val;
        for my $c ( @{ $self->columns } ) {
            my $val = $c->to_storage(
                \%context,
                $dbh,
            );
            if( defined $val ) {
                $input_val->{ $c->name } = $val;
            }
            elsif( exists $input_val->{ $c->name } ) {
                delete $input_val->{ $c->name };
            }
        }
    };
}

sub delete {
    my $self = shift;
    my $query = $self->query_object->delete( $self->_delete_query_callback )
        ->table( $self->table_name );
    $query->where(@_) if @_;
    return $query;
}

sub _delete_query_callback { undef } # TODO cascade delete

sub update {
    my $self = shift;
    my ( $data, $cond ) = @_;
    my $query = $self->query_object->update( $self->_update_query_callback )
        ->table( $self->table_name );
    $query->set(%$data) if $data;
    $query->where( @$cond ) if $cond;
    return $query;
}

sub _update_query_callback {
    my $self = shift;

    return sub {
        my $query = shift;
        my $engine = shift;

        my %context = %{$query->set};
        for my $c ( @{ $self->columns } ) {
            my $val = $c->to_storage_on_update(
                \%context,
                $self->engine->dbh,
            );
            $query->set->{ $c->name } = $val if defined $val;
        }
    };
}

=head2 clone

=cut

sub clone {
    my $self = shift;
    my $alias = shift;

    my %data = %$self;
    my $obj = bless \%data, ref $self;

    if( $alias ) {
        $obj->{table_name} = [ $obj->table_name, $alias ];
        my @columns;
        for my $c ( @{$obj->columns} ) {
            my $new_col = $c->clone;
            $new_col->{table} = $alias;
            push @columns, $new_col;
        }
        $obj->{columns} = \@columns;
    }

    return $obj;
}

*as =\&clone;

=head2 is_clone

=cut



( run in 0.833 second using v1.01-cache-2.11-cpan-39bf76dae61 )