#!/usr/bin/perl $|=1; use DBI; use Switch; use FindBin qw($Bin); use POSIX qw/strftime/; use Time::Local; our $messaggi = 0; while( $_ = shift @ARGV ) { our $messaggi = 1 if /^\-v$/; $start = 1 if /^\-i$/; } my $tabella = "proxy_dati"; my $campo = "data_destroy"; open CONFFILE, "< $Bin/../core/config.php" or die ("Manca file di configurazione\n"); while () { if(/^\$db_data_server = "(\S+)"/ ) { our $db_host = $1; } if(/^\$db_data_name = "(\S+)"/ ) { our $db_name = $1; } if(/^\$db_data_user = "(\S+)"/ ) { our $db_user = $1; } if(/^\$db_data_pwd = "(\S+)"/ ) { our $db_pass = $1; } } close CONFFILE; my $dbmysql = DBI->connect("DBI:mysql:;host=$db_host", "$db_user", "$db_pass") or die ($DBI::errstr); $sts = $dbmysql->prepare("use $db_name"); $sts->execute (); if ($start) { inizializza($dbmysql, $tabella, $campo); exit; } aggiorna($dbmysql, $tabella, $campo); exit; sub inizializza { my $dbmysql = shift; my $tabella = shift; my $campo = shift; printf "Inizio attivita' %s\n",strftime('%d-%m-%Y %H:%M:%S',localtime) if ($messaggi); $part = "ALTER TABLE $tabella PARTITION BY RANGE ( unix_timestamp($campo) ) (\n"; $query = " SELECT DATE_FORMAT($campo, \"%Y%m%d\") AS giorno, unix_timestamp($campo) AS partenza FROM $tabella GROUP BY giorno ORDER BY giorno "; $sts = $dbmysql->prepare($query); $sts->execute (); while (my $dato = $sts->fetchrow_hashref) { my $giorno = $$dato{'giorno'}; my $partenza = $$dato{'partenza'}; $part .= "\tPARTITION p$giorno VALUES LESS THAN ( '$partenza' ),\n"; } $part .= "\tPARTITION p99999999 VALUES LESS THAN (MAXVALUE)\n"; $part .= ");\n"; print $part if ($messaggi); printf "Inizio partizionamento %s\n",strftime('%d-%m-%Y %H:%M:%S',localtime) if ($messaggi); $sts = $dbmysql->prepare($part); $sts->execute (); printf "Termine attivita' %s\n",strftime('%d-%m-%Y %H:%M:%S',localtime) if ($messaggi); } sub aggiorna { my $dbmysql = shift; my $tabella = shift; my $campo = shift; printf "Inizio attivita' %s\n",strftime('%d-%m-%Y %H:%M:%S',localtime) if ($messaggi); $query = "SHOW CREATE TABLE $tabella"; $sts = $dbmysql->prepare($query); $sts->execute (); my @row = $sts->fetchrow_array(); my @risp = split '\n', $row[1]; my $ultimo = ""; foreach $riga (@risp) { if ($riga =~ /^[\(\s]?PARTITION p(\d+) VALUES LESS THAN \(\'(\S+) (\S+)\'\) .*$/) { next if ($1 eq '19700101'); $ultimo = $2; my $diff = diffgg ($2); if ($diff > 365) { my $query = "ALTER TABLE $tabella DROP PARTITION p$1"; $sts = $dbmysql->prepare($query); $sts->execute (); } } } if (diffgg($ultimo) > -5) { my $prequery = "ALTER TABLE $tabella REORGANIZE PARTITION p99999999 INTO (\n"; my $postquery = "PARTITION p99999999 VALUES LESS THAN (MAXVALUE))\n"; my $inquery = ""; while (diffgg($ultimo) > -5) { $ultimo = addgg ($ultimo); my @tmp0 = split / /, $ultimo; my @tmp = split /-/, $tmp0[0]; my $p = $tmp[0].$tmp[1].$tmp[2]; $inquery .= "PARTITION p$p VALUES LESS THAN ('$ultimo'),\n"; } $query = "$prequery$inquery$postquery"; $sts = $dbmysql->prepare($query); $sts->execute (); } printf "Termine attivita' %s\n",strftime('%d-%m-%Y %H:%M:%S',localtime) if ($messaggi); } sub diffgg { my $data = shift; my @today = localtime(); my $time = timelocal(@today); my @part = split /-/, $data; my @tempo = (59, 59, 23, $part[2], $part[1]-1, $part[0]-1900); my $tempo = timelocal(@tempo); return int(($time - $tempo) / 86400); } sub addgg { my $data = shift; my @part = split /-/, $data; my @tempo = (59, 59, 23, $part[2], $part[1]-1, $part[0]-1900); my $tempo = timelocal(@tempo) + 86400; return strftime('%Y-%m-%d %H:%M:%S',localtime($tempo)) }