[PATCH] notify support for DBD::Pg - Mailing list pgsql-interfaces
From | Benjamin.Feinstein@guardent.com |
---|---|
Subject | [PATCH] notify support for DBD::Pg |
Date | |
Msg-id | 397E0659AA2DD411843500508B64F1CE0287DE1F@USBOSMX01 Whole thread Raw |
Responses |
Re: [PATCH] notify support for DBD::Pg
|
List | pgsql-interfaces |
Hey ya'll, Attached is a patch to add support for asynchronous client notifications to the DBD::Pg interface. The original patch was written by Alex Pilosov <alex@pilosoft.com> and sent to this list on 10 Jun 2001. This is an updated version that fixes some problems I encountered when running Alex's patch against DBD-Pg-1.01. Alex's original patch was generated from a diff of DBD-Pg-1.00. The following description of the patch is from Alex's original email: Added following functions (self-documented in Pg.pm): $ret = $dbh->func('notifies'); Returns either undef or a reference to two-element array [ $table, $backend_pid ] of asynchronous notifications received. $fd = $dbh->func('getfd'); Returns fd of the actual connection to server. Can be used with select() and func('notifies'). Also modified test.pl to test all of this functionality in the following sequence (listen, select, notify, select). Cheers, Ben diff -r DBD-Pg-1.01/Pg.pm DBD-Pg-1.01.ben/Pg.pm 631a632,640 > $ret = $dbh->func('notifies'); > > Returns either undef or a reference to two-element array > [ $table, $backend_pid ] of asynchronous notifications received. > > $fd = $dbh->func('getfd'); > > Returns fd of the actual connection to server. Can be used with > select() and func('notifies'). diff -r DBD-Pg-1.01/Pg.xs DBD-Pg-1.01.ben/Pg.xs 85a86,103 > getfd(dbh) > SV * dbh > CODE: > int ret; > D_imp_dbh(dbh); > > ret = dbd_db_getfd(dbh, imp_dbh); > ST(0) = sv_2mortal( newSViv( ret ) ); > > void > notifies(dbh) > SV * dbh > CODE: > D_imp_dbh(dbh); > > ST(0) = dbd_db_notifies(dbh, imp_dbh); > > void diff -r DBD-Pg-1.01/dbdimp.c DBD-Pg-1.01.ben/dbdimp.c 199a200,240 > int > dbd_db_getfd (dbh, imp_dbh) > SV *dbh; > imp_dbh_t *imp_dbh; > { > char id; > SV* retsv; > > if (dbis->debug >= 1) { fprintf(DBILOGFP, "dbd_db_getfd\n"); } > > return PQsocket(imp_dbh->conn); > } > > SV * > dbd_db_notifies (dbh, imp_dbh) > SV *dbh; > imp_dbh_t *imp_dbh; > { > char id; > PGnotify* notify; > AV* ret; > SV* retsv; > > if (dbis->debug >= 1) { fprintf(DBILOGFP, "dbd_db_notifies\n"); } > > PQconsumeInput(imp_dbh->conn); > > notify = PQnotifies(imp_dbh->conn); > > if (!notify) return &sv_undef; > > ret=newAV(); > > av_push(ret, newSVpv(notify->relname,0) ); > av_push(ret, newSViv(notify->be_pid) ); > > retsv = newRV(sv_2mortal((SV*)ret)); > > return retsv; > } > diff -r DBD-Pg-1.01/dbdimp.h DBD-Pg-1.01.ben/dbdimp.h 72a73,74 > SV * dbd_db_notifies (SV *dbh, imp_dbh_t *imp_dbh); > diff -r DBD-Pg-1.01/test.pl DBD-Pg-1.01.ben/test.pl 43c43 < my ($dbh0, $dbh, $sth); --- > my ($dbh0, $dbh, $dbh1, $sth); 447a448,449 > # compare large objects > 452,453d453 < # compare large objects < 457a458,497 > my $fd; > ( $fd=$dbh->func( 'getfd') ) > and print "\$dbh->func(getfd) .......... ok\n" > or print "\$dbh->func(getfd) .......... not ok\n"; > > ( $dbh->do( 'LISTEN test ') ) > and print "\$dbh->do('LISTEN test') .... ok\n" > or print "\$dbh->do('LISTEN test') .... not ok\n"; > > ( $dbh1 = DBI->connect("$dsn_test", '', '', { AutoCommit => 1 }) ) > and print "DBI->connect (for notify)... ok\n" > or die "DBI->connect (for notify)... not ok: ", $DBI::errstr; > > # there should be no data for read on $fd , until we send a notify > > my $rout; > my $rin = ''; > vec($rin,$fd,1) = 1; > my $nfound = select( $rout=$rin, undef, undef, 0); > > ( $nfound==0 ) > and print "select(\$fd) returns no data. ok\n" > or die "select(\$fd) returns no data. not ok\n"; > > ( $dbh1->do( 'NOTIFY test ') ) > and print "\$dbh1->do('NOTIFY test') ... ok\n" > or print "\$dbh1->do('NOTIFY test') ... not ok\n"; > > my $nfound2 = select( $rout=$rin, undef, undef, 1); > > ( $nfound2==1 ) > and print "select(\$fd) returns data.... ok\n" > or die "select(\$fd) returns data.... not ok\n"; > > my $notify_r; > > ( $notify_r = $dbh->func('notifies') ) > and print "\$dbh->func('notifies')...... ok\n" > or die "\$dbh->func('notifies')...... not ok\n"; > 464a505,508 > > ( $dbh1->disconnect ) > and print "\$dbh1->disconnect .......... ok\n" > or die "\$dbh1->disconnect .......... not ok: ", $DBI::errstr; > Ben Feinstein > Software Development Engineer, R & D > W: 678.585.7865 x6726 F: 770.645.8311 M: 678.772.4126 > 8302 Dunwoody Pl., Suite 320, Atlanta, GA 30350 www.guardent.com > _____________________________________________________ > G U A R D E N T > Enterprise Security and Privacy Programs >
pgsql-interfaces by date: