AxKit-XSP-ESQL

 view release on metacpan or  search on metacpan

ESQL.pm  view on Meta::CPAN

# DBI->trace(1);

sub new_query {
    unshift @RESULTS, {};
    unshift @NAMES, [];
    unshift @STH, undef;
    unshift @COUNT, 0;
#    warn "new_query: ", scalar @STH, "\n";
}

sub end_query {
    shift @RESULTS;
    shift @NAMES;
    my $sth = shift @STH;
    $sth->finish();
    shift @COUNT;
#    warn "end_query: ", scalar @STH, "\n";
}

sub prepare {
    my ($dbh, $query) = @_;
    $STH[0] = $dbh->prepare($query);
}

sub execute {
    my (@params) = set_null_params(@_);
    my $rv = $STH[0]->execute(@params);
    $NAMES[0] = $STH[0]->{NAME_lc};
    my %hash;
    my $rc = $STH[0]->bind_columns(\@hash{ @{$NAMES[0]} });
    $RESULTS[0] = \%hash;
    return $rv;
}

sub execute_from_update {
    my (@params) = set_null_params(@_);
    return $STH[0]->execute(@params);
}

sub set_null_params {
    map { $_ eq 'NULL' ? undef : $_ } @_;
}

sub get_sth {
    my ($ancestor) = @_;
    $ancestor ||= 0;
    $STH[$ancestor];
}

sub get_row {
    my ($ancestor) = @_;
    $ancestor ||= 0;
    my $res = $STH[$ancestor]->fetch;
    $COUNT[$ancestor]++ if $res;
    return $res;
}

sub get_column {
    my ($column, $ancestor) = @_;
    $ancestor ||= 0;
    if (DBI::looks_like_number($column)) {
        return $RESULTS[$ancestor]{ $NAMES[$ancestor][$column - 1] };
    }
    else {
        return $RESULTS[$ancestor]{$column};
    }
}

sub column_name {
    my ($column, $ancestor) = @_;
    $ancestor ||= 0;
    return $STH[$ancestor]->{NAME}->[column_number($column)];
}

sub column_number {
    my ($col, $ancestor) = @_;
    $ancestor ||= 0;
    if (DBI::looks_like_number($col)) {
        return $col - 1;
    }
    else {
        my $num = 0;
        for (@{$NAMES[$ancestor]}) {
            last if $_ eq $col;
            $num++;
        }
        return $num;
    }
}

sub get_columns {
    my ($ancestor) = @_;
    $ancestor ||= 0;
    return @{$NAMES[$ancestor]};
}

sub get_count {
    my ($ancestor) = @_;
    $ancestor ||= 0;
    warn("get_count: returning " . $COUNT[$ancestor] . "\n");
    return $COUNT[$ancestor];
}

sub parse_char {
    my ($e, $text) = @_;

    if ($e->current_element() ne 'query') {
        $text =~ s/^\s*//;
        $text =~ s/\s*$//;
    }

    return '' unless $text;

    $text =~ s/\|/\\\|/g;
    return ". q|$text|";
}

sub parse_start {
    my ($e, $tag, %attribs) = @_;
    
    if ($tag eq 'connection') {
        $e->manage_text(0);
        return "{\nmy (\$dbh, \$connect_count, \$driver, \$transactions, \$dburl, \$user, \$pass);\n";
    }
    elsif ($tag eq 'driver') {
        my $transactions = 1;
        if (lc($attribs{transactions}) eq 'no') {
            $transactions = 0;
        }
        elsif (lc($attribs{transactions}) eq 'yes') {
            $transactions = 1;
        }
        elsif (exists($attribs{transactions})) {
            die "<esql:driver transactions='$attribs{transactions}'> is invalid. Use 'yes' or 'no'";
        }
        
        return '$transactions = ' . $transactions . ';$driver = "dbi:"';
    }



( run in 0.656 second using v1.01-cache-2.11-cpan-483215c6ad5 )