vmail 0.8.8 → 0.8.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,9 +35,15 @@ module Vmail
35
35
  end
36
36
 
37
37
  # holds mail objects keyed by [mailbox, uid]
38
- # TODO don't cache a mail if too large; or come up with a way to purge
38
+ # TODO come up with a way to purge periodically
39
39
  def message_cache
40
40
  @message_cache ||= {}
41
+ size = @message_cache.values.reduce(0) {|sum, x| sum + x[:size]}
42
+ if size > 2_000_000 # TODO make this configurable
43
+ log "PRUNING MESSAGE CACHE; message cache is consuming #{number_to_human_size size}"
44
+ @message_cache.keys[0, @message_cache.size / 2].each {|k| @message_cache.delete(k)}
45
+ end
46
+ @message_cache
41
47
  end
42
48
 
43
49
  def open
@@ -249,7 +255,7 @@ module Vmail
249
255
  # borrowed from ActionView/Helpers
250
256
  def number_to_human_size(number)
251
257
  if number.to_i < 1024
252
- "#{number} b"
258
+ number = 1024 # round up to 1kh
253
259
  else
254
260
  max_exp = UNITS.size - 1
255
261
  exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024
@@ -385,46 +391,52 @@ module Vmail
385
391
  x
386
392
  else
387
393
  log "- fetching and storing to message_cache[[#{@mailbox}, #{uid}]]"
388
- fetch_and_cache(uid)
394
+ fetch_and_cache(index)
389
395
  end
390
- # pre-fetch prev and next
391
396
 
397
+ # make this more DRY later by directly using a ref to the hash
392
398
  mail = data[:mail]
393
- size = data[:size]
399
+ size = data[:size]
394
400
  @current_message_index = index
395
401
  @current_mail = mail # used later to show raw message or extract attachments if any
396
- formatter = Vmail::MessageFormatter.new(mail)
397
- out = formatter.process_body
398
- @current_message = <<-EOF
399
- #{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
400
- #{divider '-'}
401
- #{format_headers(formatter.extract_headers)}
402
-
403
- #{out}
404
- EOF
402
+ @current_message = data[:message_text]
405
403
  rescue
406
404
  log "parsing error"
407
405
  "Error encountered parsing this message:\n#{$!}\n#{$!.backtrace.join("\n")}"
408
406
  end
409
407
 
410
- def fetch_and_cache(uid)
408
+ def fetch_and_cache(index)
409
+ envelope_data = @message_list[index]
410
+ return unless envelope_data
411
+ seqno = envelope_data[:seqno]
412
+ uid = envelope_data[:uid]
411
413
  return if message_cache[[@mailbox, uid]]
412
414
  fetch_data = reconnect_if_necessary do
415
+ # log "@imap.uid_fetch #{uid}"
413
416
  @imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])[0]
414
417
  end
415
- d = {:mail => Mail.new(fetch_data.attr['RFC822']), :size => fetch_data.attr["RFC822.SIZE"]}
418
+ size = fetch_data.attr["RFC822.SIZE"]
419
+ mail = Mail.new(fetch_data.attr['RFC822'])
420
+ formatter = Vmail::MessageFormatter.new(mail)
421
+ message_text = <<-EOF
422
+ #{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
423
+ #{divider '-'}
424
+ #{format_headers(formatter.extract_headers)}
425
+
426
+ #{formatter.process_body}
427
+ EOF
416
428
  log "storing message_cache[[#{@mailbox}, #{uid}]]"
429
+ d = {:mail => mail, :size => size, :message_text => message_text}
417
430
  message_cache[[@mailbox, uid]] = d
418
- d
431
+ rescue
432
+ msg = "Error encountered parsing message index #{index} seqno #{seqno} uid #{uid}:\n#{$!}\n#{$!.backtrace.join("\n")}"
433
+ log msg
419
434
  end
420
435
 
421
436
  def prefetch_adjacent(index)
422
437
  Thread.new do
423
438
  [index + 1, index - 1].each do |idx|
424
- envelope_data = @message_list[idx]
425
- next unless envelope_data
426
- uid = envelope_data[:uid]
427
- fetch_and_cache(uid)
439
+ fetch_and_cache(idx)
428
440
  end
429
441
  end
430
442
  end
@@ -1,3 +1,3 @@
1
1
  module Vmail
2
- VERSION = "0.8.8"
2
+ VERSION = "0.8.9"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 8
8
- - 8
9
- version: 0.8.8
8
+ - 9
9
+ version: 0.8.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Choi