=head2 log_update

C<log_update( Tabelle [ID-Feld ID-Wert]... undef Feld... undef Wert... )>

Schreibt einen Loggingeintrag in das Update-Protokoll.

Die I<Wert>e, wenn angegeben, sind der alte Inhalt der C<Feld>er.
(Der neue Inhalt steht nach dem Update in der Datenbank.)

Das Feld C<*> gibt an, daß der Datensatz neu ist.

Das Feld C<-> gibt an, daß der Datensatz gelöscht wurde.

=head3 Anwendung

Beim Neu-Anlegen wird im übergeordneten Datensatz das Pseudo-Feld
I<Tabellenname> mit dem Wert I<ID> geloggt.

Beim Ändern wird der B<alte> Wert im Updatelog verzeichnet; der neue steht
nach der Änderung im Datensatz.

Beim Löschen wird als Lösch-Datensatz-ID I<Tabellenname> und I<ID> des
übergeordneten Datensatzes verwendet. Die ID des gelöschten Datensatzes
steht im Datenbereich, ebenso wie wichtige Werte aus dem Datensatz (falls
vorhanden). Dadurch können 1:N-Beziehungen auch nach dem Löschen
nachvollzogen werden.

Beispiele. Es verweise "domain.kunde" auf "kunde.id". "domain.name" ist das
eigentlich Interessante an diesem Datensatz.

Anlegen:

	log_update("domain","id",$domain, undef, "name","*", undef, $name);
	log_update("kunde","id",$kunde, undef, "domain","name","*", undef, $domain,$name);

Ändern:

	log_update("domain","id",$domain, undef, "wert", undef, $wert);

Löschen:

	log_update("domain","kunde",$kunde, undef, "id","name","wert","-", undef, $domain,$name,$wert);
	log_update("kunde","id",$kunde, undef, "domain","name","-", undef, $domain,$name);

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Dbase::Help qw(DoTrans DoFn Do qquote);
use Loader qw(current_user);
use Fehler qw(problem);

sub log_update($@) {
	my $table = shift;
	if(ref $table) {
		$table = ref $table; $table =~ s/^Db:://;
	}
	my $u_table = DoFn("select id from db_tabelle where name=${\qquote $table}");
	return problem "Tabelle '$table' nicht beschrieben"
		unless $u_table;

	my $pers = current_user() || 0;

	my($index,$wert,$feld,$dwert);

	while(@_ and defined $_[0] and $_[0] ne "") {
		$index .= shift(@_)."|";
		no warnings 'uninitialized';
		$wert .= shift(@_)."|";
	}
	shift;
	while(@_ and defined $_[0] and $_[0] ne "") {
		$feld .= shift(@_)."|";
	}
	shift;
	if(@_) {
		no warnings 'uninitialized';
		$dwert = qquote join("|",@_);
	} else {
		$dwert = "NULL";
	}

	chop $index; chop $wert; chop $feld;

	my $u_index = DoFn("select id from updatelog_spalten where namen=${\qquote $index}");
	$u_index = Do("insert into updatelog_spalten set namen=${\qquote $index}")
		unless $u_index;

	my $u_feld = DoFn("select id from updatelog_spalten where namen=${\qquote $feld}");
	$u_feld = Do("insert into updatelog_spalten set namen=${\qquote $feld}")
		unless $u_feld;

	Do("insert writeonce into updatelog set person=$pers, db_tabelle=$u_table, indexspalten=$u_index, wert=${\qquote $wert}, datenspalten=$u_feld, dwert=$dwert");
}
1;
