Projekt: Hesla Jednoty bratrské/2017/hes-sql-load.pl
Vzhled
hes-sql-load.pl
[editovat]#! /usr/bin/perl -w
# hes-sql-load.pl Probere databázi s importovanými Losungen a nacpe je do příslušných tabulek
# (copyleft) Petr Heřman
# v. 0.2 Hesla 2017 – upraveno pro případ, že sloupce Ft1_Angaben a Ft2_Angaben v tabulce Import obsashují jednořádkové záznamy
#my $jahreslosung = '';
#my $jahres
use DateTime;
use utf8;
use open ':utf8', ':std';
#binmode STDOUT, ':utf8';
use HesSQL qw($dbh $import_r $day_cs_r $day_w $dayname_w $losung_w $reading_w $song_w $comment_w $drittetext_w);
my $verbose = 0; # 2 = neděle, 3= všechny dny, 4 = názvy nedělí, 5=názvý svátků,
# 6=angaben, 7=comments, 8=DT, 9=, 10=počet Angaben, 11=vypíše Angaben, 12=původní Angaben, 13=READINGS
my @dow_de = qw(Mo Di Mi Do Fr Sa So); # day of week
sub default { # Nastavení defaultní hodnoty, pokud je nulová nebo nedefinovaná
my ($variable_ref, $default_value) = @_;
if(! ${$variable_ref}) {${$variable_ref} = $default_value;}
}
sub defaultquelle { # Nastavení defaultní hodnoty překladu na Luthera revidovaného 'Lr'
my ($variable_ref) = @_;
default($variable_ref, 'Lr'); #Lutherbibel, revidierte Texte 1984
}
sub normalize { # Normalizuje odkaz (!!pozor, neřeší vícenásobný 'oder')
my ($src) = @_;
if ($src=~ /^(\d\.) /){
#print ("$src ->");
$src = $1.$';
#print ("$src\n");
}
return $src;
}
sub feiertag;
$dbh->do("TRUNCATE `day`");
#$dbh->do("TRUNCATE `dayname`");
$dbh->do("TRUNCATE `losung`");
$dbh->do("TRUNCATE `reading`");
$dbh->do("TRUNCATE `song`");
$dbh->do("TRUNCATE `comment`");
$dbh->do("TRUNCATE `drittetext`");
# tabulka `day`:
my $sun_n = 0; # pořadí neděle, počítané z počtu nedělí
#my $sun_nr = 0; # pořadí neděle, počítané v subroutině feiertag – mělo by souhlasit
my $sun_nr = 1; # OBEZLIČKA propřípad, že rok začíná nedělí
my $holi_nr = 0; # pořadí svátku
my $seq = 0; # pořadí záznamů
my $nrecords = $import_r->execute();
print "$nrecords records:\n\n";
while(my @row = $import_r->fetchrow_array ) {
# print "@row\n";
foreach my $item(@row){if($item eq 'x' || $item eq ''){undef $item;}} # 'x' v originále = NULL
my ($MonSpruch_Bibeltext, $MonSpruch_Stelle, $MonSpruch_Quelle,
# NÁZEV SVÁTKU, text, odkaz, překlad, písně, predigt atd.
$Ft1_Feiertag, $Ft1_Bibeltext, $Ft1_Stelle, $Ft1_Quelle, $Ft1_Angaben,
$Ft2_Feiertag, $Ft2_Bibeltext, $Ft2_Stelle, $Ft2_Quelle, $Ft2_Angaben,
$Datum,
$Los_Nummer, $Los_Vortext, $Los_Bibeltext, $Los_Stelle, $Los_Quelle, # SZ heslo
$Lt_Vortext, $Lt_Bibeltext, $Lt_Stelle, $Lt_Quelle, # NZ verš
$Bibellese_1, $Bibellese_2,
$Gedenktage_Ek, $Gedenktage_Ebu,
$Dt_Text, $Dt_Quelle, $Dt_Gesangbuch, $Dt_Autor) = @row;
#last if($Datum eq '2011-04-25');
$Datum =~ /(\d+)-(\d+)-(\d+)/;
my $date = DateTime->new( year => $1, month => $2, day => $3);
$date->DefaultLocale("cs_CZ.UTF-8");
my $sunday = $date->day_of_week_0 == 6 ? 1 : 0; # je neděle?
my $dow = @dow_de[$date->day_of_week_0]; # Mo Di Mi Do Fr Sa So
$sun_n++ if $sunday; # počítáme skutečné neděle
printf ("\n%10s %2s:", $Datum, $dow) if $verbose>=3 or $sunday and $verbose>=2;
if($MonSpruch_Bibeltext){
print '#MONTH' if $verbose>=3;
defaultquelle(\$MonSpruch_Quelle);
$losung_w->execute
(0, $Datum, 0, 'MONTH', undef, 'de', $MonSpruch_Quelle, $MonSpruch_Stelle, undef, $MonSpruch_Bibeltext);
}
feiertag (1, $Datum, $dow, $sunday, $Ft1_Feiertag, $Ft1_Bibeltext, $Ft1_Stelle, $Ft1_Quelle, $Ft1_Angaben);
feiertag (2, $Datum, $dow, $sunday, $Ft2_Feiertag, $Ft2_Bibeltext, $Ft2_Stelle, $Ft2_Quelle, $Ft2_Angaben);
print ' OT+NT' if $verbose>=3;
defaultquelle(\$Los_Quelle);
defaultquelle(\$Lt_Quelle);
$losung_w->execute(0, $Datum, 0, 'OT', $Los_Nummer, 'de', $Los_Quelle, $Los_Stelle, $Los_Vortext, $Los_Bibeltext);
$losung_w->execute(0, $Datum, 0, 'NT', undef, 'de', $Lt_Quelle, $Lt_Stelle, $Lt_Vortext, $Lt_Bibeltext );
if($Bibellese_1) { print ' SR' if $verbose >= 3; $reading_w->execute(0, $Datum, 0, 'SR', 'de', normalize($Bibellese_1)); }
if($Bibellese_2) { print '+CR' if $verbose >= 3; $reading_w->execute(0, $Datum, 0, 'CR', 'de', normalize($Bibellese_2)); }
if($Gedenktage_Ek) {
my $day_meaning = undef;
if($Gedenktage_Ek =~ / \((.*)\)/) { # význam
$Gedenktage_Ek = $`;
$day_meaning = $1;
}
my $nwhich = $day_cs_r->execute($Gedenktage_Ek);
$nwhich == 1 or print "\n !!CHYBA: $nwhich záznamů v day_cs pro '$Gedenktage_Ek'\n";
my $whichday = $day_cs_r->fetchrow_array;
if(! $whichday) {print "\n !!CHYBA: Neurčený druh neděle/svátku Gedenk [$Gedenktage_Ek]\n";}
++$holi_nr; ++$seq;
print "+<$holi_nr>'$whichday'" if $verbose>=5; print "[$Gedenktage_Ek]" if $verbose>=7;
$day_w->execute(0, $Datum, $dow, $seq, $whichday, $holi_nr, 'de', $Gedenktage_Ek, $day_meaning, undef);
}
if($Gedenktage_Ebu) {
print '+CommEbu' if $verbose>=5; print "[$Gedenktage_Ebu]" if $verbose>=7;
my $histdatetxt = undef;
if ($Gedenktage_Ebu =~ /: /) { $histdatetxt = $`; $Gedenktage_Ebu = $';}
$comment_w->execute(0, $Datum, 'de', $histdatetxt, $Gedenktage_Ebu);
}
if($Dt_Text) {
print ' + DT' if $verbose>=8;
if($Dt_Text =~ / \*/) { if(!$Dt_Autor){$Dt_Text=$`; $Dt_Autor='*';} else {die "* Dt_Autor: $Dt_Autor";}}
$drittetext_w->execute(0, $Datum, 'de', $Dt_Quelle, $Dt_Gesangbuch, $Dt_Autor, $Dt_Text);
}
}
END {
# $dbh->disconnect;
print "\n---KONEC---\n" if $verbose;
}
### SUBR ###
sub feiertag { # Zpracuje 1. nebo 2. Feiertag ($12)
for (my $i=4; $i<=7; $i++) {if ($_[$i] && (($_[$i] eq 'x') || ($_[$i] eq 'X'))) {$_[$i] = '';}} # "x" znamená "nic"
my ($f12, $Datum, $dow, $sunday, $Ft_Feiertag, $Ft_Bibeltext, $Ft_Stelle, $Ft_Quelle, $Ft_Angaben) = @_;
#print ">>$Datum, sun=$sunday<<";
my $which = undef; # co je to za svátek: week, sunday, holiday, important
if($Ft_Feiertag){
my $meaning = my $src = undef;
if($Ft_Feiertag =~ / \((.*)\)/) { # jestliže je uvedený ještě význam v závorce
$Ft_Feiertag = $`;
$meaning = $1;
if($meaning =~ / (\w+ \d+,\d+)/) { # jestliže je k tomu ještě biblický odkaz
$meaning = $`;
$src = $1;
}
}
my $nwhich = $day_cs_r->execute($Ft_Feiertag); # Najdi v databázi co je to za svátek
$nwhich == 1 or print "\n !!CHYBA ($Datum): $nwhich záznamů v day_cs pro '$Ft_Feiertag'\n"; # (měl by tam být právě jeden záznam)
$which = $day_cs_r->fetchrow_array;
if(! $which) {print "\n !!CHYBA ($Datum): Neurčený druh neděle/svátku Ft [$Ft_Feiertag]\n";}
if($Ft_Feiertag eq 'WEIHNACHTSFEST' and $sunday) {
$which = 'sunday';
print "(1. svátek vánoční připadá na neděli)" if $verbose;
}
if($Ft_Feiertag eq 'ZUM ERNTEDANKFEST' and $sunday) {
$which = 'sunday';
print "(Den díkůvzdání za úrodu je namísto neděle)" if $verbose;
}
my $nr = $which eq 'sunday' ? ++$sun_nr : ++$holi_nr; # pořadí nedělí a svátků
++$seq; # pořadí všech záznamů v tabulce `day`
if ($sun_nr != $sun_n) {print
"\n\tCHYBA ($Datum): Liší se pořadí kalendářní neděle (sun_n=$sun_n) a neděle v databázi `day` (sun_nr=$sun_nr)!\n\t";
}
my $nr_str = $which eq 'sunday' ? "($sun_nr)" : "<$holi_nr>";
print " ${nr_str}Ft$f12='$which'" if $verbose>=2;
print "[$Ft_Feiertag]" if $verbose>=5;
$day_w->execute(0, $Datum, $dow, $seq, $which, $nr, 'de', $Ft_Feiertag, $meaning, $src);
}
if($Ft_Bibeltext){
print "+text" if $verbose>=3;
defaultquelle(\$Ft_Quelle);
$losung_w->execute(0, $Datum, $seq, $which, undef, 'de', $Ft_Quelle, $Ft_Stelle, undef, $Ft_Bibeltext);
}
if($Ft_Angaben) {
$Ft_Angaben =~ s/\r//g;
# $Ft_Angaben =~ s/x//g; # označení pro nic
# if ($Ft_Angaben eq " :: \n :: :: \n") {return;}
print "\nFt$f12:<<$Ft_Angaben>>\n" if $verbose >=12;
my @Ft_Angabe = split(/ :: /, $Ft_Angaben);
if (scalar(@Ft_Angabe)<5) { # VÝPIS data, kde ení 5 Angaben
print "$Datum: ";
foreach my $item(@Ft_Angabe) {
print "<$item>"
}
print "\n";
}
if ($verbose >=10) {print " =", scalar(@Ft_Angabe), 'Angaben';}
if ($verbose >=11) {print '[', join('|', @Ft_Angabe), ']';}
if (scalar(@Ft_Angabe)>5) { # VÝPIS CHYBY
print "\n!! ", scalar(@Ft_Angabe), " Angaben je více než 3 Angaben:\n";
for my $item (@Ft_Angabe) {
print "\t* [$item]\n";
}
die "!!die!!\n";
}
if (scalar(@Ft_Angabe)==5){ # V pořádku, první musí být Lied
my $Lied = shift @Ft_Angabe;
if($Lied =~ /: /){
my $whichlied = $`; $Lied = $';
if ($whichlied eq 'Wochenlied') {$whichlied = 'WL';}
elsif ($whichlied eq 'Lied') {$whichlied = 'Ld';}
else {die "whichlied = '$whichlied'??";}
if ($Ft_Feiertag eq 'ZUM ERNTEDANKFEST'){
$whichlied = 'Ld' ;
}
if ($Ft_Feiertag eq '2. WEIHNACHTSTAG'){
$whichlied = 'WL';
print "(2. svátek vánoční -> píseň jako WL kvůli duplicitě v databázi)" if $verbose;
}
print "+$whichlied" if $verbose>=6;
$song_w->execute(0, $Datum, $seq, $whichlied, 'de', $Lied, 0, 0, 0, '');
}
else {die "Lied: '$Lied' neobsahuje ': '!";}
}
my $Ev = shift @Ft_Angabe;
my $Ep = shift @Ft_Angabe;
my $DL = shift @Ft_Angabe;
foreach my $src($Ev, $Ep, $DL) {
$src = normalize($src);
}
my $whDL; # which DL = co je to za Dritte lesen?
if($DL =~ /Psalm/) { # je to žalm
if($f12==2) { # žalm na týden není jako druhý
$whDL = 'PF'; # je to žalm pro svátek: Psalm für Fest
} elsif ($sunday) { # takže je to první svátek, může být neděle:
$whDL = 'WP'; # v neděli je Wochenpsalm
} else { # poprvé ve svátek je to zase Psalm für Fest
$whDL = 'PF';
}
} else { # když to není Žalm,
$whDL = 'DL'; # tak je to 3. čtení
}
if($f12==1) { # poprvé
print "+Ev+Ep+$whDL" if $verbose>=6; # evangelium a epištola
$reading_w->execute(0, $Datum, $seq, 'Ev', 'de', $Ev);
$reading_w->execute(0, $Datum, $seq, 'Ep', 'de', $Ep);
} else { # jinak nějaké první a druhé čtení
print "+x1+x2+$whDL" if $verbose>=6; # x1 a x2
# $reading_w->execute(0, $Datum, $seq, 'x1', 'de', $Ev); # odstraňuje duplicity
# $reading_w->execute(0, $Datum, $seq, 'x2', 'de', $Ep); # před zavedením $seq
$reading_w->execute(0, $Datum, $seq, 'Ev', 'de', $Ev);
$reading_w->execute(0, $Datum, $seq, 'Ep', 'de', $Ep);
}
if ($f12==2 and ($Ft_Feiertag eq 'STEPHANUSTAG'
or $Ft_Feiertag eq 'BITTE UM FRIEDEN UND UM SCHUTZ DES LEBENS')){
print "(DL se obvykle opakuje, vypuštěno z databáze)" if $verbose;
} else {
$reading_w->execute(0, $Datum, $seq, $whDL, 'de', $DL);
}
#print "$Datum: $whDL = '$DL'\n";
my $Predigt = shift @Ft_Angabe;
$Predigt = normalize($Predigt);
# my $whPr = $f12==1 ? 'Pr' : 'Pr2'; # odstraňuje duplicity před zavedením $seq
my $whPr = 'Pr'; #
print "+$whPr" if $verbose>=6;
if ($f12==2 and $Ft_Feiertag eq 'STEPHANUSTAG'){
print "(Pr se obvykle opakuje, vypuštěno z databáze)" if $verbose;
} else {
print ("\nREADING_EXECUTE: ", join (' | ', 0, $Datum, $seq, $whPr, 'de', $Predigt), "\n") if $verbose>=13;
$reading_w->execute(0, $Datum, $seq, $whPr, 'de', $Predigt);
};
}
}