
| Current Path : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Process/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/web-klick.de/dsh/50_dev2017/1300__perllib/Process/Address1.pm |
package Process::Address;
use strict;
use Data::Dumper;
use Digest::MD5;
use MIME::Entity;
$Data::Dumper::Sortkeys = 1;
sub new {
my $class = shift;
my $self = {};
bless($self,$class);
$self->{'ADR'} = [];
$self->read_adr(@_);
return($self);
}
#*******************************************************************
sub run {
my $self = shift;
my $func = shift;
if ($func =~ s/^\_//) {
print Dumper( $self->$func(@_) );
} else {
return( $self->$func(@_) );
}
}
#*******************************************************************
# Import of all files for the database
sub read_adr {
my $self = shift;
my $o = join(",",@_); # List of directories and files
my $adr = $self->{'ADR'}; # Originally given addresses
my $o1; my $o2; my $o3; my $fields; my @ee; my $entry;
my @files = ();
foreach $o1 (split(/,/,$o)) {
if (-f $o1) { push(@files,$o1); }
if (-d $o1) {
opendir(DDIR,$o1);
push(@INC,$o1);
while (0 == 0) {
$o2 = readdir(DDIR);
last if (!$o2);
push(@files,$o1 . "/" . $o2);
}
closedir(DDIR);
}
}
foreach $o (@files) {
open(FFILE,"<".$o);
$o1 = join("",<FFILE>);
close(FFILE);
if ($o1 =~ /^package +(.*?)\;/) { # Perl-Package
$o2 = $1;
eval("use $o2");
$o3 = $o2->adressen();
push(@$adr,@$o3);
}
elsif ($o =~ /csv$/) { # Excel-File
foreach $o2 (split(/\n/,$o1)) {
if (!$fields) {
$fields = split(/\;/,$o2);
} else {
@ee = @$fields;
$entry = {};
foreach $o3 (split(/\;/,$o2)) {
$entry->{shift(@ee)} = $o3;
}
push(@$adr,$entry);
}
}
}
}
$self->{'ADR'} = $adr;
my $merge = {};
foreach $o (@$adr) {
$merge->{Digest::MD5->md5_base64(Dumper($o))} = $o;
$o->{'MD5REVERSE'} = {}; # in den einzelnen Adressobjekten
} # werden die Child-Objekte hinzugefuegt
my $adr1 = {}; # hier werden die Adressobjekte gespeichert, die KEINE
foreach $o (keys %$merge) { # Vorgaenger mehr haben
$adr1->{$o} = 1;
# print "XX: $o\n";
$entry = $merge->{$o};
next if (!($entry->{'MD5KEY'}));
foreach $o1 (keys %{$entry->{'MD5KEY'}}) {
if (exists ($merge->{$o1})) {
delete ($adr1->{$o});
$merge->{$o1}->{'MD5REVERSE'}->{$o} = 1;
}
}
}
# in $adr1 stehen jetzt die zusammenhaengenden 'Baeume', die
# die Adressobjekte darstellen. Diese werden jetzt gemerged:
$fields = [];
foreach $o (keys %$adr1) {
$self->merge($merge,$o);
push(@$fields,$merge->{$o});
}
$self->{'ADR'} = $fields;
}
#*******************************************************************
sub merge {
my $self = shift;
my $merge = shift;
my $id = shift;
my $obj = $merge->{$id};
if (!(%{$obj->{'MD5REVERSE'}})) {
delete ($obj->{'MD5REVERSE'});
return();
}
my $obj1 = "",
my $zaehler = 0;
my $o;
foreach $o (keys %{$merge->{$obj}}) {
$self->merge($merge,$o);
if (!$obj1) {
$obj1 = $merge->{$o};
} else {
$zaehler = sprintf("%03u",$zaehler + 1);
$obj1->{'ALT'.$zaehler} = Dumper($merge->{$o});
}
}
$merge->{$id} = $obj1;
}
#*******************************************************************
sub find {
my $self = shift;
my $pattern = shift;
my $erg = [];
my $o; my $o1; my $o2; my $o3;
foreach $o (@{$self->{'ADR'}}) {
$o1 = Dumper($o);
foreach $o2 (split(/~/,$pattern)) {
foreach $o3 (split(/,/,$o2)) {
next if ($o1 =~ /$o3/);
$o2 = "";
last;
}
if ($o2) {
push(@$erg,{%$o});
$o1 = "";
last;
}
last if (!$o1);
}
}
return($erg);
}
#*******************************************************************
sub export {
my $self = shift;
my $entries = shift;
my $fields = shift;
if (!(ref($entries))) {
$entries = $self->find($entries);
}
if (!(ref($fields))) { $fields = [split(/,/,$fields)]; }
my $o; my $o1; my $o2;
my $file = ref($self) . "__export";
my $text = "package $file;\n" . <<'TEXT_ENDE';
# Dieses File ist wie folgt zu verwenden:
#
# Einfach die Felder editieren, den MD5KEY nicht anruehren.
# Mehrzeilige Eintraege im Format:
#
# FELD => 'XXX',
# Zeile 1
# Zeile
# ...
# XXX
#
# Hinzufuegen eines Datensatzes: OHNE MD5KEY-Feld!
# Entfernen eines Datensatzes: NICHT loeschen, sondern
# ins Feld DELETE irgendeinen Wert eingeben, z.B.:
# DELETE => '1', oder
# DELETE => '___DELETED___' (es kommt nur
# drauf an, dass IRGENDWAS drinsteht.
use vars qw(@ISA);
use Process::Address;
@ISA = qw(Process::Address);
sub adr { return( [
TEXT_ENDE
my $xls = "";
my $title = "";
my $bed = 0;
if (!@$fields) { $bed = 1; }
foreach $o (@$entries) {
$text = $text . "\n\n\{\n";
$o->{'MD5KEY'} = Digest::MD5->md5_base64(Dumper($o));
if ($bed) { $fields = [keys %$o]; }
$title = "";
foreach $o1 ("DELETE",@$fields) {
next if ($o1 !~ /^[A-Z0-9]+$/);
$title = $title . $o1 . "\;";
$o2 = $o->{$o1};
$o2 =~ s/\n/ /gs;
$xls = $xls . $o2 . "\;";
$o2 = length($o1);
$o2 = 20 if ($o2 < 20);
$text = $text . substr($o1." ",0,$o2) . " => ";
if ($o->{$o1} =~ /\n/) {
$o->{$o1} =~ s/\n*$//s;
$text = $text . "<<'XXX',\n" . $o->{$o1} . "\nXXX\n";
} else {
$text = $text . "'" . $o->{$o1} . "',\n";
}
}
$text = $text . "\},\n";
$xls = $xls . "\n";
}
$text =~ s/,\n$//s;
$text = $text . "\n \])\;\n\n\}\n\n\n1;\n";
open(FFILE,">$file.pm");
print FFILE $text;
close(FFILE);
open(FFILE,">$file.csv");
print FFILE $title . "\n" . $xls;
close(FFILE);
return($text);
}
#*******************************************************************
sub data {
my $self = shift;
my $text = shift;
$self->{'DATA'} = $text;
my $ee = [];
my $o;
foreach $o (split(/\n/,$text)) {
push(@$ee,$o."\n");
}
return($ee);
}
#*******************************************************************
sub xxff {
my $self = shift;
my $text = shift;
my $entry = shift;
my $o; my $o1;
$text =~ s/-(x[A-Z0-9\_]+)-/$entry->{$1}/gs;
while ($text =~ /(-[A-Z0-9\_]+-)/) {
print "QQQ: $1\n";
$o = $1;
$o1 = $entry->{$o} || $o;
$text =~ s/$o/$o1/gs;
}
return($text);
}
#*********************************************************************************
sub ff {
my $self = shift;
my $text = shift;
my $entry = shift;
my $o; my $o1; my $o2; my $o3; my @ee; my $erg; my $nr;
while ($text =~ /-(x?)(\d*[A-Z\_]+)(\d*)-/) {
$o1 = $1;
$o2 = $2;
$o3 = $3;
$o = $entry->{lc($o2.$o3)};
if (!$o) { $o = $entry->{uc($o2.$o3)}; }
if (!$o) { $o = $entry->{lc($o2)}; }
if (!$o) { $o = $entry->{uc($o2)}; }
if (!$o) {
if ($o =~ /(.*?)-(.*)/) {
$nr = $2;
$o2 = $1;
$o = $entry->{lc($o2)};
if (!$o) { $o = $entry->{uc($o2)}; }
if ($o =~ /sub +\{/) {
eval("\$o = " . $o);
$o = $self->$o($nr) if (!$@);
}
}
}
if ($o and $o3 and $o =~ /,/) {
$o =~ /^ *(.*?) *$/;
$o = $1;
$o = (split(/ *, */,$o))[$o3-1];
}
if (!$o) {
# $bed = 1;
if (!$o1) {
$o = "-".$o2.$o3."-";
}
}
push(@ee,$o);
$text =~ s/-$o1$o2$o3-/XXXYYYXXX/;
}
while ($text =~ /XXXYYYXXX/) {
$o = shift(@ee);
$text =~ s/XXXYYYXXX/$o/;
}
return($text);
}
#********************************************************************************
sub time_mark {
my $self = shift;
my $o1 = time();
$o1 = sprintf("%04u",(localtime($o1))[5]+1900) .
sprintf("%02u",(localtime($o1))[4]+1) .
sprintf("%02u",(localtime($o1))[3]) . "_" .
sprintf("%02u",(localtime($o1))[2]) .
sprintf("%02u",(localtime($o1))[1]);
return($o1);
}
1;