package bd;
# 

use strict;

use vars qw(@ISA @EXPORT $VERSION);
use vars qw($bdSilenci);
use vars qw($altres);
use Exporter;
use XBase;

$VERSION = 1.00;
@ISA = qw(Exporter);

######################## variables publiques

@EXPORT = qw($bdSilenci);
push (@EXPORT, qw($altres));

######################## procediments

push (@EXPORT, qw(preparaFitxerDbf creaFitxerDbf declaraCamp));
push (@EXPORT, qw(copyStru dispStru intercalaRegistre ordenaDbf1camp));

######################## variables privades

my (@llistaCamps,@tipusCamps,@midaCamps,@midaDecis,$nomDbf);


######################## 

$bdSilenci=0;

sub declaraCamp {
push (@llistaCamps,$_[0]);
push (@tipusCamps,'C');
push (@midaCamps,$_[1]);
push (@midaDecis,undef);
}

sub preparaFitxerDbf {
$nomDbf=$_[0];
@llistaCamps=();
@tipusCamps=();
@midaCamps=();
@midaDecis=();
}

sub dispStru {
my $vdbf=$_[0];
my $tipus=$_[1];
my @noms = $vdbf->field_names();
my @mides = $vdbf->field_lengths();
my ($m1,$m2);
my $retorn = '';
if ($tipus ==1) {#html
#	$retorn = '<table><tr><td>'.join('</td><td>',@noms).'</td></tr>';
#	$retorn .= '<tr><td>'.join('</td><td>',@mides).'</td></tr></table>';
	$retorn = '<table>';
	while (@noms) {
		$m1=shift(@noms);
		$m2=shift(@mides);
		$retorn .= "<tr><td>$m1</td><td>$m2</td></tr>";		
		}
	$retorn .= '</table>';
	}
elsif ($tipus ==2) {# cru
	$retorn = join("\t",@noms);
	$retorn .= "\n".join("\t",@mides);
	}
return $retorn; 
}

sub creaFitxerDbf {
print STDERR 'Creem... '.$nomDbf unless $bdSilenci;
my $dbf = XBase->create("name" => "$nomDbf",
"field_names"    => [@llistaCamps],
"field_types"    => [@tipusCamps],
"field_lengths"  => [@midaCamps],
"field_decimals" => [@midaDecis]);
print STDERR " Fet!\n" unless $bdSilenci;
}

sub copyStru {
my $nom = $_[0];
my $traj = $_[1];
$nom =~ s/\.dbf$//gi;
my $dbf  = new XBase $traj.$nom.".DBF" or die XBase->errstr;
my @noms = $dbf->field_names();
my @mides = $dbf->field_lengths();
print '#' x 60,"\n";
print "\# inici declaracions generades des de ",$nom," #\n";
print "\# situat al directori ",$traj," #\n";
print "\# generat amb copyStru del package bd      #\n";
print '#' x 60,"\n";
print '#',"\n";
print "sub crea$_[0] {\n";
print "preparaFitxerDbf('$nom');\n";
my ($j);
for ($j=0;$j<scalar(@noms);$j++) {
	print "declaraCamp('$noms[$j]',$mides[$j]);\n";
	}
print "creaFitxerDbf;\n}\n";
print "\# fi declaracions generades des de $nom\n\n";
$dbf->close;
}

sub intercalaRegistre {
my $dbfLocal = shift;
my $punt = shift;
my (@tot,$deleted,$j,$max);
$max = $dbfLocal -> last_record;
return 0 if $punt >= $max;
$dbfLocal -> set_record($max+1,'z');
for ($j = $max; $j>=$punt;$j--) {
	($deleted,@tot) = $dbfLocal -> get_record($j);
	$dbfLocal -> set_record($j+1,@tot);
	}
}

sub permutaRegistres {
my ($refDBF,$r1,$r2)=@_;
my (@reg1,@reg2,$deleted);
# llegim
($deleted,@reg1)=$$refDBF->get_record($r1);
($deleted,@reg2)=$$refDBF->get_record($r2);
# escrivim a l'inreves
$$refDBF->set_record($r1,@reg2);
$$refDBF->set_record($r2,@reg1);
}

sub ordenaDbf1camp {
my ($nom,$traj,$dbf,$j,%llegit,@indexat,$deleted,$m,$n,$camp,$x1,$x2);
$nom = $_[0];
$traj = $_[1];
$camp = $_[2];
$nom =~ s/\.dbf$//gi;
$dbf  = new XBase $traj.$nom.".DBF" or die XBase->errstr;
################ pendent de protegir contra excessos (vg DICCIOF)
for ($j=0;$j<=$dbf->last_record;$j++) {
	($deleted,$m)=$dbf->get_record($j,$camp); # més d'un camp?
	$llegit{$m}=$j;
	}
@indexat=sort keys %llegit; # incidirem en formes d'ordenar
$x2=0;
foreach $m (@indexat) {
	$x1 = $llegit{$m}; # on era
	($deleted,$n)=$dbf->get_record($x2,$camp); #
	permutaRegistres(\$dbf,$x1,$x2);
	$llegit{$n}=$x1;
	$x2++;
	}
$dbf->close();
}
#ordenar per un camp (per un grup de camps)
#es llegeix el camp en un hash
## c a f d e 1 2 3 4 5 
#$llegit{'c'} = 1;
## a c d e f 2 1 4 5 3 
#permuto a i c ergo 2 i 1 en el fitxer i en el hash (el número)
#excepte si el número és exactament el lloc que ocupa


########################

# accions d'inicialització

########################

1;                            # final del modul
