Pages

lunes, enero 12, 2009

Firebird ISQL + ftp + cron

Nada que ver con nada... o todo que ver con todo. Estuve buscando infructuosamente algún manual del ISQL ó Interactive SQL de Firebird, pero no encontré mucho.
El problema a resolver es poder generar una estadística en un archivo de texto y subirla a un servidor FTP. Se me ocurrió que a través de una tarea programada podía resolverlo. Estos son los pasos a seguir hasta el momento.:

1.- Crear un archivo con el query a ejecutar. Si el mismo es un procedimiento recordar cambiar el Terminador. Ejemplo: Archivo ARTICULOS.SQL

SET HEADING OFF; -- Esto hace que ISQL no genere una paginación cada 20 registros.

SET TERM ^;

EXECUTE BLOCK
RETURNS (
CODART INTEGER;
NOMART VARCHAR(30);
)
AS
BEGIN
FOR
SELECT CODIGO, NOMBRE
FROM ARTICULOS
INTO :CODART, :NOMART
DO
SUSPEND;
END ^

SET TERM ; ^

2.- Ahora ejecutamos ISQL llamando al archivo ARTICULOS.SQL y grabando la salida en el archivo ARTICULOS.TXT

/opt/firebird/bin/isql 'localhost:/data/base.gdb' -u SYSDBA -p masterkey -i '/home/usuario/ARTICULOS.SQL' -o '/home/usuario/ARTICULOS.TXT'

3.- Hasta acá viene todo bien, el problema es que el ISQL me genera una linea en blanco antes del primer registro dentro de los archivos exportados, para solucionarlo encontré la aplicación de consola "sed" en linux. basicamente el comando se escribe de la siguiente forma:

sed "1d" /home/usuario/ARTICULOS.TXT > /home/usuario/ARTICULOS2.TXT

Esto hace que se copie el archivo ARTICULOS.TXT en el archivo ARTICULOS2.TXT omitiendo la primer linea del archivo. Si necesitasen, por ejemplo, obviar ademas la última linea entonces podrian escribir: sed "1d;$d" [archivoentrada] > [archivosalida] el comando tiene muchisimas posibilidades como reemplazo de cadenas a través de expresiones regulares, etc. Para mas detalle pongan info sed en la consola, el manual tiene muchas secciones y está bastante completo.

3.- Listo. Esto genera los archivos. Y ahora el temita del FTP.
En windows es bastante simple, uno puede crear un archivo de texto con las acciones a realizar dentro del servidor y llamarlo desde afuera de la siguiente manera:

ftp -s:conexion.txt


archivo CONEXION.TXT

open nombreservidor.com
nombredeusuario
password
cd articulos
put /home/usuario/articulos.txt arts.txt
quit

En linux la cosa es algo mas complicada. Para replicar el comportamiento anterior bastaria con que en la linea de comandos escribiesemos:

ftp < conexion.txt


El problema es que en cuanto pasemos el comando open linux automáticamente solicita el nombre de usuario y password, acepta el usuario pero no el password que le estamos pasando en el archivo con lo cual la consola queda a la espera del ingreso del password desde el teclado. La solución es pasarle el parametro -n. Esto hace que el ftp no intente loguearse automáticamente luego del comando open. Hay que hacer una pequeña modificación en el archivo conexion.txt quedando el mismo de la siguiente manera:

archivo CONEXION.TXT
open nombreservidor.com
user nombredeusuario password
cd articulos
put /home/usuario/articulos.txt arts.txt
quit

Juntando todo lo que hicimos hasta el momento y poniendolo un poco mas prolijo el script que armé lo llamaré exportacion.sh

archivo exportacion.sh
#!/bin/sh
/opt/firebird/bin/isql 'localhost:/data/base.gdb' -u SYSDBA -p masterkey -i '/home/usuario/ARTICULOS.SQL' -o '/home/usuario/ARTICULOS.TXT'
sed "1d" /home/usuario/ARTICULOS.TXT > /home/usuario/ARTICULOS2.TXT
rm -f /home/usuario/ARTICULOS.TXT
HOST='nombredelservidor.com'
USER='usuario'
PASSWD='password'
ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd articulos
put /home/usuario/ARTICULOS2.TXT arts.txt
quit
END_SCRIPT
exit 0

Toda la parte del ftp la podriamos haber dejado en ftp -n < conexion.txt pero dejo tambien la forma anteriror como una alternativa válida y un poquito mas elaborada.
Una recomendación y/o recordatorio no menor, asegurense de tener permiso de escritura en todos los directorios donde estén trabajando.
Finalmente el script lo ejecutan con

sh exportacion.sh

ó le dan permiso de ejecución y ponen:

./exportación.sh

y si quieren pueden poner

sh -x exportación.sh


con lo que entran en modo debug y pueden ver la ejecución paso a paso.
Espero que sirva. Saludos.

3 comentarios:

  1. Excelente info !!! abrazo Javo

    ResponderEliminar
  2. Vaya trabajo que te mandaste :-O, probalo en perl, en menos de de 10 lineas lo resolves ;-).
    Saludos JC.

    ResponderEliminar