]> Frank Brehm's Git Trees - my-stuff/postfix-maps.git/commitdiff
Bis zum Schreiben der Arbeitsdateien gekommen
authorFrank Brehm <frank@brehm-online.com>
Thu, 5 Aug 2010 15:05:15 +0000 (15:05 +0000)
committerFrank Brehm <frank@brehm-online.com>
Thu, 5 Aug 2010 15:05:15 +0000 (15:05 +0000)
git-svn-id: http://svn.brehm-online.com/svn/my-stuff/postfix-maps/trunk@107 ec8d2aa5-1599-4edb-8739-2b3a1bc399aa

lib/FrBr/Postfix/App.pm

index a9afce4e73479d2bf7c2d95fefa0a90780a419e2..b74ef392a563cf544afdc14cb9f2780118898911 100644 (file)
@@ -23,6 +23,7 @@ use utf8;
 use MooseX::Types::Path::Class;
 use Path::Class;
 use Encode qw( decode_utf8 encode_utf8 is_utf8 );
+use POSIX qw( strftime );
 
 extends 'FrBr::Common::MooseX::App';
 
@@ -101,6 +102,29 @@ sub _build_workdir {
     return dir->new( 'work' );
 }
 
+#-------------------------
+
+=head2 restart_postfix
+
+Soll nach dem Mapping Postfix neu gestartet werden?
+
+=cut
+
+has 'restart_postfix' => (
+    is              => 'rw',
+    isa             => 'Bool',
+    traits          => [ 'NoGetopt' ],
+    lazy            => 1,
+    builder         => '_build_restart_postfix',
+    documentation   => 'Soll nach dem Mapping Postfix neu gestartet werden?',
+);
+
+#------
+
+sub _build_restart_postfix {
+    return 0;
+}
+
 #-----------------------------------------
 
 =head2 postfix_maps
@@ -286,7 +310,7 @@ after 'evaluate_config' => sub {
     }
 
     if ( $self->verbose >= 2 ) {
-        for my $key qw( postfix_dir work_dir postfix_maps valid_maptypes ) {
+        for my $key qw( postfix_dir work_dir postfix_maps restart_postfix valid_maptypes ) {
             my $tmp = $self->$key;
         }
     }
@@ -334,6 +358,7 @@ sub _initialise_maps {
             }
 
             my $m = {};
+            $m->{'name'} = $mapname;
 
             # Mapdateien festlegen
             unless ( $config_maps->{$mapname}{'file'} ) {
@@ -511,12 +536,129 @@ sub run {
         exit 2;
     }
 
+    if ( scalar( @{ $self->postfix_maps } ) ) {
+        for my $m ( @{ $self->postfix_maps } ) {
+            $self->do_mapping($m);
+        }
+    }
+    else {
+        $self->info( "Keine Map-Dateien zu erstellen." );
+    }
+
     $self->info( "Ende der Arbeit." );
 
 }
 
 #---------------------------------
 
+=head2 do_mapping( $map )
+
+Führt das eigentliche Mapping aus.
+
+=cut
+
+sub do_mapping {
+
+    my $self = shift;
+    my $map  = shift;
+
+    my $mapname = $map->{'name'};
+    $self->debug( sprintf( "Erstelle Map-Datei '%s' für Mapping '%s' ...", $map->{'mapfile'}, $mapname ) );
+
+    # Ermitteln der Maximallänge der ersten Spalte
+    my $first_col = $map->{'columns'}[0];
+    my $resultset = $map->{'resultset'};
+    my $o_opts = {
+        'select'    => [ { MAX => { CHAR_LENGTH => $first_col } } ],
+        'as'        => [ 'max_col_length' ],
+    };
+    my $max_col_length = 0;
+    $self->debug( sprintf( "Ermittle Maximallänge in Spalte '%s' von Mapping '%s' ...", $first_col, $mapname ) ) if $self->verbose >= 3;
+    eval {
+        for my $rs ( $self->schema->resultset($resultset)->search( $map->{'where'}, $o_opts )->first() ) {
+            $max_col_length = $rs->get_column('max_col_length');
+        }
+    };
+    if ( $@ ) {
+        $self->error( sprintf( "Konnte Maximallänge in Spalte '%s' von Mapping '%s' nicht ermitteln: %s.", $first_col, $mapname, $@ ) );
+        return undef;
+    }
+    $self->debug( sprintf( "Maximallänge in Spalte '%s' von Mapping '%s': %s", $first_col, $mapname, ( $max_col_length // 'undef' ) ) ) if $self->verbose >= 3;
+
+    # Erstellen der Arbeitsdatei
+    $self->debug( sprintf( "Öffne Arbeitsdatei '%s' ...", $map->{'workfile'} ) ) if $self->verbose >= 2;
+    unless ( open( FILE, ">", $map->{'workfile'}->stringify ) ) {
+        $self->warn( sprintf( "Fehler beim Öffnen von '%s': %s", $map->{'workfile'}, $_ ) );
+        return undef;
+    }
+
+    # Schreiben des Datei-Headers
+    print  FILE "#\n";
+    my $txt = $map->{'description'};
+    $txt = encode_utf8($txt) if is_utf8($txt);
+    printf FILE "# %s\n", $txt;
+    print  FILE "#\n";
+    printf FILE "# Erstellt am: %s\n", strftime( '%Y-%m-%d %H:%M:%S', localtime() );
+    print  FILE "#\n\n";
+
+    # Nachgucken, ob es überhaupt Zeilen zu Schreiben gibt:
+    $self->debug( sprintf( "Ermittle Anzahl der Zeilen von Mapping '%s' ...", $mapname ) ) if $self->verbose >= 3;
+    my $zahl = 0;
+    eval {
+        $zahl = $self->schema->resultset($resultset)->count( $map->{'where'} );
+    };
+    if ( $@ ) {
+        $self->error( sprintf( "Konnte Anzahl der Zeilen Mapping '%s' nicht ermitteln: %s.", $mapname, $@ ) );
+        close FILE;
+        return undef;
+    }
+    $self->debug( sprintf( "Anzahl der Zeilen Mapping '%s': %s", $mapname, ( $zahl // 'undef' ) ) );
+
+    if ( $zahl ) {
+
+        $max_col_length += 1 if $map->{'text_type'} eq 'aliases';
+
+        # Das eigentliche Herausholen aus der Datenbank
+
+        my $cols = [];
+        my $two_identic_cols = 0;
+        $two_identic_cols = 1 if $map->{'columns'}[0] eq $map->{'columns'}[1];
+        push @$cols, $map->{'columns'}[0];
+        push @$cols, $map->{'columns'}[1] unless $two_identic_cols;
+
+        $o_opts = {
+            'select'    => $cols,
+            'as'        => $cols,
+        };
+        $o_opts->{'order_by'} = $map->{'order_by'} if $map->{'order_by'};
+        $self->debug( sprintf( "Hole Zeilen von Mapping '%s' ...", $mapname ) );
+        eval {
+            for my $rs ( $self->schema->resultset($resultset)->search( $map->{'where'}, $o_opts )->all() ) {
+
+                my $field1 = $rs->get_column( $cols->[0] );
+                my $field2 = $two_identic_cols ? $field1 :  $rs->get_column( $cols->[1] );
+                $field1 .= ':' if $map->{'text_type'} eq 'aliases';
+                printf FILE "%-*s   %s\n", $max_col_length, $field1, $field2;
+
+            }
+        };
+        if ( $@ ) {
+            $self->error( sprintf( "Konnte Mapping '%s' nicht ermitteln: %s.", $mapname, $@ ) );
+            close FILE;
+            return undef;
+        }
+        print FILE "\n";
+
+    }
+
+    close FILE;
+
+    return 1;
+
+}
+
+#---------------------------------
+
 __PACKAGE__->meta->make_immutable;
 
 1;