Mercurial > pub > Impl
diff Lib/IMPL/ORM.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | 2d1c3f713280 |
line wrap: on
line diff
--- a/Lib/IMPL/ORM.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/IMPL/ORM.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,123 +1,123 @@ -package IMPL::ORM; -use strict; -use warnings; - -use base qw(IMPL::Object); -use IMPL::Class::Property; -use Scalar::Util qw(weaken refaddr); - -use IMPL::Exception; - -our $Depth = 1; # загружать объект + 1 уровень детей -our $UseProxy = 1; - -BEGIN { - private property _ObjectCache => prop_all; - private property _MapInstances => prop_all; - private property _WorkUnit => prop_all; - public property Schema => prop_all; -} - -sub ObjectInfoById { - my ($this,$oid) = @_; - - return $this->_ObjectCache->{$oid}; -} - -sub ObjectInfo { - my ($this,$inst) = @_; - - die new IMPL::InvalidOperationException("This method can be used only for a reference") unless ref $inst; - - return $this->_MapInstances->{refaddr $inst}; -} - - -1; -__END__ -=pod -=head1 SYNOPSIS - -use IMPL::ORM::Sql; - -my $DB = new IMPL::ORM::Sql("connection string"); - -local $IMPL::ORM::Depth = 1; # load childs only, no more - -my $artist = $DB->Lookup( Artist => { name => 'Beatles' } ); - -my $order = new Order(); -$order->AddItem($_) foreach $artist->Albums->List; - -$DB->Save($order); - -my $label = $artist->Albums->Index(0)->Label; - -$DB->Populate($label); #load $label - -=head1 DESCRIPTION -=head2 MEMBERS -=level 4 -=back -=head2 Variables -=head2 INTERNALS -=head3 Object Representation - -Каждый класс отображаемый в источник данных представляется в виде набора -сущностей, каждая из которых представляет состояние базового класса. - -Foo entityFoo - Bar entityBar - Baz entityBaz - -При сохранении виртуальных свойств классов в соответствующих сущностях заводится -два поля - одно под сохранение собственного значения свойства, другое - для -хренеия виртуального значения. - -Foo - public virtual property Name => prop_all, {Type => String}; - -entityFoo - string m_Name - собственное значение - string v_Name - вртуальное значение - -Каждый сохраненный объект в базе имеет собственный идентификатор. -Новые объекты идентификатора не имеют, до тех пор пока они не будут сохранены. - -=head3 Object Cache - -Для учета объектов, которые присутствуют в источнике данных используется кеш -объектов. Сюда попадают полученные из базы объекты, а также вновь добавленные -объекты. - -ObjectInfo => { - instance => weak ref - _id => data source dependent id - state => {persistent|null|new|deleted} - work_unit => ref to the work unit where object is acting -} - -данная структура доступна через две функции ObjectInfoById и ObjectInfo - -=head3 Type mapping - -Источник данных имеет в себе схему данных, которая определяет набор типов, -хранимых в данном источнике. Есть несколько видов отображения типов: - -=level 4 - -=item 1 - -Отображение классов, когда класс рассмаривается в иде набора свойств - -=item - -Отображение классов в одно значение (напрмер строку, данные и т.п.) - -=item - -Классы, которые на прямую работают с источником данных, такие как коллекции. - -=back - -=cut \ No newline at end of file +package IMPL::ORM; +use strict; +use warnings; + +use base qw(IMPL::Object); +use IMPL::Class::Property; +use Scalar::Util qw(weaken refaddr); + +use IMPL::Exception; + +our $Depth = 1; # загружать объект + 1 уровень детей +our $UseProxy = 1; + +BEGIN { + private property _ObjectCache => prop_all; + private property _MapInstances => prop_all; + private property _WorkUnit => prop_all; + public property Schema => prop_all; +} + +sub ObjectInfoById { + my ($this,$oid) = @_; + + return $this->_ObjectCache->{$oid}; +} + +sub ObjectInfo { + my ($this,$inst) = @_; + + die new IMPL::InvalidOperationException("This method can be used only for a reference") unless ref $inst; + + return $this->_MapInstances->{refaddr $inst}; +} + + +1; +__END__ +=pod +=head1 SYNOPSIS + +use IMPL::ORM::Sql; + +my $DB = new IMPL::ORM::Sql("connection string"); + +local $IMPL::ORM::Depth = 1; # load childs only, no more + +my $artist = $DB->Lookup( Artist => { name => 'Beatles' } ); + +my $order = new Order(); +$order->AddItem($_) foreach $artist->Albums->List; + +$DB->Save($order); + +my $label = $artist->Albums->Index(0)->Label; + +$DB->Populate($label); #load $label + +=head1 DESCRIPTION +=head2 MEMBERS +=level 4 +=back +=head2 Variables +=head2 INTERNALS +=head3 Object Representation + +Каждый класс отображаемый в источник данных представляется в виде набора +сущностей, каждая из которых представляет состояние базового класса. + +Foo entityFoo + Bar entityBar + Baz entityBaz + +При сохранении виртуальных свойств классов в соответствующих сущностях заводится +два поля - одно под сохранение собственного значения свойства, другое - для +хренеия виртуального значения. + +Foo + public virtual property Name => prop_all, {Type => String}; + +entityFoo + string m_Name - собственное значение + string v_Name - вртуальное значение + +Каждый сохраненный объект в базе имеет собственный идентификатор. +Новые объекты идентификатора не имеют, до тех пор пока они не будут сохранены. + +=head3 Object Cache + +Для учета объектов, которые присутствуют в источнике данных используется кеш +объектов. Сюда попадают полученные из базы объекты, а также вновь добавленные +объекты. + +ObjectInfo => { + instance => weak ref + _id => data source dependent id + state => {persistent|null|new|deleted} + work_unit => ref to the work unit where object is acting +} + +данная структура доступна через две функции ObjectInfoById и ObjectInfo + +=head3 Type mapping + +Источник данных имеет в себе схему данных, которая определяет набор типов, +хранимых в данном источнике. Есть несколько видов отображения типов: + +=level 4 + +=item 1 + +Отображение классов, когда класс рассмаривается в иде набора свойств + +=item + +Отображение классов в одно значение (напрмер строку, данные и т.п.) + +=item + +Классы, которые на прямую работают с источником данных, такие как коллекции. + +=back + +=cut