commit 601e3c0f0e0098ffdf71219a465a23813a417268
parent d0a85f650d252cf7a3f3f134762831defaf6c0fc
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date: Mon, 4 Dec 2006 06:42:12 +0000
bug fixes with new strict mbox checking
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@64 5c8cc53c-5e98-4d25-b20a-d8db53a31250
Diffstat:
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git 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