]> Frank Brehm's Git Trees - books.git/commitdiff
Check wegen doppelten Autoren-Einträgen beim Speichern
authorFrank Brehm <frank@brehm-online.com>
Mon, 8 Dec 2008 16:16:58 +0000 (16:16 +0000)
committerFrank Brehm <frank@brehm-online.com>
Mon, 8 Dec 2008 16:16:58 +0000 (16:16 +0000)
lib/FrBr/Books/Controller/Autor.pm
lib/FrBr/Books/Controller/Books.pm
lib/FrBr/Books/Db.pm
lib/FrBr/Books/Util/Author.pm

index a31ff155ce4c65724b304a2068c92a324ec646df..2fbbca8c70b01c919a91b7c77ae2fa776acf0650 100644 (file)
@@ -157,13 +157,20 @@ sub save_author : Private {
 
     return 1 unless $self->check_formparams($c);
 
+    my $autor_id = undef;
     eval {
-        die "Speichern des Autors misslungen." unless save_autor( $c, $c->stash->{'autor_edit'} );
+        $autor_id = save_autor( $c, $c->stash->{'autor_edit'} );
     };
     if ( $@ ) {
         $c->stash->{'error_message'} = $@;
         return undef;
     }
+    unless ( $autor_id ) {
+        my $msg = $c->stash->{'save_autor_result'} || "Speichern des Buchs mißlungen.";
+        $c->log->info( $K . "Fehler beim Speichern: " . $msg );
+        $c->stash->{'error_message'} = $msg;
+        return undef;
+    }
 
     $c->stash->{'template'} = 'autor/save_success.tt2';
     delete $c->session->{'autor_data_edit'} if exists $c->session->{'autor_data_edit'};
index 05d5f501e5531c5947235e1409cc095387c2ccca..975309166e8504055e5a80efe5ca217b7f45582a 100644 (file)
@@ -242,13 +242,21 @@ sub do_save_book : Private {
 
     return 1 unless $self->check_formparams( $c, $book );
 
+    my $book_id = undef;
+
     eval {
-        die "Speichern des Buchs mißlungen." unless save_book( $c, $book );
+        $book_id = save_book( $c, $book );
     };
     if ( $@ ) {
         $c->stash->{'error_message'} = $@;
         return undef;
     }
+    unless ( $book_id ) {
+        my $msg = $c->stash->{'save_book_result'} || "Speichern des Buchs mißlungen.";
+        $c->log->info( "Fehler beim Speichern: " . $msg );
+        $c->stash->{'error_message'} = $msg;
+        return undef;
+    }
 
     $c->stash->{'template'} = 'books/save_success.tt2';
     delete $c->session->{'book_data_edit'} if exists $c->session->{'book_data_edit'};
index 45a6f44526f4b0e27f4b2cf6a91ce33d18c93651..003af1aec17aaca66d62390f080c5b6629879a49 100644 (file)
@@ -14,7 +14,6 @@ __PACKAGE__->load_classes;
 # Created by DBIx::Class::Schema::Loader v0.04004 @ 2008-03-17 17:53:52
 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:yMIjCo2VODRuy9VqS1AeQA
 
-
 # You can replace this text with custom content, and it will be preserved on regeneration
 1;
 
index 09ed1cda12881a9e1eab4f02ff06c8e6c92a0c73..e2577c06e97141a44825ae55572fa3883ede790f 100644 (file)
@@ -24,6 +24,7 @@ BEGIN {
     @ISA    = qw(Exporter);
     @EXPORT = qw(
         &get_author_list
+        &get_autor_id
         &save_autor
     );
 
@@ -202,11 +203,12 @@ sub save_autor {
 
     my $c     = shift;
     my $autor = shift;
-    my $K = __PACKAGE__ . "::save_autor(): ";
+    my $K = ( caller(0) )[3] . "(): ";
 
     $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 2;
 
     my $storage = $c->stash->{'storage'};
+    $c->stash->{'storage'}{'save_autor_result'} = '';
 
     my $save_func = sub {
 
@@ -268,6 +270,8 @@ ENDE
 
     push @Params, $autor->{'id'};
 
+    my $a_params = {};
+
     my $tmp = $autor->{'titel'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
@@ -279,29 +283,70 @@ ENDE
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
     push @Params, ( $tmp ? $tmp : undef );
+    $a_params->{'vorname'} = $tmp if $tmp;
 
     $tmp = $autor->{'mittelname'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
     push @Params, ( $tmp ? $tmp : undef );
+    $a_params->{'mittelname'} = $tmp if $tmp;
 
     $tmp = $autor->{'nachname'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
     push @Params, $tmp;
+    $a_params->{'nachname'} = $tmp;
 
     $tmp = $autor->{'name_suffix'};
     $tmp = '' unless defined $tmp;
     $tmp =~ s/^\s+//;
     $tmp =~ s/\s+$//;
     push @Params, ( $tmp ? $tmp : undef );
+    $a_params->{'name_suffix'} = $tmp if $tmp;
 
     push @Params, $autor->{'desc'};
 
+    # Zuerst einmal Test im nichgelocktem Zustand ...
+    if ( $autor->{'id'} ) {
+        my $new_id = get_autor_id( $c, $a_params );
+        if ( $new_id and ( $new_id != $autor->{'id'} ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+            return undef;
+        }
+    }
+    else {
+        if ( get_autor_id( $c, $a_params ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+            return undef;
+        }
+    }
+
+    # Sperren der Autoren-Tabelle
     lock_tables( $c, 'write' => [ 'autoren', 'autoren', 'as', 'me' ] );
 
+    # Und jetzt Test im gelocktem Zustand ...
+    if ( $autor->{'id'} ) {
+        my $new_id = get_autor_id( $c, $a_params );
+        if ( $new_id and ( $new_id != $autor->{'id'} ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+            unlock_tables($c);
+            return undef;
+        }
+    }
+    else {
+        if ( get_autor_id( $c, $a_params ) ) {
+            $c->stash->{'save_autor_result'} = 'Es existiert bereits ein Autor mit den uebergebenen Angaben.';
+            $c->log->info( $K . "Es existiert bereits ein Autor mit den uebergebenen Angaben." );
+            unlock_tables($c);
+            return undef;
+        }
+    }
+
     my $id = undef;
     my $do_insert = undef;
     if ( $autor->{'id'} ) {
@@ -331,12 +376,79 @@ ENDE
 
     my $author_id = $storage->last_insert_id();
     unlock_tables($c);
+    $c->stash->{'storage'}{'save_autor_result'} = 'OK';
     return $author_id;
 
 }
 
 #-----------------------------------------------------------------------------------
 
+=head2 get_autor_id( $c, 'nachname' => 'Wolf', 'vorname' => 'Friedrich' )
+
+=cut
+
+sub get_autor_id {
+
+    my $c = shift;
+    my $K = ( caller(0) )[3] . "(): ";
+
+    $c->log->debug( $K . "aufgerufen." ) if $c->stash->{'debug_level'} > 3;
+
+    my $params = {};
+    if ( ref($_[0]) and ref($_[0]) eq 'HASH' ) {
+        $params = $_[0];
+    }
+    else {
+        %$params = @_;
+    }
+    $c->log->debug(  get_output_string( $K, "Uebergebene Parameter: ", $params ) ) if $c->stash->{'debug_level'} >= 2;
+
+    my $storage = $c->stash->{'storage'};
+    #$c->log->debug(  get_output_string( $K, "Storage: ", $storage ) ) if $c->stash->{'debug_level'} >= 4;
+
+    my $name = $params->{'nachname'};
+    $name = $params->{'mittelname'} . " " . $name if defined $params->{'mittelname'};
+    $name = $params->{'vorname'} . " " . $name if defined $params->{'vorname'};
+    $name .= " " . $params->{'name_suffix'} if defined $params->{'name_suffix'};
+
+    my $select_func = sub {
+
+        my ( $storage, $dbh, $name ) = @_;
+        my $sql = <<ENDE;
+SELECT `me`.`id`
+  FROM `autoren` AS `me`
+ WHERE CONCAT(
+           IFNULL( `me`.`vorname`, '' ),    IF( ISNULL(`me`.`vorname`), '', ' ' ),
+           IFNULL( `me`.`mittelname`, '' ), IF( ISNULL(`me`.`mittelname`), '', ' ' ),
+           `me`.`nachname`,
+           IF( ISNULL( `me`.`name_suffix` ), '', ' ' ), IFNULL( `me`.`name_suffix`, '' )
+       ) = ?
+ENDE
+
+        if ( $storage->debug() ) {
+            my $text = $sql;
+            $text =~ s/\s+$//;
+            $text .= ": " . join( ", ", map { $dbh->quote($_) } ( $name ) ) . "\n";
+            warn $text;
+        }
+
+        my $sth = $dbh->prepare($sql);
+        $sth->execute( $name );
+
+        return $sth->fetchall_arrayref();
+    };
+
+    my $id = undef;
+    for my $autor_rs ( $storage->dbh_do( $select_func, $name ) ) {
+        $id = $autor_rs->[0];
+    }
+
+    return $id;
+
+}
+
+#-----------------------------------------------------------------------------------
+
 =head1 AUTHOR
 
 Frank Brehm