#!/usr/bin/perl
# gps-maintain.pl Database maintenance script for gps
# (C) Michael Moritz <mimo/at/restoel.net>
#
# 0.3 2004-09-14 included patch by Xin LI <delphij/at/msn.com>:
#                replaced hardcoded dbname 'greylist' with
#                value from config
# 0.2 2004-07-06 added age only functionality [mimo]

use Fcntl;
use DBI;
use Sys::Syslog qw(:DEFAULT setlogsock);
#
# Usage: gps-maintain.pl [-v]
#
sub usage {
	print "Usage: ".$0." [-v] [-delete] [-eq|-lt count] -age seconds configfile\n";
}

sub read_config {
	my $fn = shift;
	my $User_Preferences;
	open(CONFIG, $fn) or die "can't open $fn: $!";	
	while (<CONFIG>) {
	    chomp;                  # no newline
	    s/#.*//;                # no comments
	    s/^\s+//;               # no leading white
	    s/\s+$//;               # no trailing white
	    next unless length;     # anything left?
	    my ($var, $value) = split(/\s*=\s*/, $_, 2);
	    $User_Preferences->{$var} = $value;
	}
	close(CONFIG);
	return $User_Preferences;
} 
my $configfile = "";
my $equals = "";
my $lessthan = "";
my $age = 0;
my $delete = 0;
while ($option = shift(@ARGV)) {
	if ($option eq "-v") {
        	$verbose = 1;
	} else {
		if( $option eq "-eq") {
			$equals = shift(@ARGV);
		} else {
			if( $option eq "-lt" ) {
				$lessthan = shift(@ARGV);
			} else {
				if( $option eq "-age" ) {
					$age =  shift(@ARGV);
				} else {
					if( $option eq "-delete" ) {
						$delete = 1;
					} else {
						if( $configfile eq "" ) {
							$configfile = $option;
						} else {
	        					print STDERR "Invalid option: %s.",$option;
							&usage();
	        					exit 1;
						}
					}
				}
			}	
		}
    	}
}
if(($configfile eq "") 
   || ($age == 0) )  {
	&usage();
	exit 1;
}
# put together the sql params
my $uts = time() - $age;
my $count = "";
if( $lessthan ne "") {
	$count = "< $lessthan";
} else {
	if( $equals ne "") {
		$count = "= $equals";
	} else {
#		usage();
#		exit(-1);
		$count = "";
	}
}
my $sqlString = "";
if($count) {
	$sqlString = "WHERE uts < ".$uts." AND count ".$count;
} else {
	$sqlString = "WHERE uts < ".$uts;
}

if($verbose) {
	print STDOUT "will use: ".$sqlString."\n";
}

my $hash_ref = &read_config($configfile);
#print "the keys... ", sort keys %$hash_ref, "...\n";
if($verbose) {
    while ( my ($key, $value) = each(%$hash_ref) ) {
        print "$key => $value\n";
    }
}
my $dbh = DBI->connect('DBI:'.$hash_ref->{dbtype}.':'.$hash_ref->{db_dbname},
			$hash_ref->{db_username},
			$hash_ref->{db_password} )
                or die "Couldn't connect to database: " . DBI->errstr;

if($verbose) {
	print STDOUT "Connected to DB\n";
}
# begin

#last minute
if( $verbose ) { # if verbose we show the entries to be deleted
	print STDOUT "mysql: 'SELECT * FROM Triplets ".$sqlString."\n";
	my $sth = $dbh->prepare('SELECT * FROM Triplets '.$sqlString)
                or die "Couldn't prepare statement: " . $dbh->errstr;

	$sth->execute()             # Execute
            or die "Couldn't execute statement: " . $sth->errstr;
	my $count = 1;
	while (@data = $sth->fetchrow_array()) {
		print $count.': ';
		my $i = 0;
		while($i < 5) {
			print $data[$i].",  ";
			$i++;
		}
		$count++;
		print "\n";
	}
	$sth->finish;
}
if( $delete == 1 ) {
	my $arows = $dbh->do('DELETE FROM Triplets '.$sqlString)
                or die "Couldn't do statement: " . $dbh->errstr;
	print STDOUT 'Deleted '.$arows." rows \n";
}

# end
if($verbose) {
        print STDOUT "Disconnecting from DB\n";
}
$dbh->disconnect;


syntax highlighted by Code2HTML, v. 0.9.1