summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Kohler <ivan@freeside.biz>2014-03-25 21:30:38 -0700
committerIvan Kohler <ivan@freeside.biz>2014-03-25 21:30:38 -0700
commitd8540d8199066c1c0f3fde450f68bceb0e341531 (patch)
treec457018d98e977277a4f9a52f82cde3bc95f0222
parent90dd1d7c7a1b1d0c57c05a696f936df6247d98e3 (diff)
close cursors on DESTROY in same process, RT#26262
-rw-r--r--FS/FS/Cursor.pm10
1 files changed, 10 insertions, 0 deletions
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<FS::Record>