#!/usr/bin/perl -w

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

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

use Dbase::Help;
use Dbase::Globals;
use Getopt::Std;
use vars qw($opt_x $opt_s $opt_n $opt_h $opt_p $opt_f $opt_F $opt_w);

getopts("lx:s:n:hpf:F:w"); # sequentialize: s: Feldname, n: Indexname

sub Usage() {
my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';
	textmodus(\*STDERR);
	die <<END;
 Usage: $0         > DATEI
                         (alle Tabellen)
        dbdump NAME... > DATEI
                         (nur diese Tabelle(n))

 spuckt den aktuellen Dateninhalt der Datenbank als Text aus,
 zwecks Archivierung und Restaurierung via dbrestore.

 -x NAME,NAME    überspringt die Tabelle(n)
 -p Ausgabe in menschenlesbarer Form
 -f PRÄFIX     hänge den Tabellennamen an PRÄFIX an und speichere
               in Einzeldateien
 -F Filter     jage durch Filterprogramm
 -w            verwende die write-DB
 -l            Tabellen sperren

 Optional: -s BLA generiert eine Sequenznummer für die (eine!) gesicherte
 Tabelle und schreibt sie unter dem mit -n angegebenen Namen (optional,
 ansonsten Name der Tabelle) in den Sequenzspeicher der Datenbank.

Version: $vers
END
}

Usage if $opt_h;
$opt_x = ",$opt_x," if defined $opt_x and $opt_x ne "";
my $verbose = -t STDERR;

Dbase::Help->import(':readonly') unless $opt_w;

my @bases = ();
if(@ARGV == 0) {
	DoSelect {
		my($what) = @_;
		push(@bases,$what);
	} "show tables";
} else {
	@bases = @ARGV;
}

select(STDERR); $|=1; select(STDOUT);
unless($opt_f) {
	open(OUT, $opt_F ? "| $opt_F" : ">&STDOUT");
}

Do("LOCK TABLES ".join(" READ, ",@bases)." READ");
foreach my $n(@bases) {
	$n = lc($n);
	next if defined $opt_x and $opt_x =~ /,$n,/i;
	print STDERR "  $n                 \r" if $verbose;
	if($opt_f) {
		if($opt_F) {
			open(OUT,"|-") or do {
				### child
				open(STDOUT,">$opt_f$n");
				exec($opt_F);
				die "No exec of '$opt_F': $!\n";
			};
		} else {
			open(OUT,">$opt_f".$n);
		}
	}
#	$res = DoT("select feldname,istext from tabellen where name = $i order by feldname");
#	unless(ref $res) {
#		$res =~ s/\n/ /g;
#		print STDERR "### $n: $res ###                 \n" if $verbose;
#		next;
#	}
#	print STDERR "  $n.                 \r" if !$j and $verbose;
#
	my $f = ""; my @f = (); my @t = (); my $j=0;

	print OUT "$n\n";
	print OUT "$opt_s\nn\n" if defined $opt_s and not $opt_p;
	
	DoSelect {
		my($field,$typ)=@_;
		$typ = (($typ =~ /(char|text)/) ? "y" : "n");
		push(@t,$typ);
		print OUT $field,"\n",$typ,"\n" unless $opt_p;

		$f .= "," if $f ne "";
		$f .= "`".$field."`";
		push(@f,$field);
	} "show fields from $n";
	print OUT "-\n" unless $opt_p;
	print STDERR "  $n..                \r" if !$j and $verbose;

	my $err = DoSelect {
		$j++;
		print STDERR "  $n ".(0+@f)." $j ...              \r" if !($j % 1000) and $verbose;
		print OUT $opt_p ? "$opt_s=$j " : "$j\n" if defined $opt_s;
		my $has = 0;
		foreach my $k(0..(@f-1)) {
			my($val) = shift @_;
			if($opt_p) {
				next unless defined $val;
				print OUT " " if $has;
				print OUT $f[$k],"=",(($t[$k] ne 'n') ? "'${\quote $val}'" : $val);
				$has++;
			} elsif (defined($val)) {
				print OUT (($t[$k] ne 'n' ? quote($val) : $val)."\n");
			} else {
				print OUT "-=# NULL #=-\n";
			}
		}
		print OUT "\n" if $has and $opt_p;
	} "select $f from $n";
	if($err !~ /^\d+$/) {
		if($err !~ /^OK$/i) {
			$err =~ s/\n/ /g;
			print STDERR "### $n: $err ###                 \n" if $verbose;
		}
	} else {
		$f = "($opt_s),$f" if defined $opt_s;
		print STDERR "                         \r$n\t: $f $err\n" if $verbose;
		$j += 10;
		if(defined $opt_s) {
			$opt_n = $n unless defined $opt_n;
			my $res = DoN("insert into nextid set id=$j, name='$opt_n'");
			print STDERR "$res\n" if $res ne "";
		}
	}

	if($opt_f) {
		close OUT;
	} else {
		print OUT "-=# END #=-\n";
	}
}
Do("UNLOCK TABLES");

print STDERR "done                                \n" if $verbose;

