DB<1> $cont = $schema->resultset('DB::Contents')->find({id=>89});
SELECT me.id, me.project, me.section, me.parent, me.content_level FROM
contents me WHERE ( ( me.id = ? OR me.id = ? ) ): '89', '89'
DB<2> $cont->set_dyn_attributes({'ciccio'=>1,'pino'=>2});
SELECT me.content, me.customer, me.project_name, me.active, me.status,
me.license, me.data, me.ambito, me.project_level, me.file_css,
me.hostname, me.url_path, me.dsn, me.lang FROM projects me WHERE (
me.content = ? ): '84'
SELECT me.id, me.project, me.section, me.parent, me.content_level FROM
contents me WHERE ( me.id = ? ): '84'
BEGIN WORK
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( attribute.attribute_name = ? AND ( project = ?
AND me.content = ? ) ) ): 'ciccio', '84', '89'
INSERT INTO attributes ( attribute_name, project) VALUES ( ?, ? ):
'ciccio', '84'
INSERT INTO content_attributes ( attribute, attribute_value, content)
VALUES ( ?, ?, ? ): '31', '1', '89'
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( attribute.attribute_name = ? AND ( project = ?
AND me.content = ? ) ) ): 'pino', '84', '89'
INSERT INTO attributes ( attribute_name, project) VALUES ( ?, ? ):
'pino', '84'
INSERT INTO content_attributes ( attribute, attribute_value, content)
VALUES ( ?, ?, ? ): '32', '2', '89'
COMMIT
DB<3> $cont->get_dyn_attributes();
BEGIN WORK
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( content = ? AND me.content = ? ) ): '89', '89'
ROLLBACK
Column attribute not loaded or not passed to new() prior to insert() on
DB::ContentAttributes=HASH(0x2922ba40) trying to resolve relationship
(maybe you forgot to call ->reload_from_storage to get defaults from the
db) at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Schema.pm line 994
DBIx::Class::Schema::throw_exception('DB=HASH(0x28bfcc50)', 'Column
attribute not loaded or not passed to new() prior to i...') called at
/usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/ResultSource.pm line 1429
DBIx::Class::ResultSource::throw_exception('DBIx::Class::ResultSource::Table=HASH(0x28c41dd0)', 'Column attribute not loaded or not passed to new() prior to i...') called at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/ResultSource.pm line 1207
DBIx::Class::ResultSource::resolve_condition('DBIx::Class::ResultSource::Table=HASH(0x28c41dd0)', 'HASH(0x28a00e90)', 'attribute', 'DB::ContentAttributes=HASH(0x2922ba40)') called at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Relationship/Base.pm line 192
DBIx::Class::Relationship::Base::related_resultset('DB::ContentAttributes=HASH(0x2922ba40)', 'attribute') called at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Row.pm line 1029
DBIx::Class::Row::inflate_result('DB::ContentAttributes',
'DBIx::Class::ResultSource::Table=HASH(0x28c41dd0)', 'HASH(0x292452b0)',
'HASH(0x29228d60)') called at
/usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/ResultSet.pm line 966
DBIx::Class::ResultSet::_construct_object('DBIx::Class::ResultSet=HASH(0x29220a50)', 'author', 4) called at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/ResultSet.pm line 958
DBIx::Class::ResultSet::next('DBIx::Class::ResultSet=HASH(0x29220a50)')
called at lib/DB/Contents.pm line 174
DB::Contents::__ANON__[lib/DB/Contents.pm:177]() called at
/usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Storage/DBI.pm line 782
eval {...} called at
/usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Storage/DBI.pm line 770
DBIx::Class::Storage::DBI::txn_do('DBIx::Class::Storage::DBI::Pg=HASH(0x28c38a70)', 'CODE(0x28f3bca0)') called at /usr/pkg/lib/perl5/site_perl/5.10.0/DBIx/Class/Schema.pm line 617
DBIx::Class::Schema::txn_do('DB=HASH(0x28bfcc50)', 'CODE(0x28f3bca0)')
called at lib/DB/Contents.pm line 178
DB::Contents::get_dyn_attributes('DB::Contents=HASH(0x2920cd80)')
called at (eval 350)[/usr/pkg/lib/perl5/5.10.0/perl5db.pl:638] line 2
eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D
| $DB::db_stop;
$cont->get_dyn_attributes();;
Here there is the source of both set and get used:
sub set_dyn_attributes {
my ($self, $attrs) = @_;
my $id_project = $self->get_project;
my $schema = $self->result_source->schema;
my $txn_closure = sub {
my $rs =
$self->content_attributes->search({project=>$id_project},{join=>['attribute'],
columns=>['attribute.attribute_name','attribute_value']});
# da mettere dentro una closure per la transazione
for my $k (keys %{$attrs}) {
if (! $rs->find({'attribute.attribute_name'=>$k}) ) {
my $attr = $schema->resultset('DB::Attributes')->create(
{
project=>$id_project,
attribute_name=>$k
}
);
my $ca = $attr->create_related('content_attributes',
{
content=>$self->id,
attribute_value=>$attrs->{$k},
});
} else {
# the attribute_name for this project exists
my $attr = $schema->resultset('DB::Attributes')->find(
{
project=>$id_project,
attribute_name=>$k,
}
);
my $ca = $attr->find_or_new_related('content_attributes',
{
content=>$self->id,
});
$ca->attribute_value($attrs->{$k});
$ca->insert_or_update;
}
}
};
$schema->txn_do($txn_closure);
}
sub get_dyn_attributes {
my ($self) = shift;
my $res = {};
my $schema = $self->result_source->schema;
my $txn_closure = sub {
my $rs =
$self->content_attributes->search({content=>$self->id},{join=>['attribute'],
columns=>['attribute.attribute_name','attribute_value']});
while(my $a=$rs->next) {
$res->{$a->attribute->attribute_name}=$a->attribute_value;
}
};
$schema->txn_do($txn_closure);
return $res;
}
The same code on 0.08013:
DB<7> $cont->set_dyn_attributes({'zio'=>1,'cantante'=>2});
SELECT me.content, me.customer, me.project_name, me.active, me.status,
me.license, me.data, me.ambito, me.project_level, me.file_css,
me.hostname, me.url_path, me.dsn, me.lang FROM projects me WHERE (
me.content = ? ): '84'
SELECT me.id, me.project, me.section, me.parent, me.content_level FROM
contents me WHERE ( me.id = ? ): '84'
BEGIN WORK
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( attribute.attribute_name = ? AND ( project = ?
AND me.content = ? ) ) ): 'cantante', '84', '89'
INSERT INTO attributes ( attribute_name, project) VALUES ( ?, ? ):
'cantante', '84'
INSERT INTO content_attributes ( attribute, attribute_value, content)
VALUES ( ?, ?, ? ): '33', '2', '89'
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( attribute.attribute_name = ? AND ( project = ?
AND me.content = ? ) ) ): 'zio', '84', '89'
INSERT INTO attributes ( attribute_name, project) VALUES ( ?, ? ):
'zio', '84'
INSERT INTO content_attributes ( attribute, attribute_value, content)
VALUES ( ?, ?, ? ): '34', '1', '89'
COMMIT
DB<8> x $cont->get_dyn_attributes();
BEGIN WORK
SELECT attribute.attribute_name, me.attribute_value FROM
content_attributes me JOIN attributes attribute ON attribute.id =
me.attribute WHERE ( ( content = ? AND me.content = ? ) ): '89', '89'
COMMIT
0 HASH(0x291bf390)
'author' => 4
'cantante' => 2
'ciccio' => 1
'pino' => 2
'zio' => 1