Mercurial > pub > Impl
changeset 79:2d1c3f713280
ORM concept in development
author | wizard |
---|---|
date | Mon, 05 Apr 2010 00:20:34 +0400 |
parents | a5cb84374d40 |
children | f017c0d7527c |
files | Lib/IMPL/DOM/Transform/PostToDOM.pm Lib/IMPL/ORM.pm Lib/IMPL/ORM/Adapter/Generic.pm Lib/IMPL/ORM/Schema.pm Lib/IMPL/ORM/Schema/GenericClass.pm Lib/IMPL/ORM/Schema/TransformToSQL.pm Lib/IMPL/ORM/Store/DBIC.pm Lib/IMPL/ORM/Unit.pm Lib/IMPL/Web/Security.pm |
diffstat | 9 files changed, 211 insertions(+), 80 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/DOM/Transform/PostToDOM.pm Fri Apr 02 20:19:17 2010 +0400 +++ b/Lib/IMPL/DOM/Transform/PostToDOM.pm Mon Apr 05 00:20:34 2010 +0400 @@ -25,6 +25,7 @@ my $navi = $this->Navigator; while (my ($key,$value) = each %$data) { + # TODO: review my $node = $navi->Navigate($key); $node->nodeValue($value); }
--- a/Lib/IMPL/ORM.pm Fri Apr 02 20:19:17 2010 +0400 +++ b/Lib/IMPL/ORM.pm Mon Apr 05 00:20:34 2010 +0400 @@ -35,89 +35,48 @@ 1; __END__ + =pod + +=head1 NAME + +C<IMPL::ORM> - Object Relational Mapping + =head1 SYNOPSIS -use IMPL::ORM::Sql; +=begin code -my $DB = new IMPL::ORM::Sql("connection string"); +my $ds = IMPL::ORM::Storage::DBIC->new('My::Data',$dsn,$user,$pass,{Autocommit => 1}); + -local $IMPL::ORM::Depth = 1; # load childs only, no more - -my $artist = $DB->Lookup( Artist => { name => 'Beatles' } ); +my $foo = $ds->Insert( + My::Data::Foo->new( + 'foo class' + ) +); -my $order = new Order(); -$order->AddItem($_) foreach $artist->Albums->List; +my $bar = $ds->Insert( + My::Data::Bar->new( + 'bar class' + ) +) + +$bar->fooObject($foo); + +$ds->Save($bar); -$DB->Save($order); +my $fooOther = $ds->Retrieve( + 'My::Data::Bar', + { + name => 'bar class', + fooObject => { + name => 'some foo' + } + } +) -my $label = $artist->Albums->Index(0)->Label; - -$DB->Populate($label); #load $label +=end code =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 +=cut \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/ORM/Adapter/Generic.pm Mon Apr 05 00:20:34 2010 +0400 @@ -0,0 +1,103 @@ +package IMPL::ORM::Adapter::Generic; + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::ORM::Adapter::Generic> Адаптер для работы с данными объекта произвольного класса. + +=head1 DESCRIPTION + +Позволяет получать данные, изменения данных из объекта, а также записать данные в +объект и создать новый объект. + +=head1 MEMBERS + +=over + +=item C<CTOR($object,$hashOptions)> + +Создает новый адаптер к объекту C<$object> + +=item C<[get]object> + +Объект для которого создан данный адаптер, C<undef> если объект удален. + +=item C<[get]isChanged> + +Были ли обновления в объекте. + +=item C<[get]isDeleted> + +Является ли объект удаленным. + +=item C<[get]isNew> + +Является ли объект новым для БД. + +=item C<[get]initialState> + +Начальное состояние объекта, C<undef> если объект был создан. + +=item C<[get]currentState> + +Текущие состояние. C<undef> если объект удален. + +=item C<[get,list]history> + +История изменений. C<IMPL::Object::List> + +=item C<SaveChanges> + +Сохраняет изменения из объекта в текущее состояние, при этом изменения записываются в историю. + +B<returns> информацию об изменениях в объекте. + +=item C<Revert($version)> + +Возвращает объект в определенную версию. + +=item C<Delete> + +Удаляет объект, точнее помечает его для удаления до вызова C<Commit>. + +=item C<Commit> + +Сбрасывает историю изменений, и устанавливает соответсвующие свойства. + +=back + +=head1 Информация об изменениях объекта + +=begin code + +{ + version => 1, # object version + op => STORAGE_UPDATE, + data => { + entity1 => { + field1 => 'value 1' + }, + entity2 => { + field2 => 'value 2' + } + } +} + +=end code + +=head1 Информация об отображении объекта + +=begin code + +{ + prop_name => [ entity => 'field' ] +} + +=end code + +=cut \ No newline at end of file
--- a/Lib/IMPL/ORM/Schema.pm Fri Apr 02 20:19:17 2010 +0400 +++ b/Lib/IMPL/ORM/Schema.pm Mon Apr 05 00:20:34 2010 +0400 @@ -121,6 +121,10 @@ =pod +=head1 NAME + +C<IMPL::ORM::Schema> Схема отображения классов в реляционную структуру. + =head1 DESCRIPTION Схема данных, представляет собой DOM документ, элементами которой @@ -128,6 +132,8 @@ Каждый узел - это описание сущности. +=begin code xml + <Schema> <Entity entityName="My_Data_Foo"> <Field fieldName="Doo" fieldType="String"/> @@ -142,4 +148,6 @@ </Entity> </Schema> +=end code xml + =cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/ORM/Schema/GenericClass.pm Mon Apr 05 00:20:34 2010 +0400 @@ -0,0 +1,17 @@ +package IMPL::ORM::Schema::GenericClass; + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::ORM::Schema::GenericClass> Построение схемы из произвольного класса. + +=head1 DESCRIPTION + +Читает метаданные класса и строит на их основании элементы схемы данных. + +=cut \ No newline at end of file
--- a/Lib/IMPL/ORM/Schema/TransformToSQL.pm Fri Apr 02 20:19:17 2010 +0400 +++ b/Lib/IMPL/ORM/Schema/TransformToSQL.pm Mon Apr 05 00:20:34 2010 +0400 @@ -171,7 +171,11 @@ =head1 SYNOPSIS +=begin code + my $sqlSchema = IMPL::ORM::Schema::TransformToSQL->Default->Transform(Data::Schema->instance); +=end code + =cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/ORM/Store/DBIC.pm Mon Apr 05 00:20:34 2010 +0400 @@ -0,0 +1,13 @@ +package IMPL::ORM::DBIC; + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::ORM::DBIC> - Хранилище данных на основе C<DBIx::Class>. + +=cut \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/ORM/Unit.pm Mon Apr 05 00:20:34 2010 +0400 @@ -0,0 +1,20 @@ +package IMPL::ORM::Unit; + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::ORM::Unit> Единица действий. + +=head1 DESCRIPTION + +C<[Infrastructure]> + +Позволяет записывать последовательность изменений. Используется C<IMPL::ORM> для реализации логических +транзакций. + +=cut \ No newline at end of file
--- a/Lib/IMPL/Web/Security.pm Fri Apr 02 20:19:17 2010 +0400 +++ b/Lib/IMPL/Web/Security.pm Mon Apr 05 00:20:34 2010 +0400 @@ -7,8 +7,7 @@ __PACKAGE__->PassThroughArgs; BEGIN { - public property sessionFactory => prop_get | owner_set; - public property userFactory => prop_get | owner_set; + public property source => prop_all; } sub CTOR { @@ -17,12 +16,19 @@ $this->dataSource or die new IMPL::InvalidArgumentException("The argument is required",'dataSource'); } -sub Session { - my ($this,%args) = @_; +sub RetrSession { + my ($this,$sid) = @_; + + return $this->source->RetrSession(id => $sid); } -sub User { +sub RetrSecData { + my ($this,$user,$secPackage) = @_; + $user = ref $user ? $user->name : $user; + + return + $this->source->RetrSecData(user => $user, package => $secPackage); } 1;