#!/usr/bin/perl

use RPM::Header;
use DBI;
require "config";

foreach (@srpm_root) {
	opendir (DIR,$_) || die "cant open $_\n";
	@list = sort grep {/\.rpm$/} readdir(DIR);
	closedir(DIR);
	@list = &deleteDup(\@list);
	foreach $rpm (@list) {
		$rpm = $_."/".$rpm;
	}
	push @flist, @list;
}

print "Begin to read ".($#flist+1)." srpms\n";

$dbh = DBI->connect($dsn,$dbUser,$dbPass) || die "cant connect to mysql\n";

$sth = $dbh->prepare("SELECT name, CONCAT(version,'-',release), age FROM srpm");
$sth->execute();
while (@row = $sth->fetchrow_array){
	$oldS{$row[0]} = [ $row[1],$row[2] ];
}

$sth = $dbh->prepare("SELECT mail FROM maintainers");
$sth->execute();
while (@row = $sth->fetchrow_array){
    $oldM{$row[0]} = 1;
}

foreach $rpm (@flist){ 
	tie %hdr, "RPM::Header", $rpm or die "$RPM::err";

	$sth = $dbh->prepare("SELECT id from groups WHERE rpmgroup=? LIMIT 1");
	$sth->execute($hdr{"GROUP"});
	$row = $sth->fetchrow_array;
	
	unless ($row) {
		print $hdr{"NAME"}." - invalid group: ".$hdr{"GROUP"}."\n";
		delete $oldS{$hdr{'NAME'}} if (exists $oldS{$hdr{'NAME'}});
		untie %hdr;
		next;
	}

	($mail) = ($hdr{"PACKAGER"} =~/<\s*([\w|\-]+)\s*[\@|at]/);
	$mail = lc($mail);
	unless (exists $oldM{$mail}) {
		$type = ($hdr{"PACKAGER"} =~ /packages/ ||
			$hdr{"PACKAGER"} =~ /security/ )?"team":"man";

		$sth = $dbh->prepare("INSERT maintainers VALUES(?,?,?)");
		$sth->execute($mail,$hdr{"PACKAGER"},$type);

		if ($type eq "man"){
			$sth = $dbh->prepare("INSERT members VALUES(?,?,?,?,?,?,?,?,?,?,?)");
			$sth->execute($mail,$hdr{"PACKAGER"},'','','','','','','','','');
		} else {
			$sth = $dbh->prepare("INSERT teams VALUES(?,?,?,?)");
			$sth->execute($mail,$hdr{"PACKAGER"},'','');
		}
	}
	$oldM{$mail} = undef;

	if (exists $oldS{$hdr{'NAME'}} &&
		${$oldS{$hdr{'NAME'}}}[0] eq $hdr{'VERSION'}."-".$hdr{'RELEASE'}) {
		delete $oldS{$hdr{'NAME'}};
		untie %hdr;
		next;
	} elsif (exists $oldS{$hdr{'NAME'}}) {
		$age = ${$oldS{$hdr{'NAME'}}}[1] + 1;
		delete $oldS{$hdr{'NAME'}};
	} else {
		$age = 1;
	}

	$sth = $dbh->prepare("REPLACE srpm VALUES(?,?,?,?,?,?,?,?,?,?,?,?)");
	$sth->execute(
		$hdr{'NAME'}, $hdr{'VERSION'},$hdr{'RELEASE'},$row,$mail,
		&makeDateTime($hdr{'BUILDTIME'}),$hdr{'ARCHIVESIZE'},$hdr{'SUMMARY'},
		$hdr{'DESCRIPTION'},$hdr{'URL'},$hdr{'COPYRIGHT'},$age
		);

	$sth = $dbh->do('DELETE FROM changelogs WHERE rpm="'.quotemeta($hdr{"NAME"}).'"');

	$i = 0;
	
	foreach ( @{$hdr{'CHANGELOGTIME'}} ) {
		$sth = $dbh->prepare("REPLACE changelogs VALUES(?,?,?,?,?,?)");
		($bMail) = (@{$hdr{'CHANGELOGNAME'}}[$i] =~ /<\s*([\w|\-]+)\s*[\@|at]/);
		($bVersion) = (@{$hdr{'CHANGELOGNAME'}}[$i] =~ /([\w\-\.]+)\s*$/);
		@vals = ( &makeDate(@{$hdr{'CHANGELOGTIME'}}[$i]), $bMail, $bVersion,
			@{$hdr{'CHANGELOGNAME'}}[$i], @{$hdr{'CHANGELOGTEXT'}}[$i] );
		$sth->execute($hdr{'NAME'},@vals);
		$i++;
	}

	untie %hdr;
}

foreach $srpm (sort keys %oldS) {
	if (${$oldS{$srpm}}[1] == 0) { next; }
	$sth = $dbh->do('UPDATE srpm SET age=0 WHERE name="'.quotemeta($srpm).'"');
	print "$srpm removed from Sisyphus\n";
}

foreach $mail (sort keys %oldM){
	unless (defined($oldM{$mail})) { next };
	$sth = $dbh->do('DELETE FROM members WHERE mail="'.$mail.'"');
	$sth = $dbh->do('DELETE FROM maintainers WHERE mail="'.$mail.'"');
	print "We loose maintainer $mail at altlinux.org\n";
}

if ($sth) {
	$sth->finish();
}

$dbh->disconnect();

sub makeDateTime {
	my $time = shift;
	my @time = localtime($time);
	$time[5]+=1900; $time[4]++;
		return "$time[5]-$time[4]-$time[3] $time[2]:$time[1]:$time[0]";
}

sub makeDate {
	my $time = shift;
	my @time = localtime($time);
	$time[5]+=1900; $time[4]++;
	return "$time[5]-$time[4]-$time[3]";
}
