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

Z Wikiverzity
Skočit na navigaci Skočit na vyhledávání

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.1	Hesla 2016

#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	= 3;	# 2 = neděle, 3= všechny dny, 4 = názvy nedělí, 5=názvý svátků,
                        # 6=angaben, 7=comments, 8=DT, 9=původní Angaben

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 $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 [$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_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 >=9;
        my @Ft_Angabe = split(/\n/, $Ft_Angaben);
        #if (scalar(@Ft_Angabe)<3){
          #{print "$Datum: "; foreach my $item(@Ft_Angabe){print "<$item>"}; print "\n";}
	if ($verbose >=10) {print " =", scalar(@Ft_Angabe), 'Angaben';}
        if (scalar(@Ft_Angabe)>3) {
	    print "\n!! ", scalar(@Ft_Angabe), " Angaben je více jak 3 Angaben:\n";
	    for my $item (@Ft_Angabe) {print "\t* [$item]\n";}
	    die "!!die!!\n";
	}
        if (scalar(@Ft_Angabe)==3){
            my $Lieder = shift @Ft_Angabe;
	    my ($Lied, $Lied2) = split (/ :: /, $Lieder);
	    if($Lied) {
		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 ': '!";}
		if ($Lied2) {print "!!! Lied2 = $lied2\n";}
	    }
        }
        my $readings = shift @Ft_Angabe;
        if($readings =~ /(.*) :: (.*) :: (.*)/) {
            my($Ev, $Ep, $DL) = ($1, $2, $3);
            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";
        }
        else {die "$Datum, Ft$f12: readings: '$readings' nemá tvar  '* :: * :: *'!";}
        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 {
	    $reading_w->execute(0, $Datum, $seq, $whPr, 'de', $Predigt);
	};
    }
}