#!c:/perl/bin
package main;
use warnings; # Módulos requeridos por el sistema.
use utf8; # Este programa está escrito en codificación utf8
use Encode qw'decode';
use base 'XML::RSS::FromHTML';
use DBI;
use ConectarDBRSS;
use autodie;
use Modern::Perl;
use ConectarDBabrir;
use Update;
sub comprobarDB {
my $db = $_[0];
my @databases = DBI->data_sources(
"mysql", { host => 'localhost', user => 'root', password => 'password' }
); # Cogemos la lista de bases de datos presentes en el sistema.
my $base_datos = $db; # Introducimos el nombre de la base de datos que queremos comprobar
# que está en la variable $base_datos.
my $dsn = "DBI:mysql:$base_datos"; # Conformamos el DSN de esa base de datos.
unless ( $dsn ~~ @databases ) { # Si el $dsn no está entre las @databases la creamos.
my $drh = DBI->install_driver( # Carga del controlador mysql
"mysql"
);
my $rc = $drh->func( # Creamos la base de datos.
"createdb", $base_datos, 'localhost', 'root', 'password', 'admin'
);
}
}
sub crearTabla {
my $conexion = $_[1]; # Desde la llamada a la subrutina le pasamos la conexión a la base de
# datos. Desde la llamada sería la segunda variable que le pasamos.
my $tabla = $_[0];
eval {
$conexion->do(
"CREATE TABLE $tabla (link VARCHAR(200), titulo VARCHAR(300), descripcion VARCHAR(500), codigo INTEGER)"
);
}; # Hacemos un eval, cuya función será dejar que la tabla se cree o no
# dependiendo de si existe, y desde la conexión a la base de datos
# crearemos la tabla, si no existe ya.
if ($@) {
printf("La tabla existe \n"); # Se captura el error si la tabla existe y
# nos dice que "La tabla existe".
}
}
sub insertar {
printf("estoy en insert");
my ( $conexion, $sth, $tabla, $link, $descripcion, $titulo ); # Variables que usaremos para recoger los
# parámetros de entrada desde la llamada a
# la subrutina.
$titulo = $_[3];
$descripcion = $_[4];
$conexion = $_[2]; # Desde la llamada a la subrutina le pasamos la conexión a la base de datos.
# Desde la llamada sería la cuarta variable que le pasamos.
$tabla = $_[1];
$link = $_[0];
printf("$link\n");
$sth = $conexion->prepare("INSERT INTO $tabla(link,titulo,descripcion) VALUES (?,?,?,?)")
or die( "Couldn't prepare statement: " . $conexion->errstr )
; # Desde la conexión a la base de datos insertamos en la tabla, cuyo nombre le
# pasamos desde la llamada a la subrutina en la posición tercera, la información
# que después le proporcionamos. Si no existe la tabla sale con la funcion "die".
$sth->execute( $link, $titulo, $descripcion )
or die( "Couldn't execute statement: " . $sth->errstr )
; # se procesa la orden ejecutar insertando los valores pasados en la llamada
# a la subrutina en las posiciones primera y segunda. Si no se puede insertar
# sale con la función "die".
$sth->finish;
}
&comprobarDB("abrir"); # Llamada a subrutina CompararDB.
my ( $conexion, $conexion2, $sth, $cont, $tabla ); # Declaración de las variables que utilizaremos a continuación.
$conexion = ConectarDBabrir->connect(); # Conectamos con la base de datos desde el paquete
# ConectarDB y lo dejamos en la variable $dbh.
$sth = $conexion->prepare("show tables") or die( "Couldn't prepare statement: " . $conexion->errstr );
$sth->execute() or die( "Couldn't execute statement: " . $sth->errstr );
my ( $no, $li, $ti, $de );
while ( my $row = $sth->fetchrow_arrayref ) {
$tabla = join( "\t", @$row );
print("$tabla\n");
$cont = $conexion->prepare("SELECT * FROM $tabla"); # desde la conexión a la
# base de datos cogemos la
# información seleccionada
# mediante el SELECT de la
# base de datos.
$cont->execute(); # Ejecutamos lo que hemos preparado en la linea anterior.
while ( my $ref = $cont->fetchrow_hashref() ) {
# Con este bucle mientras quede algún valor en $ref
# de los que seleccionamos de la base de datos y mientras
# la variable encontrado sea "0" seguirá el bucle. Cuando
# uno de los dos falle se saldrá.
$li = $ref->{'link'}; # Comparamos la primera variable que le pasamos
# desde la llamada a la subrutina con el link
# cogido desde la base de datos. Si son iguales
# quiere decir que el link existe con lo cual ponemos
# la variable encontrado a "1" y salimos del bucle.
$no = $ref->{'nombreEmpresa'};
$cont->finish();
$ti = "Fuente de noticias";
$de = "titulares de las actuaciones";
my $rss = Update->new( $no, $li, $ti, $de );
my $hasNewItem = $rss->update;
if ($hasNewItem) {
print "RSS se ha actualizado con nuevos elementos";
return 1;
}
else {
print $rss->updateStatus;
return undef;
}
&comprobarDB("Rss");
$conexion2 = ConectarDBRSS->connect(); # Conectamos con la base de datos
# desde el paquete ConectarDB y lo dejamos en la variable $dbh.
my ( $archivo, $copia_archivo, $link, $titulo, $descripcion );
$archivo = read_file("Marca.cache");
$copia_archivo = eval $archivo;
my $cont = 0;
&crearTabla( $tabla, $conexion2 );
while (<$archivo>) {
$link = $copia_archivo->[$cont]->{link};
print $copia_archivo->[$cont]->{link};
$titulo = $copia_archivo->[$cont]->{title};
print $copia_archivo->[$cont]->{title};
$descripcion = $copia_archivo->[$cont]->{description};
print $copia_archivo->[$cont]->{description};
&insertar( $link, $tabla, $conexion2, $titulo, $descripcion );
$cont = $cont + 1;
}
$conexion2->disconect;
}
}
$conexion->disconect;