From 601e3c0f0e0098ffdf71219a465a23813a417268 Mon Sep 17 00:00:00 2001 From: wmorgan Date: Mon, 4 Dec 2006 06:42:12 +0000 Subject: [PATCH] bug fixes with new strict mbox checking git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@64 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- lib/sup/mbox/loader.rb | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/sup/mbox/loader.rb b/lib/sup/mbox/loader.rb index f4cbe80..dfc0dd2 100644 --- a/lib/sup/mbox/loader.rb +++ b/lib/sup/mbox/loader.rb @@ -14,9 +14,9 @@ class Loader ## end_offset is the last offsets within the file which we've read. ## everything after that is considered new messages that haven't ## been indexed. - def initialize filename, end_offset=0, usual=true, archived=false, id=nil + def initialize filename, end_offset=nil, usual=true, archived=false, id=nil @filename = filename.gsub(%r(^mbox://), "") - @end_offset = end_offset + @end_offset = end_offset || 0 @dirty = false @usual = usual @archived = archived @@ -50,6 +50,8 @@ class Loader header = nil @mutex.synchronize do @f.seek offset if offset + l = @f.gets + raise Error, "offset mismatch in mbox file: #{l.inspect}. Run 'sup-import --rebuild #{to_s}' to correct this." unless l =~ BREAK_RE header = MBox::read_header @f end header @@ -91,22 +93,30 @@ class Loader def next return nil if done? @dirty = true + start_offset = nil next_end_offset = @end_offset + ## @end_offset could be at one of two places here: before a \n and + ## a mbox separator, if it was previously at EOF and a new message + ## was added; or, at the beginning of an mbox separator (in all + ## other cases). @mutex.synchronize do @f.seek @end_offset + l = @f.gets or return nil + if l =~ /^\s*$/ + start_offset = @f.tell + @f.gets + else + start_offset = @end_offset + end - @f.gets # skip the From separator - next_end_offset = @f.tell while(line = @f.gets) break if line =~ BREAK_RE next_end_offset = @f.tell end end - start_offset = @end_offset @end_offset = next_end_offset - start_offset end @@ -117,10 +127,6 @@ class Loader end end - def each_header - each { |offset, labels| yield offset, labels, load_header(offset) } - end - def done?; @end_offset >= File.size(@f); end def total; File.size @f; end end -- 2.45.2