#!C:\camelbox\bin\perl.exe
package Principal;
use DBI; # Módulo requerido para conectar a la base de datos.
use ConectarDB; # Módulo requerido para conectar con la base de datos "abrir".
use ConectarDBrss; # Módulo requerido para conectar con la base de datos "rss".
use autodie; # Módulo requerido para finalizar programa en algunos casos.
use Data::Dumper; # Módulo para realizar algunas acciones.
use File::Slurp;
use Update;
sub nuevo {
my $self = shift;
&comprobarDB("abrir"); # Llamada a subrutina CompararDB. En este caso la base de datos "abrir".
my $conexionAB = ConectarDB->connect(); # Establecer conexión con la base de datos.
&comprobarDB("rss"); # Llamada a subrutina CompararDB. En este caso la base de datos "rss".
my $conexionRSS = ConectarDBrss->connect(); # Establecer conexión con la base de datos.
my @mis_tablas = &tablas($conexionAB); # Hacemos una llamada a la subrutina tablas() y guardamos el resultado en el array mis_tablas.
my ($url, $empresa, $cont); # Declaración de las variables.
for my $tabla (@mis_tablas) { # Bucle para recorrer cada una de las tablas y las vamos recogiendo en la variable tabla.
print "Tabla: ", $tabla, "\n";
$cont = $conexionAB->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 línea 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á.
$url = $ref->{'link'}; # Dejamos en la variable url el link.
print $url,"\n";
$empresa = $ref->{'nombreEmpresa'}; # Dejamos en la variable empresa el nombreEmpresa.
print $empresa,"\n";
&actualizar($empresa, $conexionRSS, $url); # Hacemos una llamada a la suburtina actualizar pasandole el nombreEmpresa, la conexión y el link.
&crearTabla($empresa, $conexionRSS); # Hacemos una llamada a la suburtina crearTabla pasándole el nombreEmpresa y la conexión.
my $pal= join(".",$empresa,"cache"); # Juntamos el nombreEmpresa con la palabra cache para poder leer el archivo generado, y dejamos el resultado en la variable pal.
# Leemos el archivo con el nombre de la variable pal y lo dejamos en la variable archivo.
my $copia_archivo = &comprobarArchivo($pal); # Con eval comprobamos que el archivo contiene algo y si es así se lo pasamos a copia_archivo.
my($link,$title,$description,$date); # Declaramos las variables.
if ($copia_archivo){ # Un if para comprobar que copia_archivo tiene algo y si es así...
for my $entrada (@{$copia_archivo}) { # ... hacemos un bucle recorriendo copia_archivo y vamos dejando cada parte en la variable entrada.
$link = $entrada->{Link}; # Dejamos en la variable link el Link.
print $entrada->{Link}, "\n";
$title = $entrada->{title}; # Dejamos en la variable title el título.
print $entrada->{title}, "\n";
$description = $entrada->{description}; # Dejamos en la variable description la descripción.
print $entrada->{description}, "\n";
$date = $entrada->{fecha};
print $entrada->{fecha}, "\n";
if (&comparar($conexionRSS,$empresa,$title)==0){
&insertar($link,$empresa,$conexionRSS,$title,$description,$date); # Hacemos una llamada a la subrutina insertar pasándole el link, el nombreEmpresa, la conexión, el título y la descripción.
}
}
}
}
$cont->finish(); # Finalizar el select.
}
$conexionAB->disconnect; # Finalizar conexión a la base de datos "abrir".
$conexionRSS->disconnect; # Finalizar conexión a la base de datos "rss".
}
# Subrutina actualizar.
sub actualizar{
print "Actualizar\n";
my ($empresa, $conexion, $url)= @_; # Recoge los datos pasados desde la llamada en estas variables.
my $titulo = "Fuente de noticias"; # Título.
my $descripcion = "Titulares de las actualizaciones"; # Descripción.
my $rss = Update->new($empresa,$url,$titulo,$descripcion); # Pasamos los parámetros requeridos al programa Update.pm
eval {$rss->update}; # Se actualiza con los parámetros que le hemos pasado.
}
# Subrutina insertar.
sub insertar {
printf("estoy en insert\n");
my ( $link, $tabla, $conexion, $titulo , $descripcion,$fech) = @_; # Recoge los datos pasados desde la llamada en estas variables.
printf ("$link\n");
print "\n";
print "\n";
my $sth = $conexion->prepare("INSERT INTO $tabla(link,titulo,descripcion,fecha) 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 función "die".
$sth->execute($link,$titulo,$descripcion,$fech) 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; # Finalizamos la operación.
}
# Subrutina comprobarDB.
sub comprobarDB {
my $db = $_[0]; # Recoge los datos pasados desde la llamada en estas variables.
my @databases = DBI->data_sources("mysql", {host => 'localhost', user => 'root', password => 'jarama'}); # 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("mysql"); # Carga del controlador mysql
my $rc = $drh->func("createdb", $base_datos, 'localhost', 'root', 'jarama', 'admin'); # Creamos la base de datos.
}
}
# Subrutina crearTabla.
sub crearTabla {
print "Estoy en crear tabla\n";
print "\n";
print "\n";
my ($tabla, $conexion) = @_; # Recoge los datos pasados desde la llamada en estas variables.
eval {$conexion->do("CREATE TABLE $tabla (link VARCHAR(500), titulo VARCHAR(600), descripcion VARCHAR(1000), fecha VARCHAR(100), comentario VARCHAR(1000))")}; #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 hacemos 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".
}
}
# Subrutina tablas.
sub tablas {
my ($conexion, $tabla); # Declaramos las variables a utilizar.
$conexion = $_[0]; # Recogemos la conexión en esta variable.
my $sth = $conexion->prepare("show tables")or die("Couldn't prepare statement: " . $conexion->errstr); # Cogemos los nombres de las tablas de la base de datos que le hemos pasado en la conexión.
$sth->execute() or die("Couldn't execute statement: " . $sth->errstr); # Ejecutamos la acción.
my @tables; # Declaración del array en el cual introduciremos cada uno de los nombres de las tablas que hemos seleccionado.
while (my $row = $sth->fetchrow_arrayref) { # Recorremos con un while() hasta que se acaben los datos que hemos recogido de la base de datos.
$tabla = join("\t", @$row); # En la variable tabla dejamos el nombre de cada una de las tablas recogidas.
push @tables ,$tabla; # Insertamos cada tabla en el array tables.
print ("$tabla\n");
}
return @tables; # Devolvemos el array con las tablas.
}
sub comparar{
my($conexion,$tabla,$title)=@_; #Variables que usaremos para recoger los parámetros de entrada desde la llamada a la subrutina.
print "Estoy en comparar y el titulo es: ",$title,"\n";
print "La tabla es: \n";
my $sth = $conexion->prepare("SELECT * FROM $tabla"); #desde la conexión a la base de datos cogemos la informacion seleccionada , mediante el SELECT ,de la base de datos.
$sth->execute(); # Ejecutamos lo que hemos preparado en la línea anterior.
my $encontrada= 0; # Usamos una variable para salir del bucle cuando encontremos lo que buscamos.
while (my $ref = $sth->fetchrow_hashref() and $encontrada==0) { # 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á.
if ( $title eq $ref->{'titulo'}){ #Comparamos la primera variable que le pasamos desde la llamada a la subrutina con el correo cogido desde la base de datos. Si son iguales quiere decir que el correo existe con lo cual ponemos la variable encontrado a "1" y salimos del bucle.
print $ref->{'titulo'},"\n";
print $title,"\n";
$encontrada = 1;
}
}
$sth->finish();
return $encontrada; # Devuelve el valor de encontrado.
}
sub comprobarArchivo {
my $tipo=$_[0];
print "El archivo se llama: ",$tipo,"\n";
my $fich;
if (-e $tipo){
my $archivo = read_file($tipo); # Leemos el archivo con el nombre de la variable pal y lo dejamos en la variable archivo.
$fich = eval $archivo;
}
return $fich;
}
1;