#!/usr/bin/perl -w

use strict;
use DBI;
use File::Find;

my $dbh;
my $sth_insert_file;
my $sth_insert_link;
my $sth_test;

my $pkgkey=$ENV{'REPOCOP_PKG_KEY'};
my $pkgname=$ENV{'REPOCOP_PKG_NAME'};

my $jar_bin='/usr/bin/jar';
$jar_bin='/usr/bin/fastjar' if -e '/usr/bin/fastjar';

my $db_tested=0;

#/usr/lib/jvm
#/usr/lib/jvm-commmon
#/usr/lib/jvm-exports
#/usr/lib/jvm-private
#/usr/share/jvm
#/usr/share/jvm-commmon

my @dirs_to_search=grep { -d $_} map {$ENV{'REPOCOP_PKG_ROOT'}.$_} qw!
/usr/lib/java
/usr/lib/java-ext
/usr/lib64/java
/usr/lib64/java-ext
/usr/share/java
/usr/share/java-ext
!;
exit 0 unless @dirs_to_search>0;

find(\&wanted, @dirs_to_search);
sub wanted {
    return unless /\.jar$/;
    my $filename=$File::Find::name;
    $filename=~s/^$ENV{'REPOCOP_PKG_ROOT'}//;
    #print $filename,":\n";
    unless ($db_tested) {
	&connect();
	$sth_test->execute($pkgkey);
	my @row = $sth_test->fetchrow_array;
	if (@row>0) {
	    # remove pkgid from db;
	    $dbh->do("DELETE FROM JAR WHERE pkgid='$pkgkey'");
	    $dbh->do("DELETE FROM JAR_SYMLINKS WHERE pkgid='$pkgkey'");
	}
	$db_tested=1;
    }
    if (-l $_) {
	$sth_insert_link->execute($pkgkey,$filename, readlink $_);
    } else {
	open my $fh, "$jar_bin tf $_ |" or die $!;
	my @content = <$fh>;
	close $fh;
	foreach (@content){
	    next if m!^META-INF!;
	    chomp;
	    $sth_insert_file->execute($pkgkey,$filename,$_);
	}
    }
};


&disconnect();

sub connect {
    my $dbfile=$ENV{'REPOCOP_TEST_DB'};
    die "database is not initialized properly!" unless $dbfile;
    $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","", {
	PrintError => 1,
	AutoCommit => 0,
			}) or die $dbh->errstr;
    $sth_test=$dbh->prepare('SELECT PKGID FROM JAR WHERE PKGID=? LIMIT 1') or die $dbh->errstr;
    $sth_insert_link=$dbh->prepare('INSERT INTO JAR_SYMLINKS VALUES(?,?,?)') or die $dbh->errstr;
    $sth_insert_file=$dbh->prepare('INSERT INTO JAR VALUES(?,?,?)') or die $dbh->errstr;
}

sub disconnect {
    return unless $dbh;
    $dbh->commit;
    $sth_insert_link->finish;
    $sth_insert_file->finish;
    # hack around closing dbh with active statement handles bug
    local $SIG{'__WARN__'} = sub {};
    $dbh->disconnect;
}

