• Publicidad

Perl, Oracle y Net::FTP

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Perl, Oracle y Net::FTP

Notapor Arielinux » 2008-02-06 13:35 @607

Buenas, este es mi primer post, y ya tengo una consulta medio estrambótica :P Estoy haciendo un script para bajar archivos de distintos FTP que utiliza una tabla de la DB Oracle como parámetros. Funciona todo perfecto y sin problemas; lo que no sé cómo hacer es guardar en otra tabla los mensajes de respuesta que el Net::FTP me devuelve si es que ocurre algún problema. Acá les paso el script por si a alguien le interesa y de paso me da una mano.

Un abrazo desde py.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
#************************************************************************
#       Sistema de Toma de Archivos ftp con parametrizaciones           #
#                       de bases de Datos Oracle                        #
#       Requerimientos: DBI y DBD::Oracle                               #
#       Desarrollado por Ariel E. Pedrozo - [email protected]     #
#************************************************************************
use strict;
use Net::FTP;
use DBI;

my $user="scott";
my $password='tiger';
my $host = '10.1.1.66';
my $port= 1521;
my $sid='develop';
my $dbh;
my $sth;
my $sth2;
my $ftp;

my $driver="dbi:Oracle:host=$host;sid=$sid;port=$port";

unless ($dbh= DBI -> connect($driver, $user, $password)) {
        print "\n No se pudo contactar con la DB \n";  
        }else{
        print "CONECTADO\n";
    }  

$sth = $dbh->prepare("SELECT * FROM FTP");
$sth->execute;

my $arc;
my $dir;
my $hos;
my $usr;
my $pass;

while(($arc,$dir,$hos,$usr,$pass)=$sth->fetchrow_array){
   
#     print "$arc $dir $hos $usr $pass";
     $arc=~s/\s*$//;
     $dir=~s/\s*$//;
     $hos=~s/\s*$//;
     $usr=~s/\s*$//;
     $pass=~s/\s*$//;

         &ftpcito($arc,$dir,$hos,$usr,$pass);
         $sth2 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('$ftp->message','$arc',NULL)");
         $sth2->execute;
    #$dbh->commit;
}

sub ftpcito{
        $ftp=Net::FTP->new($_[2], Debug => 0) or die "No puedo conectarme al Servidor $@";
        $ftp->login($_[3],$_[4]) or die "No puedo Loguearme ", $ftp->message;
        $ftp->cwd($_[1]) or die "No puedo cambiar de Directorio ", $ftp->message;      
        $ftp->get($_[0]) or die "Toma de Archivos Fallida ", $ftp->message;
        $ftp->quit;            
        return $ftp->message;
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Arielinux
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-02-06 13:27 @602

Publicidad

Notapor Arielinux » 2008-02-06 13:38 @609

Ahí donde está el insert es donde me trabé... Quiero insertar el mensaje que me devuelve el $ftp->messages. Ahí actualmente inserta cualquier cosa en el mensaje y lo único que inserta bien es el nombre del archivo :D
Arielinux
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-02-06 13:27 @602

Notapor explorer » 2008-02-06 14:27 @644

Bienvenida a los Foros de Perl en Español, Arielinux.

Actualmente, lo que tienes hecho es que si ocurre un fallo, el programa se muera inmediatamente (die()), sacando el mensaje del fallo con $ftp->message. Pero si no hay fallos, $ftp->message no suele contener muchos mensajes.

Al final de la subrutina ftpcito(), llamas de nuevo a $ftp->message, para que ese valor sea devuelto, PERO no lo recoges en ningún sitio.

Prueba a hacer lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $resultado = &ftpcito($arc,$dir,$hos,$usr,$pass);
$sth2 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('$resultado','$arc',NULL)");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Arielinux » 2008-02-06 15:08 @672

Ya lo solucioné pero de otra manera :) Metiendo todos los insert dentro de la función y en vez del die, que directamente ejecuten el insert ahora quedo así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
#************************************************************************
#       Sistema de Toma de Archivos ftp con parametrizaciones           #
#                       de bases de Datos Oracle                        #
#       Requerimientos: DBI y DBD::Oracle                               #
#       Desarrollado por Ariel E. Pedrozo - [email protected]     #
#************************************************************************
use strict;
use Net::FTP;
use DBI;

#Variables de Conexion
my $user="scott";
my $password='tiger';
my $host = '10.1.1.66';
my $port= 1521;
my $sid='develop';

#Variables a Utilizar
my $dbh;
my $sth;
my $sth2;
my $sth3;
my $sth4;
my $sth5;
my $ftp;
my $arc;
my $dir;
my $hos;
my $usr;
my $pass;

#Conexion a la Base de Datos
my $driver="dbi:Oracle:host=$host;sid=$sid;port=$port";
unless ($dbh= DBI -> connect($driver, $user, $password)) {
        print "\n No se pudo contactar con la DB \n";  
        }else{
        print "CONECTADO\n";
    }  

#Sql de Parametros
$sth = $dbh->prepare("SELECT * FROM FTP");
$sth->execute;

#Seteo de Parametros a Variables
while(($arc,$dir,$hos,$usr,$pass)=$sth->fetchrow_array){

     #Eliminamos los espacios en blanco al final
     $arc=~s/\s*$//;
     $dir=~s/\s*$//;
     $hos=~s/\s*$//;
     $usr=~s/\s*$//;
     $pass=~s/\s*$//;
     
     #Llamos a la funcion ftpcito
     &ftpcito($arc,$dir,$hos,$usr,$pass);
       
}

#Funcion
sub ftpcito{

#Mensajes de error a ser insertados en la Base de Datos
$sth2 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('No me conecte al Server FTP','$arc',(select to_char(sysdate,'dd/mm/yy hh24:mi:ss') from dual))");
$sth3 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('No puedo Loguearme','$arc',(select to_char(sysdate,'dd/mm/yy hh24:mi:ss') from dual))");
$sth4 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('No puedo cambiar de Directorio o No existe','$arc',(select to_char(sysdate,'dd/mm/yy hh24:mi:ss') from dual))");
$sth5 = $dbh->prepare("INSERT INTO SCOTT.ERRORES(ERROR,ARCHIVO,fecha_hora)VALUES('Fallo o el archivo no existe','$arc',(select to_char(sysdate,'dd/mm/yy hh24:mi:ss') from dual))");

        #Modulos de Adquisicion de Archivos via Net::Ftp
        $ftp=Net::FTP->new($_[2], Debug => 0) or $sth2->execute; #die "No puedo conectarme al Servidor $@";
        $ftp->login($_[3],$_[4]) or $sth3->execute;              #die "No puedo Loguearme ", $ftp->message;
        $ftp->cwd($_[1]) or $sth4->execute;                      #die "No puedo cambiar de Directorio ", $ftp->message;
        $ftp->get($_[0]) or $sth5->execute;                      #die "Toma de Archivos Fallida ", $ftp->message;
        $ftp->quit;            
        return $ftp->message;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Arielinux
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-02-06 13:27 @602

Notapor Arielinux » 2008-02-06 15:09 @673

Quedó bien... hasta funciona y todo... :P
Arielinux
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2008-02-06 13:27 @602

Notapor explorer » 2008-02-06 16:00 @708

Un poco largo, pero innovador y funcional, que es lo que importa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados