Can't locate object method "fd" via package "SDBM_File"

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • perlvasu
    New Member
    • Mar 2008
    • 1

    Can't locate object method "fd" via package "SDBM_File"

    6 jobs are running at the same time and accessing same dbm file for writing and reading. These are daily jobs and failing only some times not regularly. So i thought of this is just because of dead lock situation. So i tried to put flock here in the following code. But i got the following error.

    Can't locate object method "fd" via package "SDBM_File"


    Can any body help me in this case.
    [code=perl]
    use strict ;
    use warnings ;
    use SDBM_File ;
    use Fcntl ;
    use vars qw($ctl);

    my $dir;
    my $LOCK_EX = 2;
    # determine application base directory
    require("rupBas e.pl");
    $dir = &rupBase($0) ;

    #---load supplemental routines
    # $SLAYER_ON = 1; #-- slayer inititalized if variable defined --#
    push(@INC,$dir) ;
    require("utlIni tPerl.pl") || die "could not locate 'utlInitPerl.pl '";
    #
    #----------------------------End of Common Code------------------------------
    #
    my $date;
    chop($date=`dat e '+%Y%m%d.%H%M`) ;

    my $dpc = $$ctl{MTT_JURIS DICTION};
    my $fileName = $$ctl{MTT_OUTPU T_EOP_XPORT_OUT }."/GAPSOUT.".$date ;
    my $fileRecall;
    my $tName = $$ctl{MTT_STAT_ DIR}."/FTP_FILE_NAMES" ;
    my $cycnum = '';
    my $cycFile = $$ctl{MTT_CYCLE _FILE};
    my $javaHome=$ENV{ JAVA_HOME};
    my $db;
    my $stat;
    my %FILE_NAMES;

    $ENV{'MTT_CYCLE _FILE'} = $cycFile;
    $ENV{'GAPSOUT'} = "$fileName" ;

    $ENV{'PATH'}="$ javaHome/bin:$javaHome/jre/bin:$ENV{PATH}" ;

    #----------------------------------------------------------------------------
    # get cycle number
    #----------------------------------------------------------------------------

    open(FILE,"<$cy cFile");
    { local $/ = undef;
    my $data = <FILE>;
    $cycnum = substr($data,11 ,7);
    print "Cycle Number = $cycnum\n";
    }
    close(FILE);


    print "\n============ ==========Start Java=========== ===========\n";
    my $cmd = "java -DDPCH=$dpc -DCycleDt=$cycnu m GapsOutRpt $fileName";
    print "============== ==========End Java=========== ============\n\ n";
    print "$cmd\n";
    $! = system("$cmd");
    $stat = $!>>8;
    if ($stat > 4) {
    &postlude($stat ,$!);
    exit $stat;
    }

    my $i = 0;
    local *DBM;
    while ($i++ < 5) {
    $db = tie(%FILE_NAMES , 'SDBM_File', $tName, O_RDWR|O_CREAT, 0666)
    or die "Cannot open $tName: $!\n" ;

    my $fd = $db->fd;
    open DBM, "+<&=$fd" or die "Could not dup DBM for lock: $!";
    flock DBM, $LOCK_EX;
    undef $db;
    $FILE_NAMES{'GA PSOUT'} = $fileName;
    $fileRecall = $FILE_NAMES{'GA PSOUT'};

    if ($fileRecall eq $fileName) {
    print "$i: DB update successful: $fileName\n";
    last;

    } else {
    print "$i: DB update failed: sleep (1): try again\n";
    sleep (1);
    }

    }

    $stat = $!>>8;
    if ($stat != 0) {
    &postlude($stat ,$!);
    }

    exit $stat;
    [/code]
    Last edited by numberwhun; Mar 19 '08, 04:52 PM. Reason: add code tags
  • KevinADC
    Recognized Expert Specialist
    • Jan 2007
    • 4092

    #2
    This line is the source of the error:

    my $fd = $db->fd;

    what is the fd method supposed to do? As far as I know the SDBM_File module has no usable methods.

    Comment

    Working...