__PACKAGE__->load_components("Core");
__PACKAGE__->table("serien");
__PACKAGE__->add_columns(
- "id" => { data_type => "INT", default_value => undef, is_nullable => 0, size => 10 },
- "serien_name" => { data_type => "VARCHAR", default_value => undef, is_nullable => 0, size => 100, },
- "descr" => { data_type => "TEXT", default_value => undef, is_nullable => 0, size => 65535, },
+ "id" => { data_type => "INT", default_value => undef, is_nullable => 0, size => 10 },
+ "serien_name" => { data_type => "VARCHAR", default_value => undef, is_nullable => 0, size => 100, },
+ "descr" => { data_type => "TEXT", default_value => undef, is_nullable => 0, size => 65535, },
+ "created_at" => { data_type => "DATETIME", default_value => undef, is_nullable => 0, size => 19, },
+ "created_by" => { data_type => "INT", default_value => undef, is_nullable => 0, size => 10 },
+ "changed_at" => { data_type => "DATETIME", default_value => undef, is_nullable => 0, size => 19, },
+ "changed_by" => { data_type => "INT", default_value => undef, is_nullable => 0, size => 10 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->add_unique_constraint("serien_name", ["serien_name"]);
+__PACKAGE__->belongs_to( "created_by", "FrBr::Books::Db::Result::Users", { 'foreign.user_id' => "self.created_by" },);
+__PACKAGE__->belongs_to( "changed_by", "FrBr::Books::Db::Result::Users", { 'foreign.user_id' => "self.changed_by" },);
# Created by DBIx::Class::Schema::Loader v0.04004 @ 2008-03-17 17:53:52
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/IzPoWKb7jK+P2HCTO+bCQ
'name' => 'Perry Rhodan',
'descr' => 'Abenteuer des Weltraumspezis',
'count_books' => 60,
+ 'created_at' => '2010-02-22 12:13:14',
+ 'id_created_by' => 1,
+ 'name_created_by ' => 'Frank Brehm',
+ 'changed_at' => '2010-02-29 13:14:15',
+ 'id_changed_by' => 2,
+ 'name_changed_by' => 'Doris Hennig',
'book_ids' => [
2,
22,
$c->log->debug( get_output_string( $K, "Anzahl gefundene Serien: ", $anzahl_serien ) ) if $c->stash->{'debug_level'} >= 2;
my $other_params = {};
- $other_params->{'order_by'} = [ 'serien_name' ];
+ $other_params->{'join'} = [
+ 'buch_serie',
+ 'created_by',
+ 'changed_by',
+ ];
+ $other_params->{'order_by'} = [ 'me.serien_name' ];
$other_params->{'select'} = [
'me.id',
'me.serien_name',
'me.descr',
+ 'me.created_by',
+ 'created_by.vorname',
+ 'created_by.nachname',
+ 'me.created_at',
+ 'me.changed_by',
+ 'changed_by.vorname',
+ 'changed_by.nachname',
+ 'me.changed_at',
{ 'count' => 'buch_serie.id' }
];
$other_params->{'as'} = [
'id',
'serien_name',
'descr',
+ 'created_by',
+ 'created_by_vorname',
+ 'created_by_nachname',
+ 'created_at',
+ 'changed_by',
+ 'changed_by_vorname',
+ 'changed_by_nachname',
+ 'changed_at',
'count_books',
];
- $other_params->{'join'} = [ 'buch_serie'];
- $other_params->{'group_by'} = [ 'id' ];
+ $other_params->{'group_by'} = [ 'me.id' ];
if ( $page ) {
$other_params->{'rows'} = $rows;
}
for my $serie_rs ( $c->model('Schema::Serien')->search( $search_params, $other_params )->all() ) {
+
+ my $vorname = '';
my $serie = {};
- $serie->{'id'} = $serie_rs->id();
- $serie->{'name'} = $serie_rs->serien_name();
- $serie->{'descr'} = $serie_rs->descr();
+
+ $serie->{'id'} = $serie_rs->id();
+ $serie->{'name'} = $serie_rs->serien_name();
+ $serie->{'descr'} = $serie_rs->descr();
$serie->{'count_books'} = $serie_rs->get_column('count_books');
+
+ $serie->{'id_created_by'} = $serie_rs->get_column('created_by');
+ $serie->{'created_at'} = $serie_rs->get_column('created_at');
+ $serie->{'name_created_by'} = $serie_rs->get_column('created_by_nachname');
+ $vorname = $serie_rs->get_column('created_by_vorname');
+ $serie->{'name_created_by'} = $vorname . ' ' . $serie->{'name_created_by'} if $vorname;
+
+ $serie->{'id_changed_by'} = $serie_rs->get_column('changed_by');
+ $serie->{'changed_at'} = $serie_rs->get_column('changed_at');
+ $serie->{'name_changed_by'} = $serie_rs->get_column('changed_by_nachname');
+ $vorname = $serie_rs->get_column('changed_by_vorname');
+ $serie->{'name_changed_by'} = $vorname . ' ' . $serie->{'name_changed_by'} if $vorname;
+
push @$list, $serie;
+
}
return ( wantarray ? ( $list, 0 ) : $list ) unless scalar @$list;
my $K = ( caller(0) )[3] . "(): ";
$c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
- $c->log->debug( get_output_string( $K, "Zu speichernde Serie: ", $serie ) ) if $c->stash->{'debug_level'} >= 2;
+ my $schema = $c->model('Schema')->{'schema'};
my $storage = $c->model('Schema')->storage;
+
my $save_books = ( $serie->{'id'} and $serie->{'book_ids'} and ref($serie->{'book_ids'}) and ref($serie->{'book_ids'}) eq 'ARRAY') ? 1 : 0;
- $c->log->debug( $K . "Speichern der Bücher erforderlich: " . ( $save_books ? 'ja' : 'nein' ) . "." ) if $c->stash->{'debug_level'} > 2;
-
- my $save_func = sub {
- my ( $storage, $dbh, $serien_id, $serien_name, $serien_desc ) = @_;
- my $sql = <<ENDE;
-INSERT INTO `serien` (
- `id`, `serien_name`, `descr` )
- VALUES (
- ?, ?, ? )
- ON DUPLICATE KEY UPDATE
- `id` = LAST_INSERT_ID(`id`), `serien_name` = ?, `descr` = ?
-ENDE
-
- if ( $storage->debug() ) {
- my $text = $sql;
- $text =~ s/\s+$//;
- $text .= ": " . join( ", ", map { $dbh->quote($_) } ( $serien_id, $serien_name, $serien_desc, $serien_name, $serien_desc ) ) . "\n";
- warn $text;
+ $c->log->debug( $K . "Speichern der Bücher erforderlich: " . ( $save_books ? 'ja' : 'nein' ) . "." );
+
+ my $row = {};
+ my $search_params = {};
+
+ my $tmp = $serie->{'name'};
+ $tmp = '' unless defined $tmp;
+ $tmp =~ s/^\s+//;
+ $tmp =~ s/\s+$//;
+ $row->{'serien_name'} = $tmp;
+
+ if ( $serie->{'id'} ) {
+ $search_params->{'serien_name'} = $row->{'serien_name'};
+ $search_params->{'id'} = { '!=' => $serie->{'id'} };
+ $c->log->debug( get_output_string( $K, "Suche nach doppelter Serie mit: ", $search_params ) );
+ if ( $c->model('Schema::Serien')->count( $search_params ) ) {
+ die sprintf( "Die Buchserie '%s' existiert bereits.\n", $row->{'serien_name'} );
+ }
+ $row->{'id'} = $serie->{'id'};
+ }
+
+ $tmp = $serie->{'descr'};
+ $tmp = '' unless defined $tmp;
+ $tmp =~ s/^\s+//;
+ $tmp =~ s/\s+$//;
+ $row->{'descr'} = defined $tmp ? $tmp : undef;
+
+ my $user_id = $c->stash->{'current_user_id'} || 1;
+ $row->{'changed_at'} = \'NOW()';
+ $row->{'changed_by'} = $user_id;
+
+ $c->log->debug( get_output_string( $K, "Zu speichernde Buchserie: ", $row ) ) if $c->stash->{'debug_level'} >= 3;
+ my $id = undef;
+
+ # Der Transaktionscode ...
+ my $txn_code = sub {
+
+ my $key_hash = {};
+ $key_hash->{'key'} = $row->{'id'} ? 'primary' : 'serien_name';
+
+ my $rs = $c->model('Schema::Serien')->update_or_new( $row, $key_hash );
+
+ if ( $rs->in_storage() ) {
+
+ $c->log->debug( $K . "Die Buchserie gibt es schon ..." );
+
+ $rs->set_column( 'id' => \'LAST_INSERT_ID(`id`)' );
+ my $spalten = {};
+ %$spalten = $rs->get_columns();
+ $c->log->debug( get_output_string( $K, "Die Spalten der Buchserie: ", $spalten ) );
+ undef $spalten;
+
+ $rs->update();
+
+ }
+ else {
+ $c->log->debug( $K . "Neue Buchserie ..." );
+ $rs->set_column( 'created_by' => $user_id );
+ $rs->set_column( 'created_at' => \'NOW()' );
+ my $spalten = {};
+ %$spalten = $rs->get_columns();
+ $c->log->debug( get_output_string( $K, "Die Spalten der Buchserie: ", $spalten ) );
+ undef $spalten;
+
+ $rs->insert();
}
- my $sth = $dbh->prepare($sql);
- $sth->execute( $serien_id, $serien_name, $serien_desc, $serien_name, $serien_desc );
+ $id = $storage->last_insert_id();
+
+ $c->b_save_serien_buecher( $id, $serie->{'book_ids'} ) if $save_books;
+
};
- $storage->dbh_do( $save_func, $serie->{'id'}, $serie->{'name'}, $serie->{'descr'} );
- my $serien_id = $storage->last_insert_id();
- return $serien_id unless $serien_id;
+ # Und ab ...
+ eval {
+ $schema->txn_do($txn_code);
+ };
- $c->b_save_serien_buecher( $serien_id, $serie->{'book_ids'} ) if $save_books;
+ if ($@) { # Transaction failed
+ my $msg = $@ =~ /Rollback failed/i ? "Rollback nicht erfolgreich!" : $@;
+ die $msg . "\n";
+ return undef;
+ }
- return $serien_id;
+ return $id;
}
my $K = ( caller(0) )[3] . "(): ";
$c->log->debug( get_output_string( $K, "aufgerufen, Serien-Id: ", $serien_id, ", Buch-Ids: ", $book_ids ) ) if $c->stash->{'debug_level'} > 2;
+ my $schema = $c->model('Schema')->{'schema'};
my $storage = $c->model('Schema')->storage;
- my $dbh = $storage->dbh();
+ #my $dbh = $storage->dbh();
my $anzahl = 0;
$anzahl = scalar( @$book_ids );
- my $in = '';
- $in = '(' . join( ", ", map { $dbh->quote($_) } @$book_ids ) . ")" if $anzahl;
-
- my $sql;
- $sql = <<ENDE;
-DELETE FROM `buch2serie`
- WHERE `serien_id` = ?
-ENDE
- $sql .= " AND `buch_id` NOT IN " . $in . "\n" if $anzahl;
-
- my $qparams = [];
- push @$qparams, $serien_id;
-
- if ( $storage->debug() ) {
- my $text = $sql;
- $text =~ s/\s+$//;
- $text .= ": " . join( ", ", map { $dbh->quote($_) } @$qparams ) . "\n";
- warn $text;
- }
-
- my $sth = $dbh->prepare($sql);
- $sth->execute( @$qparams );
-
- return 1 unless $anzahl;
-
- my $i = 0;
-
- $sql = <<ENDE;
-INSERT INTO `buch2serie` (
- `buch_id`, `serien_id`, `ord_num`
- ) VALUES (
- ?, ?, ? )
- ON DUPLICATE KEY UPDATE
- `ord_num` = ?
-ENDE
+ my $search_params = {
+ 'serien_id' => $serien_id,
+ };
+ $search_params->{'buch_id'} = ( $anzahl <= 1 ? { '!=' => $book_ids->[0] } : { '-not_in' => $book_ids } ) if $anzahl;
- $sth = $dbh->prepare($sql);
+ # Der Transaktionscode ...
+ my $txn_code = sub {
- for my $buch_id ( @$book_ids ) {
+ $c->log->debug( get_output_string( $K, "Lösche Bücher -> Serien Zuordnungen: ", $search_params ) );
+ $c->model('Schema::Buch2serie')->search($search_params)->delete();
- $qparams = [];
- push @$qparams, $buch_id;
- push @$qparams, $serien_id;
- push @$qparams, $i;
- push @$qparams, $i;
+ my $i = 0;
- if ( $storage->debug() ) {
- my $text = $sql;
- $text =~ s/\s+$//;
- $text .= ": " . join( ", ", map { $dbh->quote($_) } @$qparams ) . "\n";
- warn $text;
+ for my $buch_id ( @$book_ids ) {
+ my $row = {
+ 'buch_id' => $buch_id,
+ 'serien_id' => $serien_id,
+ 'ord_num' => $i,
+ };
+ $c->log->debug( get_output_string( $K, "Lege Bücher -> Serien Zuordnung an: ", $row ) );
+ $c->model('Schema::Buch2serie')->update_or_create( $row, { key => 'buch_id' }, );
+ $i++;
}
- $sth->execute( @$qparams );
+ };
- $i++;
+ # Und ab ...
+ eval {
+ $schema->txn_do($txn_code);
+ };
+
+ if ($@) { # Transaction failed
+ my $msg = $@ =~ /Rollback failed/i ? "Rollback nicht erfolgreich!" : $@;
+ die $msg . "\n";
+ return undef;
}
+ return 1;
+
}
#-----------------------------------------------------------------------------------