[Koha-patches] [PATCH] Bug 4333 Fix erroneous message re Active Currency

Galen Charlton gmcharlt at gmail.com
Fri Apr 16 13:31:39 CEST 2010


Hi,

This causes a crash when attempting to edit an existing currency:

DBI::st=HASH(0x97cce10)->_prepare(...): attribute parameter
'HASH(0x969ace8)SIMOLOEAN' is not a hash ref at
/usr/lib/perl5/DBD/mysql.pm line 224.
 at /usr/lib/perl5/DBD/mysql.pm line 224
	DBD::mysql::db::prepare('DBI::db=HASH(0x96b1470)', 'select * from
currency where currency=?', 'HASH(0x969ace8)SIMOLOEAN') called at
/usr/lib/perl5/DBI.pm line 1569
	DBD::_::db::_do_selectrow('fetchrow_hashref',
'DBI::db=HASH(0x96b1470)', 'select * from currency where currency=?',
'HASH(0x969ace8)SIMOLOEAN') called at /usr/lib/perl5/DBI.pm line 1578
	DBD::_::db::selectrow_hashref('DBI::db=HASH(0x96b1470)', 'select *
from currency where currency=?', 'HASH(0x969ace8)SIMOLOEAN') called at
/home/koha/koha1/dev/admin/currency.pl line 165
	main::add_form('SIMOLOEAN') called at
/home/koha/koha1/dev/admin/currency.pl line 72

Looking at the relevant call to selectrow_hashref, I see that a
punctuation mistake slipped in.

Please fix and resubmit.

Regards,

Galen

On Wed, Mar 24, 2010 at 5:21 AM, Colin Campbell
<colin.campbell at ptfs-europe.com> wrote:
> Script was incorrectly asking user to define an active currency
> Now test for active currency in the standard way
> Use the currency routines in Budgets where applicable
> Move the code paths in the if else to subroutines to clarify flow
> Enable warnings
> ---
>  admin/currency.pl |  258 +++++++++++++++++++++++++++++------------------------
>  1 files changed, 140 insertions(+), 118 deletions(-)
>
> diff --git a/admin/currency.pl b/admin/currency.pl
> index 56d5ee5..7dd8dfb 100755
> --- a/admin/currency.pl
> +++ b/admin/currency.pl
> @@ -38,34 +38,27 @@
>  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>
>  use strict;
> -# use warnings; # FIXME
> +use warnings;
>  use CGI;
>  use C4::Context;
>  use C4::Auth;
>  use C4::Dates qw(format_date);
>  use C4::Output;
> +use C4::Budgets qw/GetCurrency GetCurrencies/;
>
> -sub StringSearch  {
> -    my $query = "SELECT * FROM currency WHERE (currency LIKE ?) ORDER BY currency";
> -    my $sth = C4::Context->dbh->prepare($query);
> -    $sth->execute((shift || '') . '%');
> -    return $sth->fetchall_arrayref({});
> -}
> -
> -my $input = new CGI;
> -my $searchfield = $input->param('searchfield') || $input->param('description') || '';
> +my $input = CGI->new;
> +my $searchfield = $input->param('searchfield') || $input->param('description') || q{};
>  my $offset      = $input->param('offset') || 0;
> -my $op          = $input->param('op')     || '';
> -my $script_name = "/cgi-bin/koha/admin/currency.pl";
> +my $op          = $input->param('op')     || q{};
> +my $script_name = '/cgi-bin/koha/admin/currency.pl';
>  my $pagesize = 20;
>
>  my ($template, $loggedinuser, $cookie) = get_template_and_user({
> -    template_name => "admin/currency.tmpl",
> +    template_name => 'admin/currency.tmpl',
>     query => $input,
> -    type => "intranet",
> +    type => 'intranet',
>     flagsrequired => {parameters => 1},
>     authnotrequired => 0,
> -    debug => 1,
>  });
>
>  $searchfield=~ s/\,//g;
> @@ -76,120 +69,149 @@ $template->param(searchfield => $searchfield,
>
>  my $dbh = C4::Context->dbh;
>
> -################## ADD_FORM ##################################
> -# called by default. Used to create form to add or  modify a record
> -if ($op eq 'add_form') {
> -    $template->param(add_form => 1);
> -    #---- if primkey exists, it's a modify action, so read values to modify...
> -    my $data;
> +if ( $op eq 'add_form' ) {
> +    add_form($searchfield);
> +} elsif ( $op eq 'add_validate' ) {
> +    add_validate();
> +} elsif ( $op eq 'delete_confirm' ) {
> +    delete_confirm($searchfield);
> +} elsif ( $op eq 'delete_confirmed' ) {
> +    delete_currency($searchfield);
> +} else {
> +    default_path($searchfield);
> +}
> +
> +output_html_with_http_headers $input, $cookie, $template->output;
> +
> +sub default_path {
> +    my $searchfield = shift;
> +    $template->param( else => 1 );
> +
> +    my @currencies = GetCurrencies();
>     if ($searchfield) {
> -        my $sth=$dbh->prepare("select * from currency where currency=?");
> -        $sth->execute($searchfield);
> -        $data=$sth->fetchrow_hashref;
> -    }
> -    foreach (keys %$data) {
> -        $template->param($_ => $data->{$_});
> +        @currencies = grep { $_->{currency} =~ m/^$searchfield/o } @currencies;
>     }
> -
> -    my $date = $template->param('timestamp');
> -    ($date) and $template->param('timestamp' => format_date($date));
> -                                                    # END $OP eq ADD_FORM
> -################## ADD_VALIDATE ##################################
> -# called by add_form, used to insert/modify data in DB
> -} elsif ($op eq 'add_validate') {
> -    $template->param(add_validate => 1);
> -    my $dbh = C4::Context->dbh;
> -    my $check = $dbh->prepare("select count(*) as count from currency where currency = ?");
> -
> -    $dbh->do("UPDATE currency SET active = 0") if (    $input->param('active')  == 1);
> -
> -    $check->execute($input->param('currency'));
> -    my $count =   $check->fetchrow ;
> -    if ( $count > 0  )
> -    {
> -        my $sth = $dbh->prepare(qq|
> -                UPDATE currency
> -                    SET rate = ?,
> -                    symbol = ?,
> -                    active = ?
> -            WHERE currency = ?  |  );
> -
> -        $sth->execute(  $input->param('rate'),
> -                        $input->param('symbol')||'',
> -                        $input->param('active')||0,
> -                        $input->param('currency'),
> -                        );
> +    my $end_of_page = $offset + $pagesize;
> +    if ( $end_of_page > @currencies ) {
> +        $end_of_page = @currencies;
> +    } else {
> +        $template->param(
> +            ltcount  => 1,
> +            nextpage => $end_of_page
> +        );
>     }
> -    else
> -    {
> -        my $sth = $dbh->prepare(qq|
> -                    INSERT INTO currency (currency, rate, symbol, active) VALUES (?,?,?,?)   |);
> -
> -        $sth->execute(  $input->param('currency'),
> -                        $input->param('rate'),
> -                        $input->param('symbol')||'',
> -                        $input->param('active')||0,
> -                        );
> +    $end_of_page--;
> +    my @display_curr = @currencies[ $offset .. $end_of_page ];
> +    for my $c (@display_curr) {
> +        $c->{timestamp} = format_date( $c->{timestamp} );
>     }
> -                                                    # END $OP eq ADD_VALIDATE
> -################## DELETE_CONFIRM ##################################
> -# called by default form, used to confirm deletion of data in DB
> -} elsif ($op eq 'delete_confirm') {
> -    $template->param(delete_confirm => 1);
> -    my $sth=$dbh->prepare("select count(*) as total from aqbooksellers where currency=?");
> -    $sth->execute($searchfield);
> -    my $total = $sth->fetchrow_hashref;
> -    my $sth2=$dbh->prepare("select currency,rate from currency where currency=?");
> -    $sth2->execute($searchfield);
> -    my $data=$sth2->fetchrow_hashref;
> -
> -    if ($total->{'total'} >0) {
> -        $template->param(totalgtzero => 1);
> +    my $activecurrency = GetCurrency();
> +
> +    $template->param(
> +        loop           => \@display_curr,
> +        activecurrency => defined $activecurrency,
> +    );
> +
> +    if ( $offset > 0 ) {
> +        $template->param(
> +            offsetgtzero => 1,
> +            prevpage     => $offset - $pagesize
> +        );
>     }
> +    return;
> +}
> +
> +sub delete_currency {
> +    my $curr = shift;
> +
> +    # TODO This should be a method of Currency
> +    # also what about any orders using this currency
> +    $template->param( delete_confirmed => 1 );
> +    $dbh->do( 'delete from currency where currency=?', {}, $curr );
> +    return;
> +}
> +
> +sub delete_confirm {
> +    my $curr = shift;
> +
> +    $template->param( delete_confirm => 1 );
> +    my $total_row = $dbh->selectrow_hashref(
> +        'select count(*) as total from aqbooksellers where currency=?',
> +        {}, $curr );
>
> -    $template->param(rate => $data->{'rate'},
> -            total => $total);
> -                                                    # END $OP eq DELETE_CONFIRM
> -################## DELETE_CONFIRMED ##################################
> -# called by delete_confirm, used to effectively confirm deletion of data in DB
> -} elsif ($op eq 'delete_confirmed') {
> -    $template->param(delete_confirmed => 1);
> -    my $sth=$dbh->prepare("delete from currency where currency=?");
> -    $sth->execute($searchfield);
> -                                                    # END $OP eq DELETE_CONFIRMED
> -################## DEFAULT ##################################
> -} else { # DEFAULT
> -    $template->param(else => 1);
> -
> -    my $results = StringSearch($searchfield);
> -    my $count = scalar(@$results);
> -    my @loop;
> -    my $activecurrency;
> -    for (my $i=$offset; $i < ($offset+$pagesize<$count?$offset+$pagesize:$count); $i++){
> -        # warn Data::Dumper::Dumper($results->[$i]);
> -        if($results->[$i]{'active'} == 1){ $activecurrency = 1; }
> -        push @loop, {
> -            currency  => $results->[$i]{'currency'},
> -            rate      => $results->[$i]{'rate'},
> -            symbol    => $results->[$i]{'symbol'},
> -            timestamp => format_date($results->[$i]{'timestamp'}),
> -            active    => $results->[$i]{'active'},
> -        };
> +    my $curr_ref = $dbh->selectrow_hashref(
> +        'select currency,rate from currency where currency=?',
> +        {}, $curr );
> +
> +    if ( $total_row->{total} ) {
> +        $template->param( totalgtzero => 1 );
>     }
> +
>     $template->param(
> -        loop => \@loop,
> -        activecurrency => $activecurrency,
> +        rate  => $curr_ref->{rate},
> +        total => $total_row->{total}
>     );
>
> -    if ($offset>0) {
> -        $template->param(offsetgtzero => 1,
> -                prevpage => $offset-$pagesize);
> +    return;
> +}
> +
> +sub add_form {
> +    my $curr = shift;
> +
> +    $template->param( add_form => 1 );
> +
> +    #---- if primkey exists, it's a modify action, so read values to modify...
> +    if ($curr) {
> +        my $curr_rec =
> +          $dbh->selectrow_hashref( 'select * from currency where currency=?',
> +            {} . $curr );
> +        for ( keys %{$curr_rec} ) {
> +            $template->param( $_ => $curr_rec->{$_} );
> +        }
> +    }
> +    my $date = $template->param('timestamp');
> +    if ($date) {
> +        $template->param( 'timestamp' => format_date($date) );
>     }
>
> -    if ($offset+$pagesize < scalar @$results) {
> -        $template->param(ltcount => 1,
> -                nextpage => $offset+$pagesize);
> +    return;
> +}
> +
> +sub add_validate {
> +    $template->param( add_validate => 1 );
> +
> +    if ( $input->param('active') == 1 ) {
> +        $dbh->do('UPDATE currency SET active = 0');
>     }
> -} #---- END $OP eq DEFAULT
> -output_html_with_http_headers $input, $cookie, $template->output;
> +    my $rec = {
> +        rate     => $input->param('rate'),
> +        symbol   => $input->param('symbol') || q{},
> +        active   => $input->param('active') || 0,
> +        currency => $input->param('currency'),
> +    };
> +
> +    my ($row_count) = $dbh->selectrow_array(
> +        'select count(*) as count from currency where currency = ?',
> +        {}, $input->param('currency') );
> +    if ($row_count) {
> +        $dbh->do(
> +q|UPDATE currency SET rate = ?, symbol = ?, active = ? WHERE currency = ? |,
> +            {},
> +            $rec->{rate},
> +            $rec->{symbol},
> +            $rec->{active},
> +            $rec->{currency}
> +        );
> +    } else {
> +        $dbh->do(
> +q|INSERT INTO currency (currency, rate, symbol, active) VALUES (?,?,?,?) |,
> +            {},
> +            $rec->{currency},
> +            $rec->{rate},
> +            $rec->{symbol},
> +            $rec->{active}
> +        );
>
> +    }
> +    return;
> +}
> --
> 1.6.6.1
>
> _______________________________________________
> Koha-patches mailing list
> Koha-patches at lists.koha.org
> http://lists.koha.org/mailman/listinfo/koha-patches
>



-- 
Galen Charlton
gmcharlt at gmail.com



More information about the Koha-patches mailing list