Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: mew-summary-* 対応
古川です。
From: Hideyuki SHIRAI (白井秀行) <shirai@xxxxxxxxxxxxxxxxxxx>
Subject: [namazu-devel-ja] Re: mew-summary-* 対応
Date: Wed, 27 Dec 2000 13:04:06 +0900 (JST)
shirai> 確かに、たまになんか変だなというときがありました。
たぶん直ったと思います。
sort(+fixer)/refile/mknmz/gcnmz をランダムに繰り返して遊んでみま
したが、よさそうな感じです。
nmzidx.pl は、現在 cvs 上にあるものをお使いください。2.0.5 に含ま
れているやつだと、gcnmz のことしか考えていなかったので、fixer にも
使いやすように、ちょっと変更しています。
--
Rei FURUKAWA
furukawa@xxxxxxxxxxxx
#! /usr/local/bin/perl5 -w
# -*- Perl -*-
#
# 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';
my $opt_windows_drive = 0;
while (@ARGV && $ARGV[0] =~ s/^\-//){
my $argv = shift(@ARGV);
if ($argv =~ s/^\-//){
$opt_windows_drive = 1 if $argv eq 'windows-drive';
next;
}
while ($argv =~ s/^(.)//){
my $ch = $1;
$opt_windows_drive = 1 if $ch eq 'w';
}
}
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;
my $change = 0;
my $total = 0;
my $delete = 0;
while (defined $ni_file->read(\%list)){
my $messageid = $list{'field'}->{'message-id'};
my $date = $list{'field'}->{'date'};
my $size = $list{'field'}->{'size'};
if ($list{'t'} != -1){
if (defined($data_list{$messageid}{$date}{$size})){
# インデックス中に記録された message-id, date, size
# を持つ現存ファイル名を、NMZ.r と NMZ.field.uri に書く
my $path = shift(@{$data_list{$messageid}{$date}{$size}});
++$total;
$list{'r'} = $path, $change = 1 if $list{'r'} ne $path;
$path =~ s/^(.):/\/$1\|/ if $opt_windows_drive;
$list{'field'}{'uri'} = $path;
push(@{$data_list{$messageid}{$date}{$size}}, $path);
}else{
++$delete;
$list{'t'} = -1;
}
}
$no_file->write(\%list);
}
if ($change || $delete){
$no->write_status($ni);
if ($no->log_open("[mew-sort/pack]")){
$no->log_putline("Deleted Documents:", $delete);
$no->log_putline("Total Documents:", $total);
$no->log_close;
}
}
$ni_file->close;
$no_file->close;
$no->replace_db(0);
}