From d8540d8199066c1c0f3fde450f68bceb0e341531 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Tue, 25 Mar 2014 21:30:38 -0700 Subject: [PATCH] close cursors on DESTROY in same process, RT#26262 --- FS/FS/Cursor.pm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/FS/FS/Cursor.pm b/FS/FS/Cursor.pm index 24ebf5864..ec7af93c1 100644 --- a/FS/FS/Cursor.pm +++ b/FS/FS/Cursor.pm @@ -49,6 +49,9 @@ sub new { # the class of record object to return $self->{class} = "FS::".($q->{table} || 'Record'); + # save for later, so forked children will not destroy me when they exit + $self->{pid} = $$; + $self->{id} = sprintf('cursor%08x', refaddr($self)); my $statement = "DECLARE ".$self->{id}." CURSOR FOR ".$q->{statement}; @@ -101,6 +104,7 @@ sub refill { sub DESTROY { my $self = shift; + return unless $self->{pid} eq $$; dbh->do('CLOSE '. $self->{id}) or die dbh->errstr; # clean-up the cursor in Pg } @@ -114,6 +118,12 @@ Replace all uses of qsearch with this. Doesn't support MySQL. +The cursor will close prematurely if any code issues a rollback/commit. If +you need protection against this use qsearch or fork and get a new dbh +handle. +Normally this issue will represent itself this message. +ERROR: cursor "cursorXXXXXXX" does not exist. + =head1 SEE ALSO L -- 2.11.0