[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