|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Brindeew 2:5020/400 29 Sep 2000 15:20:55 To : All Subject : Some optimisations? -------------------------------------------------------------------------------- Hello! Есть нижеприведенный кусок кода (один из методов объекта). Интересует его оптимизация, особенно в части переноса данных. Этот кусок выдран из модуля, который является надстройкой над DBI. Занимается он (кусок) тем же самым, что и DBI->selectall_arrayref, только возвращает не ссылку на массив ссылок на МАССИВЫ с datarows, а ссылку на массив ссылок на ХЭШИ с datarows. Ключами, естественно, являются имена полей. Краткие пояснения: $self - это "местный" $dbh, который все стандартные вызовы форвардит в DBI, занимаясь попутно перекодировкой (если задано в конфиге для конкретной базы) всех проходящих через него данных (koi8<->cp1251 and so on) и имеющий деструктор на ${родной_dbh}->disconnect(); $sth - аналогичная надстройка, но над DBI:db (то, что возвращает prepare и prepare_cached) Hазначение методов get_{dbh|sth}(), думаю, понятно - извлечение "родных" DBIшных хэндлов. Собственно, сама задача выросла вот из чего: все данные в наших скриптах (типа списка объявлений) передаются в template subsystem как $dbh->selectall_array_ref($sql). В результате теряется наглядность (когда в шаблоне пишется $msg.0 , а не $msg.title), да и код потом смотреть тоже трудновато. Конструктивная критика и советы по оптимизации будут приняты с благодарностью! sub selectall_aohref { my $self = shift; confess "Called without object!\n" unless ref($self); my $sql = shift; confess "Required parameter missing\n" unless defined $sql; confess "Placeholders (?) NOT SUPPORTED due performance issues\n" if $sql =~ /\?/; my $result; # Reference to result data set my $tmp; # Reference to source data set my $sth; $sth = $self->prepare($sql) || confess('Can\'t prepare statement: '.$!."\n"); my $rc = $sth->execute(); # Placeholders NOT SUPPORTED at this time! confess "Statement execution failed: $!\n" unless defined $rc; my $fieldsref = $sth->get_sth()->{NAME}; $tmp = $sth->fetchall_arrayref(); my ($rowref,$hashref,$val,$c1,$c2); $#{$result} = $#{$tmp}; # Reserving memory $c1 = 0; foreach $rowref (@{$tmp}) { $hashref = { }; $c2 = 0; foreach $val (@{$rowref}) { $hashref->{${$fieldsref}[$c2]} = $val; $c2++; } ${$result}[$c1] = $hashref; $c1++; } undef $tmp; $sth->finish(); return $result; } -- WBR, Andrey Brindeew http://www.dportal.ru http://www.sat.com.ru --- ifmail v.2.15dev5 * Origin: Dportal.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/7502c4baea46.html, оценка из 5, голосов 10
|