=head2 log_view( [ Tabelle [ Indexspalte Wert ]... ] )

Zeigt für die angegebene Tabelle (und die gegebenen Spalten) das
Änderungsprotokoll an.

Achtung: findet nur Einträge, die von einem identisch anfangenden
log_update()-Statement eingetragen wurden.

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;

use Fehler qw(problem);
use Dbase::Globals qw(kkpersinfo);
use Dbase::Help qw(DoFn DoSelect qquote isotime);
use Loader qw(line_printer);

sub _log_view_str(\@\@) {
	my($fa,$fb)=@_;

	my $res = "";
	while(@$fa or @$fb) {
		if($res ne "") {
			if(@$fa and @$fb) {
				$res .= ", ";
			} else {
				$res .= ",";
			}
		}
		if(@$fa) {
			$res .= (shift @$fa);
			$res .= "=" if @$fb;
		}
		$res .= shift @$fb if @$fb;
	}
	$res;
}

sub log_view(;$@) {
	my($kn,@args) = @_;
	my $sel = "";

	if(@args) {
		my $tab = shift @args;
		my $st = DoFn("select id from db_tabelle where name=${\qquote $tab}");
		return problem "Keine Einträge für '$tab'" unless $st;
		$sel = "where db_tabelle=$st";

		if(@args) {
			my($index,$wert);
			while(@args) {
				$index .= (shift @args)."|";
				$wert .= (shift @args)."|" if @args;
			}
			chop $index;
			my $u_index = DoFn("select id from updatelog_spalten where namen=${\qquote $index}");
			return problem "keine Einträge für die Spalten '$index'"
				unless $u_index;

			$sel .= " and indexspalten=$u_index";

			if(defined $wert) {
				chop $wert;
				$sel .= " and wert=${\qquote $wert}";
			}
		}
	}

	line_printer(1);

	print $Db::pr_fh <<END;
Tabelle     von        Datum               Index
                       Altdaten
END
	my $res = DoSelect {
		my($pers,$dat,$tab,$ind,$wer,$feld,$dwert) = @_;
		# Spezialbedeutungen:
		if($feld eq "*") {
			$feld = "(neu)";
		} elsif($feld eq "-") {
			$feld = "(gelöscht)";
		} elsif($feld eq "--") {
			$feld = "(Abfrage)";
		} elsif($feld eq "?") {
			$feld = "(größere Aktion)";
		}

		my @ind = split(/\|/,$ind);
		my @wer = split(/\|/,$wer);
		$ind=_log_view_str(@ind,@wer);

		@ind = split(/\|/,$feld);
		@wer = defined $dwert ? split(/\|/,$dwert) : ();
		$feld=_log_view_str(@ind,@wer);

		$dat = isotime($dat); $dat =~ s/\s+\+\d{4}//;
		goto out unless
		printf $Db::pr_fh "%-11s %-10s %-19s %s\n                       %s\n",$tab,kkpersinfo($pers),$dat,$ind,$feld;
	} <<_;
		select readonly
			updatelog.person,
			updatelog.timestamp,
			db_tabelle.name,
			isp.namen,
			updatelog.wert,
			dsp.namen,
			updatelog.dwert
		from updatelog
		join db_tabelle on updatelog.db_tabelle=db_tabelle.id
		left join updatelog_spalten isp on updatelog.indexspalten=isp.id
		left join updatelog_spalten dsp on updatelog.datenspalten=dsp.id
		$sel
		order by updatelog.timestamp desc
_

out:
	$res;
}

1;
