]> Frank Brehm's Git Trees - books.git/commitdiff
weiter Umbau auf Transaktionen
authorFrank Brehm <frank@brehm-online.com>
Tue, 2 Mar 2010 22:40:14 +0000 (22:40 +0000)
committerFrank Brehm <frank@brehm-online.com>
Tue, 2 Mar 2010 22:40:14 +0000 (22:40 +0000)
db/changes-01.sql
lib/FrBr/Books/Db/Result/Serien.pm
lib/FrBr/Books/Plugin/Ort.pm
lib/FrBr/Books/Plugin/Serie.pm

index ceac7eaa1568cb42697a3f16de576d11aab9dc47..09c1b849fdddbfc2b975d8a31a08b2fced1d8527 100644 (file)
@@ -61,6 +61,33 @@ ALTER TABLE `orte`
   MODIFY `changed_at` datetime         NOT NULL COMMENT 'Wann geändert',
   MODIFY `changed_by` int(10) unsigned NOT NULL COMMENT 'Von welcher User-Id geändert';
 
+-- ----------------------------------------------------------------------------------
+-- Tabelle `serien` aufmotzen.
+
+ALTER TABLE `serien`
+  ADD `created_at` datetime,
+  ADD `created_by` int(10) unsigned,
+  ADD `changed_at` datetime,
+  ADD `changed_by` int(10) unsigned,
+  ADD KEY `created_by` (`created_by`),
+  ADD KEY `changed_by` (`changed_by`),
+  ADD CONSTRAINT `serien_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`user_id`),
+  ADD CONSTRAINT `serien_ibfk_2` FOREIGN KEY (`changed_by`) REFERENCES `users` (`user_id`);
+
+UPDATE `serien` SET
+  `created_at` = NOW(),
+  `created_by` = 1,
+  `changed_at` = NOW(),
+  `changed_by` = 1;
+
+COMMIT;
+
+ALTER TABLE `serien`
+  MODIFY `created_at` datetime         NOT NULL COMMENT 'Wann erstellt',
+  MODIFY `created_by` int(10) unsigned NOT NULL COMMENT 'Von welcher User-Id erstellt',
+  MODIFY `changed_at` datetime         NOT NULL COMMENT 'Wann geändert',
+  MODIFY `changed_by` int(10) unsigned NOT NULL COMMENT 'Von welcher User-Id geändert';
+
 -- ----------------------------------------------------------------------------------
 
 -- vim: noai : ts=4 fenc=utf-8 filetype=sql expandtab :
index 56c6e58bcc80b06d532df7237b2a5d3654e39528..7fb538b78e046b98ecf7120a7133f2628db39158 100644 (file)
@@ -11,13 +11,19 @@ use base 'DBIx::Class';
 __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
index 4ba10927e5e326489d266b29e715f7f5a11aa70a..99ef0d4c3aed828d77c2c0a7a0c444d72512ac23 100644 (file)
@@ -439,38 +439,6 @@ sub b_save_ort {
 
     return $id;
 
-=pod
-
-    my $save_func = sub {
-        my ( $storage, $dbh, $orts_id, $orts_name, $orts_desc, $statisch ) = @_;
-        my $sql = <<ENDE;
-INSERT INTO `orte` (
-    `id`, `name`, `descr`, `statisch` )
-  VALUES (
-    ?, ?, ?, ? )
-  ON DUPLICATE KEY UPDATE
-    `id` = LAST_INSERT_ID(`id`), `name` = ?, `descr` = ?, `statisch` = ?
-ENDE
-
-        if ( $storage->debug() ) {
-            my $text = $sql;
-            $text =~ s/\s+$//;
-            $text .= ": " . join( ", ", map { $dbh->quote($_) } ( $orts_id, $orts_name, $orts_desc, $statisch, $orts_name, $orts_desc, $statisch ) ) . "\n";
-            warn $text;
-        }
-
-        my $sth = $dbh->prepare($sql);
-        $sth->execute( $orts_id, $orts_name, $orts_desc, $statisch, $orts_name, $orts_desc, $statisch );
-    };
-
-    my $static = to_bool( $ort->{'statisch'} ) ? 'y' : 'n';
-
-    $storage->dbh_do( $save_func, $ort->{'id'}, $ort->{'name'}, $ort->{'descr'}, $static  );
-
-    return $storage->last_insert_id();
-
-=cut
-
 }
 
 #-----------------------------------------------------------------------------------
index 731eb3f3a7c0d54cfbf87396dd613c959831d0c8..654437b0fd36e5c647cb1f5dd429e6a134cc8c54 100644 (file)
@@ -61,6 +61,12 @@ Die zurueckgegebene Array-Ref hat folgenden Aufbau:
         '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,
@@ -149,21 +155,41 @@ sub b_get_serienliste {
     $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;
@@ -171,12 +197,29 @@ sub b_get_serienliste {
        }
  
     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;
@@ -339,41 +382,96 @@ sub b_save_serie {
     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;
 
 }
 
@@ -392,70 +490,52 @@ sub b_save_serien_buecher {
     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;
+
 }
 
 #-----------------------------------------------------------------------------------