Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

mew-summary-* 対応



古川です。

mew-nmz 使いの方に御相談があります。

インデックスを作ったあとで、mew-summary-{sort,pack} すると、当然、
検索結果のファイル名が、本当のものと違ってきますよね?

そこで、ファイルを読んで、インデックス内のファイルとの対応をつけ
なおすスクリプトを作りました。

基本的には、ファイルのヘッダから Message-Id を読んで、インデックス
の NMZ.field.message-id と一致するように、NMZ.r と NMZ.field.uri を
直せばよく、これでほとんどうまく行くはずだと思うのですが、

    Message-Id が無いメールはどうするか
    同じ Message-Id を持つメールが複数あったらどうするか

という問題があって、ここのところの仕様に関して、何かアイディアは
ありますでしょうか?御意見をうかがいたいところです。

#「どうなってもよい」という意見も可

とりあえずは、ヘッダの Message-Id と Date それにファイルのサイズが
一致するものを対応づけるようにしていますが…

それと、スクリプトの名前は、何がいいと思いますか?

-- 
Rei FURUKAWA 
furukawa@xxxxxxxxxxxx
#!/usr/local/bin/perl5 -w
#
# nmz-mew-summary-fixer.pl (仮称)
#       by furukawa@xxxxxxxxxxxx
#
# <注意> まだ試作版です。
#        動作確認が不十分なだけでなく、
#        仕様が練れていないところがあります。
#
# mew-summary-{sort,pack} したフォルダの検索インデックスを修正
# します。NMZ.field.{message-id,date,size} を作成している必要
# があります。(デフォルトで作成されるはず)

use strict;

use IO::File;
use DirHandle;

push(@INC, '/usr/local/share/namazu/pl');
require 'nmzidx.pl';

if (@ARGV == 2){
    &main($ARGV[0], $ARGV[1]);
}else{
    print "usage: $0 data_directory index_directory\n";
    exit;
}

sub main{
    my $data_dir = shift;
    my $index_dir = shift;

    $data_dir .= '/' if $data_dir =~ /[^\/]$/;

    my $dh = new DirHandle($data_dir);
    my @data_list = grep {/^\d+$/} $dh->read;

    # Message-Id, Date, size から実際のファイルのパスを得るためのテーブル
    my %data_list;

    for my $data_file (@data_list){
        my $path = "$data_dir$data_file";
        if (defined (my $fh = new IO::File($path, 'r'))){
            my $messageid = '';
            my $date = '';
            my $size = -s $fh;
            while (defined(my $str = $fh->getline)){
                chomp $str;
                $str =~ s/\s+/ /g;
                $messageid = $str, next if $str =~ s/^message-id:\s+//i;
                $date = $str, next if $str =~ s/^date:\s+//i;
                last if $str =~ /^$/;
            }
            push(@{$data_list{$messageid}{$date}{$size}}, $path);
        }
    }

    my $ni = new nmzidx($index_dir, 'r');
    my $no = new nmzidx($index_dir, 'w');
    my $ni_file = $ni->open_flist;
    my $no_file = $no->open_flist;
    my %list;
    while (defined $ni_file->read(\%list)){
        my $messageid = $list{'field'}->{'message-id'};
        my $date = $list{'field'}->{'date'};
        my $size = $list{'field'}->{'size'};

        if (defined($data_list{$messageid}{$date}{$size})){
            # インデックス中に記録された message-id, date, size
            # を持つ現存ファイル名を、NMZ.r と NMZ.field.uri に書く
            # 
            # なかった時には、元のインデックスの値をそのまま書いてしまう
            # ことに注意!

            my $path = pop(@{$data_list{$messageid}{$date}{$size}});
            $list{'r'} = $path;
            $list{'field'}{'uri'} = $path;
        }
        $no_file->write(\%list);
    }
    $no->replace_db(0);
}