[Moscow.pm] Как правиьно сделать хранитель транзакции ?
Vladimir V. Perepelitsa
inthrax на gmail.com
Ср Дек 3 05:54:44 PST 2008
Т.к. с каталистом я не работал, попробую расспросить что тебе нужно.
у тебя есть объект, ссылка на который хранится перманентно.
тебе нужно при обращении к этому объекту отметить начало и конец транзакции.
вместо объекта ты передаешь объект-контейнер, у которого refcount = 0
и отслеживаешь DESTROY
собственно это у тебя и реализовано.
еще можно пытаться отслеживать refcount, но скорее всего не получится
сделать это событийно.
2008/12/2 Ivan B. Serezhkin <ivan на serezhkin.com>:
> Привет.
>
> Задача: Есть некое семейство классов.
> Каждый объект живёт в системе постоянно, но в начале запроса на него
> надо сделать transaction_begin, а в конце transaction_end.
> Я не придумал ничего лучше чем сделать :
> <pre>
> #снаружи это как то так:
> sub handler : Local {
> my ($self, $c, $listname) = @_;
> my $list=$c->model('Lists')->getlist($listname);
> # много много логики и прочей фигни
> $stash->{list}=$list; #тут оно ещё не сдохло.
> }
> #Дальше оно варится внутри TTk, Потом выходит из скупа и на настоящем
> листе вызывается transaction_end()
>
> #В хранилище функция 'получить':
> sub getlist {
> my ($self,$lname)=@_;
> return sowebface::List::Transaction->new($self->{lists}->{$lname});
> }
>
> #А транзакция это вот такая упячка:
> package sowebface::List::Transaction;
> use strict;
> use overload
> '%{}' => sub {return ${shift()}},
> fallback =>1,
> ;
>
> our $AUTOLOAD;
>
> sub new {
> my ($class, $self)=@_;
> die 'WTF?' unless ref $self;
> $self->transaction_begin();
> return bless \$self, $class;
> }
>
> sub DESTROY {
> my $self=shift;
> $$self->transaction_end();
> }
>
> sub AUTOLOAD {
> my $self=shift;
> $AUTOLOAD=~/::([^:]+)$/;
> my $m=$1;
> $self=$$self;
> if ($self->can($m)) {
> return $self->$m(@_);
> } else {
> return $self->{$m};
> }
> }
> </pre>
>
> Спасите чтоли, ведь это делается наверняка намного проще .. =)
> Мне нужно просто перехватывать refcount change, на самом деле, и делать
> выводы, но я не докопал как это сделать по человечески, вот получился
> такой монстрик.
> То-есть мне надо дёрнутся, когда refcount>1 и когда стал refcount=1
> обратно, один refcount - это я хранюсь в списке в модели.
> Главное условие: никакого XS.
> Ещё одно из условий - оно ещё и в Template::Stash должно правильно
> отрабатывать.
> И вообще, Транзакция должна быть объектом, который ей передан,
> единственное, во время выхода из области видимости, она должна на себе
> вызывать transaction_end и не убивать настоящий объект.
>
>
> --
> Ivan B. Serezhkin
> Spamooborona, Yandex. http://so.yandex.ru/
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
--
Best wishes,
Vladimir V. Perepelitsa aka Mons <inthrax на gmail.com>
Подробная информация о списке рассылки Moscow-pm