Changeset 99

Show
Ignore:
Timestamp:
09.12.2006 21:14:16 (2 years ago)
Author:
decoder
Message:

Fix: $haserr defined before for loop starts (Jorge, please check if that is correct like that :))
Fix: Removed LOCK_UN calls for all files, they are not needed and dangerous as I read now. closing the FH is enough
New dependency: MLDBM::Sync (to get proper locking for MLDBM)
Fix: MLDBM access now with Locking, to prevent database corruption or failure.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/devel/FuzzyOcr.pm

    r98 r99  
    308308 
    309309    IMAGE: 
     310    my $haserr; 
    310311    foreach my $filename (keys %imgfiles) { 
    311312        my $pic = $imgfiles{$filename}; 
     
    324325 
    325326        #Open ERRORLOG 
    326         my $haserr = $Mail::SpamAssassin::Logger::LOG_SA{level} == 3; 
     327        $haserr = $Mail::SpamAssassin::Logger::LOG_SA{level} == 3; 
    327328 
    328329        if ($haserr) { 
  • trunk/devel/FuzzyOcr/Config.pm

    r95 r99  
    77use FuzzyOcr::Preprocessor; 
    88use Mail::SpamAssassin::Logger; 
     9 
     10use Fcntl qw(O_RDWR O_CREAT); 
    911 
    1012use base 'Exporter'; 
     
    2830    get_wordlist  
    2931    get_mysql_ddb 
     32    get_db_ref 
     33    set_db_ref 
    3034    read_words  
    3135    /; 
     
    3337use constant HAS_DBI => eval { require DBI; }; 
    3438use constant HAS_DBD_MYSQL => eval { require DBD::mysql; }; 
    35 use constant HAS_MLDBM => eval { require MLDBM; }; 
     39use constant HAS_MLDBM => eval { require MLDBM; require MLDBM::Sync; }; 
    3640use constant HAS_DB_FILE => eval { require DB_File; }; 
    3741use constant HAS_STORABLE => eval { require Storable; }; 
     
    4953our $tmpdir; 
    5054our @tmpdirs; 
     55our $dbref; 
    5156 
    5257our @bin_utils = qw/gifsicle 
     
    141146sub get_thresholds { 
    142147    return \%Threshold; 
     148} 
     149 
     150sub set_db_ref { 
     151    $dbref = shift; 
     152} 
     153 
     154sub get_db_ref { 
     155    return $dbref; 
    143156} 
    144157 
     
    616629            $conf->{focr_enable_image_hashing} = 0; 
    617630            errorlog("Disable Image Hashing"); 
    618             errorlog("Missing MLDBM") unless HAS_MLDBM; 
     631            errorlog("Missing MLDBM and/or MLDBM::Sync") unless HAS_MLDBM; 
    619632            errorlog("Missing DB_File") unless HAS_DB_FILE; 
    620633            errorlog("Missing Storable") unless HAS_STORABLE; 
     
    624637        use DBI; 
    625638        use MLDBM qw(DB_File Storable); 
     639        use MLDBM::Sync; 
    626640        if ($conf->{focr_enable_image_hashing} == 2 and -r $conf->{focr_digest_db}) { 
    627             my %DB; my $dbm; my $err = 0; 
     641            my %DB; my $dbm; my $sdbm; my $err = 0; 
    628642            my $now = time - ($conf->{focr_db_max_days}*86400); 
    629             tie %DB, 'MLDBM', $conf->{focr_db_hash} or $err++; 
     643            $sdbm = tie %DB, 'MLDBM::Sync', $conf->{focr_db_hash} or $err++; 
    630644            if ($err) { 
    631645                errorlog("Could not open \"$conf->{focr_db_hash}\""); 
    632646            } else { 
     647                $sdbm->Lock; 
    633648                my $hash = 0; 
    634649                infolog("Expiring records prior to: ".scalar(localtime($now))); 
     
    662677                $hash = scalar(keys %DB); 
    663678                infolog("<$hash> Known BAD Image Hashes Available"); 
     679                $sdbm->UnLock; 
    664680                untie %DB; 
    665681            } 
    666682            $err = 0; 
    667             tie %DB, 'MLDBM', $conf->{focr_db_safe} or $err++; 
     683            $sdbm = tie %DB, 'MLDBM::Sync', $conf->{focr_db_safe} or $err++; 
    668684            if ($err) { 
    669685                errorlog("Could not open \"$conf->{focr_db_safe}\""); 
    670686            } else { 
     687                $sdbm->Lock; 
    671688                my $hash = 0; 
    672689                foreach my $k (keys %DB) { 
     
    681698                $hash = scalar(keys %DB); 
    682699                infolog("<$hash> Known GOOD Image Hashes Available"); 
     700                $sdbm->UnLock; 
    683701                untie %DB; 
    684702            } 
     
    688706            my $tab  = $conf->{focr_mysql_hash}; 
    689707            my $file = $conf->{focr_db_hash}; 
    690             my %DB; my $dbm; my $err = 0; 
    691             tie %DB, 'MLDBM', $file or $err++; 
     708            my %DB; my $dbm; my $sdbm; my $err = 0; 
     709            $sdbm = tie %DB, 'MLDBM::Sync', $file or $err++; 
    692710            if ($err) { 
    693711                errorlog("Could not open \"$file\""); 
    694712            } else { 
     713                $sdbm->ReadLock; 
    695714                foreach my $k (keys %DB) { 
    696715                    my $dbm = $DB{$k}; 
     
    718737                    } 
    719738                } 
     739                $sdbm->UnLock; 
    720740                untie %DB; 
    721741                infolog("Stored [$err] Hashes in $db.$tab") if $err>0; 
     
    724744            $file = $conf->{focr_db_safe}; 
    725745            $err  = 0; 
    726             tie %DB, 'MLDBM', $file or $err++; 
     746            $sdbm = tie %DB, 'MLDBM::Sync', $file or $err++; 
    727747            if ($err) { 
    728748                errorlog("Could not open \"$file\""); 
    729749            } else { 
     750                $sdbm->ReadLock; 
    730751                foreach my $k (keys %DB) { 
    731752                    my $dbm = $DB{$k}; 
     
    753774                    } 
    754775                } 
     776                $sdbm->UnLock; 
    755777                untie %DB; 
    756778                infolog("Stored [$err] Hashes in $db.$tab") if $err>0; 
  • trunk/devel/FuzzyOcr/Hashing.pm

    r75 r99  
    142142    elsif ($conf->{focr_enable_image_hashing} == 2) { 
    143143        use MLDBM qw(DB_File Storable); 
    144         my %DB = (); my $dbm; 
    145         tie %DB, 'MLDBM', $dbfile, O_RDWR or $ret++; 
     144        use MLDBM::Sync; 
     145        my %DB = (); my $dbm; my $sdbm; 
     146        $sdbm = tie %DB, 'MLDBM::Sync', $dbfile, O_RDWR or $ret++; 
    146147        if ($ret>0) { 
    147148            warnlog("No Image Hash database found at \"$dbfile\", or permissions wrong."); 
    148149            return (0,''); 
    149150        } 
     151        $sdbm->Lock; 
    150152        if (defined $DB{$key}) { 
    151153            $dbm = $DB{$key}; 
     
    188190            $DB{$key} = $dbm; 
    189191        } 
     192        $sdbm->UnLock; 
    190193        untie %DB; 
    191194        return ($ret,$dinfo); 
     
    272275    elsif ($conf->{focr_enable_image_hashing} == 2) { 
    273276        use MLDBM qw(DB_File Storable); 
     277        use MLDBM::Sync; 
    274278        my $dbfile = $_[2] || $conf->{focr_db_hash}; 
    275         my %DB = (); 
    276         tie %DB, 'MLDBM', $dbfile or $ret++; 
     279        my %DB = (); my $sdbm; 
     280        $sdbm = tie %DB, 'MLDBM::Sync', $dbfile or $ret++; 
    277281        if ($ret>0) { 
    278282            warnlog("Unable to open/create Image Hash database at \"$dbfile\", check permissions."); 
    279283            return; 
    280284        } 
     285        $sdbm->Lock; 
    281286        infolog("Adding Hash to \"$dbfile\" with score \"$score\""); 
    282287        my ($img,$key) = split('::',$digest,2); 
     
    294299            $DB{$key} = $dbm; 
    295300        } 
     301        $sdbm->UnLock; 
    296302        untie %DB; 
    297303    } 
     
    310316        seek( DB, 0, 2 ); 
    311317        print DB "${score}::${digest}\n"; 
    312         flock( DB, LOCK_UN ); 
    313318        close(DB); 
    314319    } 
  • trunk/devel/FuzzyOcr/Logging.pm

    r93 r99  
    2222    seek( LOGFILE, 0, 2 ); 
    2323    print LOGFILE "$time [$$] $logtext\n"; 
    24     flock( LOGFILE, LOCK_UN ); 
    2524    close LOGFILE; 
    2625}