Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Error deleting DBM::Deep file (ref count?)

by bobf (Monsignor)
on Jun 05, 2012 at 21:46 UTC ( [id://974578]=perlquestion: print w/replies, xml ) Need Help??

bobf has asked for the wisdom of the Perl Monks concerning the following question:

I stumbled across a bug in my code that I tracked down to something I am doing with a DBM::Deep file. When I assign the inner key of a DBM hash-of-hrefs to another variable and then try to delete the file, I get an error when the inner key is a href but not when it is a non-ref scalar.

use strict; use warnings; use DBM::Deep; my $db_file = 'href_nocopy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # succeeds $db_file = 'href_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; my $db2 = $db->{key}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # fails (permission denied) $db_file = 'nonref_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = 1; my $db2 = $db->{key}; } print "\nDeleting $db_file\n"; unlink( $db_file ) || warn $!; # succeeds

Any ideas? I didn't find any documentation about this elsewhere.

Thanks

Replies are listed 'Best First'.
Re: Error deleting DBM::Deep file (ref count?)
by Athanasius (Archbishop) on Jun 06, 2012 at 03:32 UTC

    Hi bobf,

    I’ve not used this module before, but in playing around with your code I’ve made the following observations:

    (1) Your results are duplicated on my system, which is Strawberry Perl 5.14.2 running on Vista 32-bit.

    (2) If I add a call to Data::Dumper like so:

    use Data::Dumper; ... { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; print "Dump: ", Dumper($db); }

    then href_nocopy fails with the same permission denied error as for href_copy.

    (3) If I add $db->clear(); before the call to unlink, the permission denied errors go away:

    use strict; use warnings; use DBM::Deep; use Data::Dumper; use constant DUMP => 0; # 1 for debugging { my $db_file = 'href_nocopy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; print "Dump: ", Dumper($db) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # succeeds $db_file = 'href_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = {}; my $db2 = $db->{key}; print "\nDump: ", Dumper($db) if DUMP; print "Dump: ", Dumper($db2) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # now succeeds! $db_file = 'nonref_copy'; { my $db = DBM::Deep->new( $db_file ); $db->{key} = 1; my $db2 = $db->{key}; print "\nDump: ", Dumper($db) if DUMP; print "Dump: ", Dumper($db2) if DUMP; $db->clear(); } print "\nDeleting $db_file\n"; unlink( $db_file ) or warn $!; # succeeds }

    I don’t know what is going on, but maybe the above observations will help?

    Regards,

    Athanasius <°(((><contra mundum

      Thanks very much for looking into this. Interesting observation re: Data::Dumper causing a similar error message. I didn't try to dump the structure so I didn't encounter that behavior.

      I confirmed that calling clear will avoid the error on my system. If it works in my production code as well, I'll declare (partial) victory. I wonder what the root cause is, though.

      Thanks for the idea.

      Update: I tried this in my production code but it did not work. I also tried calling the unlock method, but to no avail.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://974578]
Approved by stevieb
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (3)
As of 2024-03-19 07:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found