#!/usr/bin/perl -Tw
#
# LMS version 1.3-cvs
#
#  (C) 2001-2004 LMS Developers
#
#  Please, see the doc/AUTHORS for more information about authors!
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License Version 2 as
#  published by the Free Software Foundation.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
#  USA.
#

use strict;
use DBI;
use Config::IniFiles;
use Getopt::Long;
use vars qw($configfile $quiet $help $version);
use POSIX qw(strftime);

my $_version = '1.1-cvs';

my %options = (
     "--config-file|C=s"=>     \$configfile,
     "--quiet|q"        =>     \$quiet,
     "--help|h"         =>     \$help,
     "--version|v"      =>     \$version,
);

Getopt::Long::config("no_ignore_case");
GetOptions(%options);

if($help)
{
     print STDERR <<EOF;
lms-updatewarnings, version $_version
(C) 2001-2004 LMS Developers

-C, --config-file=/etc/lms/lms.ini     alternate config file (default: /etc/lms/lms.ini);
-h, --help               print this help and exit;
-v, --version            print version info and exit;
-q, --quiet              suppress any output, except errors;

EOF
     exit 0;
}

if($version)
{
    print STDERR <<EOF;
lms-updatewarnings, version $_version
(C) 2001-2004 LMS Developers

EOF
     exit 0;
}

if(!$configfile)
{
    $configfile = "/etc/lms/lms.ini";
}

if(!$quiet)
{
    print STDOUT "lms-updatewarnings, version $_version\n";
    print STDOUT "(C) 2001-2004 LMS Developers\n";
    print STDOUT "Using file $configfile as config.\n";
}

if(! -r $configfile)
{
    print STDERR "Fatal error: Unable to read configuration file $configfile, exiting.\n";
    exit 1;
}

my $ini = new Config::IniFiles -file => $configfile;

my $dbtype = $ini->val('database', 'type') || 'mysql';
my $dbhost = $ini->val('database', 'host') || 'localhost';
my $dbuser = $ini->val('database', 'user') || 'root';
my $dbpasswd = $ini->val('database', 'password') || '';
my $dbname = $ini->val('database', 'database') || 'lms';

my $limit = $ini->val('warnings', 'limit') || 0;

my $dbase;
my $utsfmt;

if($dbtype eq "mysql")
{
    $dbase = DBI->connect("DBI:mysql:database=$dbname;host=$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 });
    $utsfmt = "UNIX_TIMESTAMP()";
}
elsif($dbtype eq "postgres")
{
    $dbase = DBI->connect("DBI:Pg:dbname=$dbname;host=$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 });
    $utsfmt = "EXTRACT(EPOCH FROM CURRENT_TIMESTAMP(0))";
}
elsif($dbtype eq "sqlite")
{
	$dbase = DBI->connect("DBI:SQLite:dbname=$dbname;host=$dbhost","$dbuser","$dbpasswd", { RaiseError => 1 });
	$utsfmt = "strftime('%s','now')";	
}
else
{
    print STDERR "Fatal error: unsupported database type: $dbtype, exiting.\n";
    exit 1;
}

my $dbq = $dbase->prepare("SELECT id, lastname, name, email, phone1 FROM users");
$dbq->execute();
while (my $row = $dbq->fetchrow_hashref())
{
    my $balance = 0;
    my $sdbq = $dbase->prepare("SELECT SUM(value) AS sum FROM cash WHERE userid='$row->{'id'}' AND type='3'");
    $sdbq->execute();
    if(my $srow = $sdbq->fetchrow_hashref())
    {
	    $balance = $balance + (defined $srow->{'sum'} ? $srow->{'sum'} : 0);
    }
    
    $sdbq = $dbase->prepare("SELECT SUM(value) AS sum FROM cash WHERE userid='$row->{'id'}' AND type='4'");
    $sdbq->execute();
    if(my $srow = $sdbq->fetchrow_hashref())
    {
	    $balance = $balance - (defined $srow->{'sum'} ? $srow->{'sum'} : 0);
    }
    
    if($balance < $limit)
    {
	    $sdbq = $dbase->prepare("UPDATE nodes SET warning=1 WHERE ownerid='$row->{'id'}'");
            $sdbq->execute();
    }
}

$dbq = $dbase->prepare("DELETE FROM timestamps WHERE tablename = 'nodes' OR tablename = '_global'");
$dbq->execute();
$dbq = $dbase->prepare("INSERT INTO timestamps (tablename,time) VALUES ('nodes',$utsfmt)");
$dbq->execute();
$dbq = $dbase->prepare("INSERT INTO timestamps (tablename,time) VALUES ('_global',$utsfmt)");
$dbq->execute();
$dbase->disconnect();
