Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Some optimisations?   Andrey Brindeew   29 Sep 2000 15:20:55 
 Some optimisations?   Konstantin Osipov   29 Sep 2000 23:27:46 
Архивное /ru.perl/7502c4baea46.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional