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;