Dancer2-Plugin-Pg

 view release on metacpan or  search on metacpan

lib/Dancer2/Plugin/Pg/Core.pm  view on Meta::CPAN

sub selectOne {
    my $self = shift;
    
    my $result = $self->dbh->selectrow_arrayref(shift, undef, @_);
    die $self->dbh->errstr if $self->dbh->err;
    return $result->[0];
}

sub selectRow {
    my $self = shift;
    
    my $result = $self->dbh->selectrow_hashref(shift, undef, @_);
    die $self->dbh->errstr if $self->dbh->err;
    return $result;
}

sub selectAll {
    my $self = shift;
    
    my $result = $self->dbh->selectall_arrayref(shift, {Slice=>{}}, @_);
    die $self->dbh->errstr if $self->dbh->err;
    return [] unless $result;
    return [$result] unless ref($result) eq 'ARRAY';
    return $result;
}

sub column {
    my ($self, $key, $value) = @_;
    
    push(@{$self->keys}, $key);
    if (ref($value) eq 'HASH') {
        push(@{$self->type}, keys %{$value});
        push(@{$self->values}, values %{$value});
    }else{
        push(@{$self->type}, undef);
        push(@{$self->values}, $value);
    }
    push(@{$self->reference}, '?');
}

sub insert {
    my $self = shift;
    
    my $sql = 'INSERT INTO ' . $self->table . ' (';
    $sql .= join(',',@{$self->keys});
    $sql .= ') VALUES (';
    $sql .= join(',', @{$self->reference});
    $sql .= ')';
    $sql .= ' RETURNING ' . $self->returning if $self->returning;
    my $sth = $self->query($sql, @{$self->values});
    $self->_clean unless $self->returning;
    return 0 unless $sth;
    if ($self->returning && $sth->rows > 0) {
        return $self->_getReturning($sth, $self->returning);
    }else{
        $self->_clean;
    }
    return $sth || 1;
}

sub update {
    my ($self, %wheres) = @_;
    
    my $sql = undef;
    for(my $i=0; $i<scalar(@{$self->keys}); $i++){
        unless($sql){
            $sql = 'UPDATE ' . $self->table . ' SET ';
            if (${$self->type}[$i]) {
                $sql .= ${$self->keys}[$i] . ' ' . ${$self->type}[$i] . ' ?';
            }else{
                $sql .= ${$self->keys}[$i] . ' = ?';
            }
        }else{
            if (${$self->type}[$i]) {
                $sql .= ', ' . ${$self->keys}[$i] . ' ' . ${$self->type}[$i] . ' ?';
            }else{
                $sql .= ', ' . ${$self->keys}[$i] . ' = ?';
            }
        }
    }
    my $where = '';
    foreach(keys %wheres){
        if ($_ =~ /and|or/i) {
            foreach my $key (keys %{$wheres{$_}}){
                $where .= ' ' . uc($_) if $where;
                if (ref($wheres{$_}{$key}) eq 'HASH') {
                    $where .= ' ' . $key;
                    $where .= ' ' . $_ . ' ?' for(keys %{$wheres{$_}{$key}});
                    push(@{$self->values}, values %{$wheres{$_}{$key}});
                }else{
                    $where .= ' ' . $key . ' = ?';
                    push(@{$self->values}, $wheres{$_}{$key});
                }
            }
        }else{
            $where .= ' AND' if $where;
            if (ref($wheres{$_}) eq 'HASH') {
                $where .= ' ' . $_;
                $where .= ' ' . $_ . ' ?' for(keys %{$wheres{$_}});
                push(@{$self->values}, values %{$wheres{$_}});
            }else{
                $where .= ' ' . $_ . ' = ?';
                push(@{$self->values}, $wheres{$_});
            }
        }
    }
    $sql .= ' WHERE' . $where;
    $sql .= ' RETURNING ' . $self->returning if $self->returning;
    my $sth = $self->query($sql, @{$self->values});
    $self->_clean unless $self->returning;
    return 0 unless $sth;
    if ($self->returning && $sth->rows > 0) {
        return $self->_getReturning($sth, $self->returning);
    }else{
        $self->_clean;
    }
    return $sth || 1;
}

sub delete {
    my ($self, %wheres) = @_;



( run in 2.096 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )