]> Frank Brehm's Git Trees - books.git/commitdiff
weiter Umbau auf Transaktionen
authorFrank Brehm <frank@brehm-online.com>
Thu, 4 Mar 2010 18:27:17 +0000 (18:27 +0000)
committerFrank Brehm <frank@brehm-online.com>
Thu, 4 Mar 2010 18:27:17 +0000 (18:27 +0000)
db/changes-01.sql
lib/FrBr/Books/Db/Result/Verlage.pm
lib/FrBr/Books/Plugin/Category.pm
lib/FrBr/Books/Plugin/Ort.pm
lib/FrBr/Books/Plugin/Serie.pm
lib/FrBr/Books/Plugin/Verlag.pm

index 09c1b849fdddbfc2b975d8a31a08b2fced1d8527..120084ff642015cf70d1c2be359846b1263df72c 100644 (file)
@@ -88,6 +88,33 @@ ALTER TABLE `serien`
   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 `verlage` aufmotzen.
+
+ALTER TABLE `verlage`
+  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 `verlage_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `users` (`user_id`),
+  ADD CONSTRAINT `verlage_ibfk_2` FOREIGN KEY (`changed_by`) REFERENCES `users` (`user_id`);
+
+UPDATE `verlage` SET
+  `created_at` = NOW(),
+  `created_by` = 1,
+  `changed_at` = NOW(),
+  `changed_by` = 1;
+
+COMMIT;
+
+ALTER TABLE `verlage`
+  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 9db610cfa71bb6c49a4f7e5c0434db3e14e98f7e..29d30182bdba894d18379842e17c79f3c6326596 100644 (file)
@@ -11,13 +11,20 @@ use base 'DBIx::Class';
 __PACKAGE__->load_components("Core");
 __PACKAGE__->table("verlage");
 __PACKAGE__->add_columns(
-  "id"         => { data_type => "INT",     default_value => undef, is_nullable => 0, size => 10 },
-  "name_short" => { data_type => "VARCHAR", default_value => undef, is_nullable => 0, size => 50, },
-  "name_long"  => { data_type => "VARCHAR", default_value => undef, is_nullable => 0, size => 250, },
+  "id"         => { data_type => "INT",      default_value => undef, is_nullable => 0, size => 10 },
+  "name_short" => { data_type => "VARCHAR",  default_value => undef, is_nullable => 0, size => 50, },
+  "name_long"  => { data_type => "VARCHAR",  default_value => undef, is_nullable => 0, size => 250, },
+  "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("name_short", ["name_short"]);
 
+__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" },);
+
 __PACKAGE__->has_many( 'buecher' => 'FrBr::Books::Db::Result::Buecher', { 'foreign.verlags_id' => 'self.id' } );
 
 1;
index 656b4449f13415bb915fde205071c3aa284fd653..7541ad438ac0e223677895ebcc46a7c6a1b4fde1 100644 (file)
@@ -9,7 +9,7 @@ use warnings;
 use Carp qw/croak/;
 use FrBr::Common;
 
-our $VERSION = '0.2';
+our $VERSION = '0.3';
 {
     my ($rev) = '$Revision$' =~ /(\d+)/;
     $VERSION = sprintf( $VERSION . ".%d", $rev );
@@ -339,15 +339,13 @@ sub b_save_category {
     $tmp =~ s/\s+$//;
        $row->{'kategorie_name'} = $tmp;
 
-    if ( $cat->{'id'} ) {
-        $search_params->{'kategorie_name'} = $row->{'kategorie_name'};
-        $search_params->{'id'} = { '!=' => $cat->{'id'} };   
-        $c->log->debug( get_output_string( $K, "Suche nach doppelter Kategorie mit: ", $search_params ) );
-        if ( $c->model('Schema::Kategorien')->count( $search_params ) ) {
-            die sprintf( "Die Kategorie '%s' existiert bereits.\n", $row->{'kategorie_name'} );
-        }
-        $row->{'id'} = $cat->{'id'};
+    $search_params->{'kategorie_name'} = $row->{'kategorie_name'};
+    $search_params->{'id'} = { '!=' => $cat->{'id'} } if $cat->{'id'};
+    $c->log->debug( get_output_string( $K, "Suche nach doppelter Kategorie mit: ", $search_params ) );
+    if ( $c->model('Schema::Kategorien')->count( $search_params ) ) {
+        die sprintf( "Die Kategorie '%s' existiert bereits.\n", $row->{'kategorie_name'} );
     }
+    $row->{'id'} = $cat->{'id'} if $cat->{'id'};
 
     my $user_id = $c->stash->{'current_user_id'} || 1;
     $row->{'changed_at'} = \'NOW()';
index 99ef0d4c3aed828d77c2c0a7a0c444d72512ac23..96181ff54121143adeb739c3321427d26816c522 100644 (file)
@@ -9,7 +9,7 @@ use warnings;
 use Carp qw/croak/;
 use FrBr::Common;
 
-our $VERSION = '0.2';
+our $VERSION = '0.3';
 {
     my ($rev) = '$Revision$' =~ /(\d+)/;
     $VERSION = sprintf( $VERSION . ".%d", $rev );
@@ -364,15 +364,13 @@ sub b_save_ort {
     $tmp =~ s/\s+$//;
        $row->{'name'} = $tmp;
 
-    if ( $ort->{'id'} ) {
-        $search_params->{'name'} = $row->{'name'};
-        $search_params->{'id'} = { '!=' => $ort->{'id'} };   
-        $c->log->debug( get_output_string( $K, "Suche nach doppeltem Aufbewahrungsort mit: ", $search_params ) );
-        if ( $c->model('Schema::Orte')->count( $search_params ) ) {
-            die sprintf( "Der Aufbewahrungsort '%s' existiert bereits.\n", $row->{'name'} );
-        }
-        $row->{'id'} = $ort->{'id'};
+    $search_params->{'name'} = $row->{'name'};
+    $search_params->{'id'} = { '!=' => $ort->{'id'} } if $ort->{'id'};
+    $c->log->debug( get_output_string( $K, "Suche nach doppeltem Aufbewahrungsort mit: ", $search_params ) );
+    if ( $c->model('Schema::Orte')->count( $search_params ) ) {
+        die sprintf( "Der Aufbewahrungsort '%s' existiert bereits.\n", $row->{'name'} );
     }
+    $row->{'id'} = $ort->{'id'} if $ort->{'id'};
 
     $tmp = $ort->{'descr'};
     $tmp = '' unless defined $tmp;
index 654437b0fd36e5c647cb1f5dd429e6a134cc8c54..670c7c5812edd50191e9c42718776cea008d9865 100644 (file)
@@ -9,7 +9,7 @@ use warnings;
 use Carp qw/croak/;
 use FrBr::Common;
 
-our $VERSION = '0.2';
+our $VERSION = '0.3';
 {
     my ($rev) = '$Revision$' =~ /(\d+)/;
     $VERSION = sprintf( $VERSION . ".%d", $rev );
@@ -398,15 +398,13 @@ sub b_save_serie {
     $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'};
+    $search_params->{'serien_name'} = $row->{'serien_name'};
+    $search_params->{'id'} = { '!=' => $serie->{'id'} } if $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'} if $serie->{'id'};
 
     $tmp = $serie->{'descr'};
     $tmp = '' unless defined $tmp;
index 51b8e455d7f3c4e223942b8950a3ef3523409209..b3910b36cd76f9d421abe1b7d8098e1f44af8cf9 100644 (file)
@@ -9,7 +9,7 @@ use warnings;
 use Carp qw/croak/;
 use FrBr::Common;
 
-our $VERSION = '0.02';
+our $VERSION = '0.3';
 {
     my ($rev) = '$Revision$' =~ /(\d+)/;
     $VERSION = sprintf( $VERSION . ".%d", $rev );
@@ -54,10 +54,16 @@ Rueckgabe: Im skalaren Kontext eine Array-Ref von Hash-Refs mit allen Verlagen,
 
   $res = [
        {
-               'id'                    => 7,
-               'name'                  => 'Heyne',
-               'name_long'             => 'Heyne-Verlag usw. GmbH & Co. KG',
-               'count_books'   => 22,
+               'id'              => 7,
+               'name'            => 'Heyne',
+               'name_long'       => 'Heyne-Verlag usw. GmbH & Co. KG',
+               'count_books'     => 22,
+        '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',
                'books'         => [
                  {
                        'id'                 => 8,
@@ -137,34 +143,71 @@ sub b_get_verlagsliste {
     $c->log->debug(  get_output_string( $K, "Anzahl gefundene Verlage: ", $anzahl_verlage ) ) if $c->stash->{'debug_level'} >= 2;
 
     my $other_params = {};
-    $other_params->{'order_by'} = [ 'name_short' ];
+    $other_params->{'order_by'} = [ 'me.name_short' ];
+       $other_params->{'join'} = [
+        'buecher',
+        'created_by',
+        'changed_by',
+    ];
     $other_params->{'select'} = [
         'me.id',
         'me.name_short',
         'me.name_long',
-               { 'count' => 'buecher.id' }
+        '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' => 'buecher.id' }
     ];
     $other_params->{'as'} = [
         'id',
         'name_short',
         'name_long',
-               'count_books',
+        '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'} = [ 'buecher'];
-       $other_params->{'group_by'} = [ 'id' ];
+    $other_params->{'group_by'} = [ 'me.id' ];
 
-       if ( $page ) {
-               $other_params->{'rows'} = $rows;
-               $other_params->{'page'} = $page;
-       }
+    if ( $page ) {
+        $other_params->{'rows'} = $rows;
+        $other_params->{'page'} = $page;
+    }
  
     for my $verlag_rs ( $c->model('Schema::Verlage')->search( $search_params, $other_params )->all() ) {
+
+        my $vorname = '';
         my $verlag = {};
+
         $verlag->{'id'}          = $verlag_rs->id();
         $verlag->{'name'}        = $verlag_rs->name_short();
         $verlag->{'name_long'}   = $verlag_rs->name_long();
         $verlag->{'count_books'} = $verlag_rs->get_column('count_books');
+
+        $verlag->{'id_created_by'}   = $verlag_rs->get_column('created_by');
+        $verlag->{'created_at'}      = $verlag_rs->get_column('created_at');
+        $verlag->{'name_created_by'} = $verlag_rs->get_column('created_by_nachname');
+        $vorname                     = $verlag_rs->get_column('created_by_vorname');
+        $verlag->{'name_created_by'} = $vorname . ' ' . $verlag->{'name_created_by'} if $vorname;
+
+        $verlag->{'id_changed_by'}   = $verlag_rs->get_column('changed_by');
+        $verlag->{'changed_at'}      = $verlag_rs->get_column('changed_at');
+        $verlag->{'name_changed_by'} = $verlag_rs->get_column('changed_by_nachname');
+        $vorname                     = $verlag_rs->get_column('changed_by_vorname');
+        $verlag->{'name_changed_by'} = $vorname . ' ' . $verlag->{'name_changed_by'} if $vorname;
+
         push @$list, $verlag;
+
     }
 
     return ( wantarray ? ( $list, 0 ) : $list ) unless scalar @$list;
@@ -309,34 +352,88 @@ sub b_save_verlag {
 
     $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
 
+    my $schema =  $c->model('Schema')->{'schema'};
     my $storage = $c->model('Schema')->storage;
 
-    my $save_func = sub {
-        my ( $storage, $dbh, $verlags_id, $name_short, $name_long ) = @_;
-        $name_long = '' unless defined $name_long;
-        my $sql = <<ENDE;
-INSERT INTO `verlage` (
-    `id`, `name_short`, `name_long` )
-  VALUES (
-    ?, ?, ? )
-  ON DUPLICATE KEY UPDATE
-    `id` = LAST_INSERT_ID(`id`), `name_short` = ?, `name_long` = ?
-ENDE
-
-        if ( $storage->debug() ) {
-            my $text = $sql;
-            $text =~ s/\s+$//;
-            $text .= ": " . join( ", ", map { $dbh->quote($_) } ( $verlags_id, $name_short, $name_long, $name_short, $name_long ) ) . "\n";
-            warn $text;
+       my $row = {};
+       my $search_params = {};
+
+    my $tmp = $verlag->{'name'};
+    $tmp = '' unless defined $tmp;
+    $tmp =~ s/^\s+//;
+    $tmp =~ s/\s+$//;
+       $row->{'name_short'} = $tmp;
+
+    $search_params->{'name_short'} = $row->{'name_short'};
+    $search_params->{'id'} = { '!=' => $verlag->{'id'} } if $verlag->{'id'};
+    $c->log->debug( get_output_string( $K, "Suche nach doppeltem Verlag mit: ", $search_params ) );
+    if ( $c->model('Schema::Verlage')->count( $search_params ) ) {
+        die sprintf( "Der Verlag '%s' existiert bereits.\n", $row->{'name_short'} );
+    }
+    $row->{'id'} = $verlag->{'id'} if $verlag->{'id'};
+
+    $tmp = $verlag->{'name_long'};
+    $tmp = '' unless defined $tmp;
+    $tmp =~ s/^\s+//;
+    $tmp =~ s/\s+$//;
+       $row->{'name_long'} = $tmp;
+
+    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 speichernder Verlag: ", $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' : 'name_short';
+
+        my $rs = $c->model('Schema::Verlage')->update_or_new( $row, $key_hash );
+
+        if ( $rs->in_storage() ) {
+
+            $c->log->debug( $K . "Den Verlag 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 des Verlags: ", $spalten ) );
+            undef $spalten;
+
+            $rs->update();
+
         }
+        else {
+            $c->log->debug( $K . "Neuer Verlag ..." );
+            $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 des Verlags: ", $spalten ) );
+            undef $spalten;
+
+            $rs->insert();
+        }
+
+        $id = $storage->last_insert_id();
 
-        my $sth = $dbh->prepare($sql);
-        $sth->execute( $verlags_id, $name_short, $name_long, $name_short, $name_long );
     };
 
-    $storage->dbh_do( $save_func, $verlag->{'id'}, $verlag->{'name'}, $verlag->{'name_long'} );
+    # 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 $storage->last_insert_id();
+    return $id;
 
 }