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:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use DBI;
- my $dbh = DBI->connect( "dbi:Pg:dbname=prueba host=127.0.0.1 port=5432", '', '' ) or die "Sin Conexión!!!\n";
- $dbh->do("LISTEN xdemonio");
- LISTENLOOP: {
- while ( my $notify = $dbh->pg_notifies ) {
- my ( $name, $pid, $payload ) = @$notify;
- print "$name - $pid - $payload\n";
- my ( $accion, $catalogo, $esquema, $tabla ) = split( ",", $payload );
- eval {
- my $sth
- = $dbh->prepare(
- "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='$esquema' AND tablename='$tabla'", 1 )
- or warn "Error consultando existencia de $esquema.$tabla\n";
- $sth->execute() or $accion = '';
- $sth->finish;
- };
- if ( $accion eq 'n' ) {
- print "Accion: Nueva tabla\n";
- my $sth = $dbh->prepare("SELECT n_funcion('$catalogo','$esquema','$tabla')")
- or warn "SELECT xfuncion: " . $dbh->errstr;
- $sth->execute() or print "Falló: " . $sth->errstr;
- $sth->finish;
- }
- elsif ( $accion eq 'd' ) {
- print "Accion: Eliminar tabla\n";
- my $sth = $dbh->prepare("SELECT d_funcion('$catalogo','$esquema','$tabla')")
- or warn "SELECT d_funcion: " . $dbh->errstr;
- $sth->execute() or print "Falló: " . $sth->errstr;
- $sth->finish;
- }
- }
- $dbh->ping() or die qq{Sin conexión !!};
- sleep(3);
- redo;
- }
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