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);
}