#!/usr/bin/perl
# ============================================================================
# $Rev: 226 $ $URL: svn://localhost/PlayChess/trunk/cgi/pgn.cgi $
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# $Date: 2006-10-10 21:22:56 +0000 (Di, 10 Okt 2006) $
# $Author: Thomas $
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# PGN downloads
# ============================================================================
use lib "../cgi-bin";
use CGI::Carp qw(fatalsToBrowser);
use PCSession;
use Template;
use Util;
use CGI qw( :standard );
use MyDbi;
use PgnList;
use Time::Local;
local $cgi = CGI->new();
local $sobj = PCSession->new( $cgi );
# CGI parameters
$name = $cgi->param('name');
$action = $cgi->param('action');
$month = $cgi->param('month');
$league = $cgi->param('league');
local @Months;
local $debug = 0 || Util::isDebug;
local $MonthDir = $ENV{DOCUMENT_ROOT} . '/pgn/months';
if( $action =~ /download/ )
{
# check parameters
ShowPage( 'date_format' ) unless( $month =~ /2\d\d\d-\d\d/ );
$sobj->assertMember();
if( -e "$MonthDir/$month.pgn.gz" )
{
#Util::redirectPlain( "/pgn/months/$month.pgn.gz" );
# create PGN page
my $pgnobj = PgnList->new();
$pgnobj->FileDir( $ENV{DOCUMENT_ROOT} . '/pgn/months' );
$pgnobj->FileName( $month . '.pgn' );
$pgnobj->isEmpty( 0==1 );
my $tpl = $pgnobj->getPgnPage();
print $tpl->Expand( $sobj );
}
else
{
# extract month and year, calculate from and until
my( $y, $m ) = split( /-/, $month );
my $minY = $y;
my $minM = $m-1;
my $maxY = ($m < 12) ? $y : $y+1;
my $maxM = ($m < 12) ? $m : 1;
my $minTime = timegm( 0, 0, 0, 1, $minM, $minY-1900 );
my $maxTime = timegm( 0, 0, 0, 1, $maxM, $maxY-1900 );
print "y=$y m=$m minY=$minY minM=$minM minTime=$minTime maxTime=$maxTime
\n" if( $debug );
# Connect to database
#--------------------
$dbh = MyDbi::dbiConnect() or die( "DB-Handle is undefined" );
# finished games of that month
my $leagueCond = ($league) ? "and g.name like '$league%'" : '';
$stmt = "
select g.name
from tbl_game g
where 1
and g.valid=1
and g.result<>''
$leagueCond
and g.lastmove > $minTime
and g.lastmove < $maxTime
order by g.lastmove
limit 5000
";
my $gamelistRef = MyDbi::getColumn( $stmt );
$nGames = $#{$gamelistRef} + 1;
# error: too many games
# ShowPage( 'too_many' ) if( $nGames > $maxGames );
# debug
print "list = $gamelistRef nGames=$nGames
\n" if( $debug );
# create PGN page
my $pgnobj = PgnList->new( $gamelistRef, undef );
$pgnobj->FileDir( $ENV{DOCUMENT_ROOT} . '/pgn/months' );
$pgnobj->FileName( $month . '.pgn' );
$pgnobj->createPgn();
my $tpl = $pgnobj->getPgnPage();
# database is no longer needed
$dbh->disconnect();
# $tobj->addMakros( $tpl );
print $tpl->Expand( $sobj );
}
exit(0);
}
else
{
my( $sn, $Mn, $hn, $dn, $mn, $yn ) = gmtime( time() );
my( $y, $m );
my $yMin = 100; # year 2000
my $mMin = 4; # month May
for( $y=$yn; $y >= $yMin; $y-- )
{
for( $m=11; $m >= 0; $m-- )
{
next if( $y==$yn && $m >= $mn );
last if( $y==$yMin && $m < $mMin );
# print "y=$y m=$m yn=$yn mn=$mn
\n";
my $month = sprintf( "%d-%02d", $y+1900, $m+1 );
push @Months, $month;
}
}
ShowPage( '' );
}
#------------------------------------
sub ShowPage
#------------------------------------
{
my( $errstr ) = @_;
my $file = "pgn-collection.tpl";
my $tpl = Template->new( $file );
# read directory of pgn files
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~
my $pgndir = $MonthDir;
opendir( PGNDIR, $pgndir ) or die( "Cannot open PGN directory: $!" );
my @pgnfiles = sort {$b cmp $a} grep{ /2\d\d\d-\d\d\.pgn\.gz/ } readdir(PGNDIR);
closedir(PGNDIR);
my( $f, $fn );
foreach $fn (0..$#pgnfiles)
{
$f = $pgnfiles[$fn];
$n = $f;
$n =~ s/\.pgn\.gz$//;
my ($size, $mtime) = (stat( "$pgndir/$f" ))[7,9];
push @zipped, join( '|', $n, $f, int($size/1024 + 0.7), Util::getDate($mtime, 'ISO') );
# Debug output
# ~~~~~~~~~~~~
# printf( "\%2d %s (%d) %s
\n", $fn, $f, $size, Util::getDate($mtime, 'yyyy/mm/dd') );
}
$tpl->addMakro( "NAME", $name );
$tpl->addMakro( "action", $action );
$tpl->addMakro( "month", $month );
$tpl->addMakro( "nGames", $nGames );
#$tpl->addMakro( "maxGames", $maxGames );
$tpl->addMakro( "ERR", $errstr );
$tpl->addMakro( "noPobj", 1 );
$tpl->addMakro( $errstr, 1 );
$tpl->addArray( 'Months', \@Months );
$tpl->addArray( 'ZipFiles', \@zipped );
my $txt = $tpl->Expand($sobj);
print $txt;
exit(0);
}