• Publicidad

Procesar notificaciones de PostgreSQL

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Procesar notificaciones de PostgreSQL

Notapor p3rl3r0 » 2012-02-06 06:19 @305

Hola,
Necesito procesar las notificaciones de PostgreSQL corriendo para cada una de ellas su correspondiente función que puede demorar unos segundos.

El siguiente código es un pequeño avance de cómo debería funcionar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use DBI;
  4.  
  5. my $dbh = DBI->connect( "dbi:Pg:dbname=prueba host=127.0.0.1 port=5432", '', '' ) or die "Sin Conexión!!!\n";
  6.  
  7. $dbh->do("LISTEN xdemonio");
  8.  
  9. LISTENLOOP: {
  10.     while ( my $notify = $dbh->pg_notifies ) {
  11.         my ( $name, $pid, $payload ) = @$notify;
  12.         print "$name - $pid - $payload\n";
  13.         my ( $accion, $catalogo, $esquema, $tabla ) = split( ",", $payload );
  14.         eval {
  15.             my $sth
  16.                 = $dbh->prepare(
  17.                 "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='$esquema' AND tablename='$tabla'", 1 )
  18.                 or warn "Error consultando existencia de $esquema.$tabla\n";
  19.             $sth->execute() or $accion = '';
  20.             $sth->finish;
  21.         };
  22.         if ( $accion eq 'n' ) {
  23.             print "Accion: Nueva tabla\n";
  24.             my $sth = $dbh->prepare("SELECT n_funcion('$catalogo','$esquema','$tabla')")
  25.                 or warn "SELECT xfuncion: " . $dbh->errstr;
  26.             $sth->execute() or print "Falló: " . $sth->errstr;
  27.             $sth->finish;
  28.         }
  29.         elsif ( $accion eq 'd' ) {
  30.             print "Accion: Eliminar tabla\n";
  31.             my $sth = $dbh->prepare("SELECT d_funcion('$catalogo','$esquema','$tabla')")
  32.                 or warn "SELECT d_funcion: " . $dbh->errstr;
  33.             $sth->execute() or print "Falló: " . $sth->errstr;
  34.             $sth->finish;
  35.         }
  36.     }
  37.     $dbh->ping() or die qq{Sin conexión !!};
  38.     sleep(3);
  39.     redo;
  40. }
  41.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Espero que puedan ayudarme a crear correctamente el demonio que puede ser muy útil desde el punto de vista administrativo.

Saludos
P3rl3r0
Última edición por explorer el 2012-02-06 07:25 @350, editado 2 veces en total
Razón: Formateado de código con Perltidy
p3rl3r0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-02-03 10:48 @491

Publicidad

Re: Procesar notificaciones de PostgreSQL

Notapor explorer » 2012-02-06 07:22 @348

Bienvenido a los foros de Perl en español, p3rl3r0.

Yo nunca he manejado una base de datos PostgreSQL, así que aún menos sé qué es lo del LISTEN, pero sí veo que está mal definido el DSN de conexión a la base de datos. Supongo que es solo un pseudocódigo, no el código de prueba, ya que en lugar de los espacios en blanco, han de ser ';'.

Pero, repito, en lo demás, no tengo idea.

Dentro de la carpeta t/ hay algunos test, y en uno de ellos hay ejemplos de conexión asíncrona.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar notificaciones de PostgreSQL

Notapor explorer » 2012-02-06 07:29 @353

Pues sí que hay ejemplos. Buscando en Google, me sale esto: Listen/Notify improvements in PostgreSQL 9.0
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar notificaciones de PostgreSQL

Notapor p3rl3r0 » 2012-02-06 11:37 @526

explorer, muchas gracias por la bienvenida.
...mal definido el DNS de conexión a la base de datos.

El código está funcionando actualmente, pues la conexión es local (localhost) y la sesión de Linux corresponde al usuario postgres, el resto de los valores los toma por defecto (Autocommit, etc).

Los ejemplos de http://blog.endpoint.com/2010/09/listennotify-improvements-in-postgresql.html son similares al código que he publicado, pues lee las notificaciones $dbh1->do(q{LISTEN jtx});, obtiene la información del payload my ($name, $pid, $msg) = @$notice; y luego hacen alguna tarea con ello.

El objetivo es hacer un demonio con cualquiera de esos ejemplos.

Muchas gracias.
p3rl3r0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-02-03 10:48 @491

Re: Procesar notificaciones de PostgreSQL

Notapor explorer » 2012-02-06 12:01 @542

El cómo realizar un dæmon está resumido en la pregunta How do I fork a daemon process? del perlfaq8, que aconseja usar el módulo Proc::Daemon, que hace todos los pasos necesarios.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Procesar notificaciones de PostgreSQL

Notapor p3rl3r0 » 2012-02-06 12:19 @555

Entonces existen dos maneras de hacerlo:
- Según publicas en el hilo http://perlenespanol.com/foro/demonio-y-servidor-t4220.html refiriendo al capítulo 17 del libro Perl Cookbook
y
- Con el módulo Proc::Daemon

Intentaré con el módulo y cuando lo tenga funcional lo publico.

Saludos
p3rl3r0
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-02-03 10:48 @491

Re: Procesar notificaciones de PostgreSQL

Notapor explorer » 2012-02-06 12:32 @564

Los pasos indicados en el Cookbook son los que sigue el módulo, que han de ser los mismos pasos que cualquier proceso que quiera ser un dæmon, debe seguir.

La ventaja del módulo es que permite hacerlo de forma cómoda, tanto el convertir el propio proceso en un dæmon, o lanzar otro proceso como dæmon.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bases de datos

¿Quién está conectado?

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