view Lib/IMPL/ORM.pm @ 31:d59526f6310e

Small fixes to Test framework (correct handlinf of the compilation errors in the test units) Imported and refactored SQL DB schema from the old project
author Sergey
date Mon, 09 Nov 2009 01:39:16 +0300
parents 03e58a454b20
children 16ada169ca75
line wrap: on
line source

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