Rule::Deduped::DBIC

エントリの重複チェックを行う Rule::Deduped のサブクラス。Store::DBIC で保存した entry から検索するもの。
Store::DBIC を愛用しているので、僭越ながら書いてみました。

  - module: Filter::Rule
    rule:
      module: Deduped
      engine: DBIC
  - module: Store::DBIC
    config:
      schema_class: Plagger::Schema::SQLite
      connect_info: [ 'dbi:SQLite:/path/to/plagger.db', ]
  • 最初に find_entry で呼ばれた時点で、Store::DBIC をチェック
  • body の MD5 hash を求める部分がいけてない

ソースはこんなので。
[追記] MD5 求めるところが間違ってた。とりあえず Plagger::Entry からコピペしたが…

package Plagger::Rule::Deduped::DBIC;
use strict;
use base qw( Plagger::Rule::Deduped::Base );
use Plagger::Plugin::Store::DBIC;

sub find_entry {
    my($self, $url) = @_;

    my $c = Plagger->context;
    unless($self->{db}){
        my $plugins = $c->{plugins};
        my ($db) = grep { $_->isa('Plagger::Plugin::Store::DBIC') } @$plugins;
        return unless $db;
        $self->{db} = $db;
    }

    my $entry = $self->{db}->schema->resultset('Entry')->find({
        link => $url,
    });
    if($entry){
        # XXX see Plagger::Entry::digest
        my $data = $entry->title . ($entry->body || '');
        Encode::_utf8_off($data);
        return Digest::MD5::md5_hex($data);
    }
    $c->log( debug => "not found." );
    return;
}

sub create_entry {
    my($self, $url, $digest) = @_;
    Plagger->context->log( debug => "$url stored later by Store::DBIC" );
    1;
}
1;