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';
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
}
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;
}
}
}
my $m = {};
+ $m->{'name'} = $mapname;
# Mapdateien festlegen
unless ( $config_maps->{$mapname}{'file'} ) {
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;