Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
mew-summary-* 対応
- From: Rei FURUKAWA <furukawa@xxxxxxxxxxxx>
- Date: Sun, 17 Dec 2000 03:10:29 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 01135
古川です。
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);
}