#!/usr/bin/perl

BEGIN {
	unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
		unless $ENV{'KUNDE_NO_PERLPATH'};
}

use utf8;
use strict;
use warnings;
use Umlaut qw(textmodus);

use Dbase::Help;
use Dbase::Globals;
use Getopt::Std;
our($opt_h,$opt_c,$opt_n,$opt_s,$opt_x,$opt_a,$opt_p);

getopts("c:a:ns:x:hp");

sub Usage () {
my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';
 textmodus(\*STDERR);
 die <<END;
 Usage: $0 < [ Tabelle...] DATEI

      Restauriert die mit dbdump als Text gespeicherten Tabellen.

 -c FOO ruft den Perl-Befehl FOO für jeden Datensatz auf (\@f: Felder: %fp:
    Flags-ob-Inhalt-vorhanden; %fn: Namen)
 -a bla=fasel,... setzt Feld bla immer auf fasel
 -n löscht die Datei NICHT
 -s Starte _nach_ der angegebenen Tabelle (ausser den Argumenten)
 -x Überspringe die angegebenen Tabellen (Kommas)
 -p Gibt die Tabellen lesbar auf stdout aus, nicht in die Datenbank

Version: $vers
END
	exit 1;
}

Usage if $opt_h;

my $pr_c;
if(defined $opt_c) {
	$pr_c = eval "sub { $opt_c }";
	die "$0 -c XX: $@" unless ref $pr_c;
}
my $dfi=0;
my @fname;
my @ftype;
my %fn;
my @df;
my @dfp;
if(defined $opt_a) {
	foreach my $ff(split(",",$opt_a)) {
		my($fname,$fd)=split("=",$ff,2);
		$fname[$dfi] = $fname;
		$ftype[$dfi] = "y";
		$fn{$fname} = $dfi;
		$df[$dfi]=$fd; $dfp[$dfi]=1;
		$dfi++;
	}
} else {
	@df = (); @dfp = ();
}
my $tabs = "";
$tabs = ",".join(",",@ARGV)."," if @ARGV;
$opt_x = ",$opt_x," if defined $opt_x and $opt_x ne "";
$tabs = "," if $tabs eq "" and defined $opt_s and $opt_s ne "";

dbl:
while(<STDIN>) {
	chop;
	my $dbname = $_;
	print STDERR "  $dbname .              \r";
	if(defined $opt_s and $opt_s ne "" and $dbname eq $opt_s) {
		$opt_s = "";
		if($tabs !~ /,$dbname,/) {
			$tabs = "";
			while(<STDIN>) {
				chop;
				next dbl if $_ eq "-=# END #=-";
			}
			last;
		} else {
			# $tabs = ""; ## ???
		}
	}
	if($tabs ne "" and $tabs !~ /,$dbname,/ or ( defined $opt_x and $opt_x =~ /,$dbname,/)) {
		while(<STDIN>) {
			chop;
			next dbl if $_ eq "-=# END #=-";
		}
		last;
	}
	DoN("lock exclusive table $dbname") unless $opt_p;
	print STDERR "  $dbname ..             \r";
	Do("begin") unless $opt_p;
	Do("delete from $dbname") unless $opt_n or $opt_p;

	my $nf=0;
	while(1) {
		my $fname = <STDIN>; chop $fname; last if $fname eq "-";
		my $ftype = <STDIN>; chop $ftype;
		$fname[$nf] = $fname;
		$ftype[$nf] = $ftype;
		$fn{$fname} = $nf;
		$nf++;
	}
	if($opt_p) {
		print "*** $dbname ***\n";
	} else {
		print STDERR "  $dbname $nf ..              \r";
	}

	my $j=0;
	loo: while(1) {
		my($str,$str1);
		#if(($j % 100) == 50) {
		#	Do("end");
		#	Do("begin");
		#}
		my $has=0;
		if($opt_p) {
			$str="";
		} else {
			$str1 = "insert into $dbname set";
		}
		print STDERR "  $dbname $nf $j ...              \r" if !($j%100);
		my @fp = @dfp; my @f = @df;
		foreach $j($dfi..$dfi+$nf-1) {
			my $what = <STDIN>; chop $what; if($what ne "-=# NULL #=-" and $fname[$j] !~ /^index_/i) {
				last loo if $what eq "-=# END #=-";
				$fp[$j] = 1; $f[$j] = $what;
			}
		}

		&$pr_c() if defined $opt_c;

		foreach my $j($dfi..$dfi+$nf-1) {
			if($fp[$j]) {
				my $what = $f[$j];
				if($j < $dfi) {
					# Nix
				} elsif($ftype[$j] eq "y") {
					$what =~ s/^\s+$//;
					$what = "'$what'";
				} elsif($ftype[$j] eq "n") {
					$what += 0;
				} else {
					next;
				}
				if($opt_p) {
					$str .= " " if $has;
					$str .= $fname[$j]."=".$what;
				} else {
					$str1 .= "," if $has;
					$str1 .= " `" . $fname[$j] . "`=" . $what;
				}
				$has = 1;
			}
		}
		if($opt_p) {
			print "$str\n";
		} else {
#			while(($f,$s)=each %pr_a) {
#				$str1 .= ",$f=$s";
#			}
			my $res = DoN($str1);
			print "$res\nQuery: $str1\n\n" if $res =~ /^-/;
		}
		$j++;
	}
	Do("end") unless $opt_p;
	Do("unlock tables") unless $opt_p;
	print STDERR "                           \r$dbname $nf $j\n";
}

