Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/DataProvider/DBIDriver.pm  view on Meta::CPAN

    }

    my $r;
    unless ( $r = $self->__sth->fetchrow_hashref() )
    {
        $self->__sth->finish if $self->__sth;
        $self->__sth = undef;
        return;
    }
    return $r;
}

sub count
{
    my $self = shift;

    $self->__sth->finish if $self->__sth; #На всякий случай
    $self->__sth = undef;

    local $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::SELECT];
    local $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::WHAT];
    local $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::UNIQ];
    local $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::NO_QUOTE];
    local $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::LIMIT];

    my $res = $self->__select()->what('count(*) AS numRows')->no_quote(1)->next();

    $self->__sth->finish if $self->__sth;
    $self->__sth = undef;

    return $res->{numRows};
}

sub __select
{
    my $self = shift;
    $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::SELECT] = 'SELECT ' . join ' ', @_;
    return $self;
}

sub insert
{
    my $self = shift;
    $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::INSERT] = 'INSERT ' . (shift || '');
    return $self;
}

sub last_insert_id
{
    my $self = shift;
    return $self->handler->last_insert_id(@_);
}

sub delete
{
    my $self = shift;
    $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::DELETE] = 'DELETE ';
    return $self;
}

sub update
{
    my $self = shift;
    $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::UPDATE] = 'UPDATE ' . (shift || '');
    return $self;
}

sub _make_join
{
    my $self = shift;

    my $stJoin = {
        what   => '',
        source => '',
        where  => '',
    };

    if ( my $j = $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::JOIN] )
    {
        my $dbh = $self->handler();

        my $prevStJoin = $j->[1]->_make_join();
        my $q = $j->[1]->_cql_query;

        if ( $q->[&Ambrosia::DataProvider::BaseDriver::WHAT] && scalar @{$q->[&Ambrosia::DataProvider::BaseDriver::WHAT]} )
        {
            if ( $q->[&Ambrosia::DataProvider::BaseDriver::NO_QUOTE] )
            {
                $stJoin->{what} = ',' . CORE::join ',', @{$q->[&Ambrosia::DataProvider::BaseDriver::WHAT]};
            }
            else
            {
                my $type = join '_', grep defined $_, @{$q->[&Ambrosia::DataProvider::BaseDriver::SOURCE]};
                my $qType = $dbh->quote_identifier(@{$q->[&Ambrosia::DataProvider::BaseDriver::SOURCE]}) . '.';
                $stJoin->{what} = ',' . $qType . CORE::join ',' . $qType, map { $dbh->quote_identifier($_) . ' AS ' . $type . '_' . $_ } @{$q->[&Ambrosia::DataProvider::BaseDriver::WHAT]};
            }
            $stJoin->{what} .= $prevStJoin->{what};
        }

        $stJoin->{source} = ' ' . $j->[0] . ' JOIN ' . $dbh->quote_identifier(@{$q->[&Ambrosia::DataProvider::BaseDriver::SOURCE]})
            . ' ON ('
            . CORE::join(' AND ', map {
                    $dbh->quote_identifier($_->[0]) . $_->[1] . $dbh->quote_identifier($_->[2])
                } @{$q->[&Ambrosia::DataProvider::BaseDriver::ON]})
            . ')';

        $stJoin->{source} .= $prevStJoin->{source};

        $stJoin->{where} = ' AND ' . $self->_make_where($dbh->quote_identifier(@{$q->[&Ambrosia::DataProvider::BaseDriver::SOURCE]}), $q->[&Ambrosia::DataProvider::BaseDriver::PREDICATE]) if $q->[&Ambrosia::DataProvider::BaseDriver::PREDICATE];
        $stJoin->{where} .= $prevStJoin->{where};
    }
    return $stJoin;
}

sub __what
{
    my $dbh = shift;
    my $source = shift;
    my $distinct = shift;
    my $fields = shift;
    my $noQuote = shift;



( run in 0.904 second using v1.01-cache-2.11-cpan-13bb782fe5a )