Projekt: Hesla Jednoty bratrské/2017/hes-sql-load.pl

Z Wikiverzity

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);
	};
    }
}