среда, 9 февраля 2011 г.

DBIx::Class переопределение основных методов класса

Довольно часто возникает необходимость вместе с запросом к базе произвести ещё какие либо действия. Причём произвести их для любого запроса данного типа (INSERT, SELECT и пр.). Ну например, нужно налету преобразовывать кодировку таблицы или столбца таблицы или при сохранении записи закодировать одно из полей, а при считывании раскодировать. Ну или подсунуть время с изменённым часовым поясом... в общем много применений.

Так вот, всё это очень легко делается для DBIx классом DBIx::Class::Row Он содержит все низкоуровневые вызовы основных методов работы с DBIx::Class::ResultSource объектами.

итак...


package My::Schema::Result::MyText;

use strict;
use warnings;
use base qw/DBIx::Class::Core/;
use Encode qw/from_to encode decode/;

__PACKAGE__->table('texts');

__PACKAGE__->add_columns(qw/id text/);

__PACKAGE__->set_primary_key('id');

sub inflate_result {
    my $self = shift;

    my $ret = $self->next::method(@_);
    
    my $octets = $ret->text;
    from_to($octets, 'koi8-r', 'utf-8');
    $ret->{_column_data}->{text} = decode("utf8", $octets);
    
    return $ret;
}


Теперь на любой select к этой таблице поле text будет перекодироваться при каждом запросе. Конечно, не очень правильно перекодировать на лету поля из базы, но это всё-таки пример.

Для select'а было не просто найти нужный метод, с остальными основными методами всё проще. Они называются как и ожидается: insert, update и delete

Комментариев нет:

Отправить комментарий