From: Rich Lane Date: Sat, 20 Jun 2009 20:50:02 +0000 (-0700) Subject: remove ferret entry from poll/sync interface X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=725fb08cd03332a3c80e8675d5261848188e5696;p=sup remove ferret entry from poll/sync interface This leads to an extra index lookup in the sup-sync update path, but I think it's worth it for the sake of API simplicity. --- diff --git a/bin/sup-sync b/bin/sup-sync index a759cbe..18a3cab 100755 --- a/bin/sup-sync +++ b/bin/sup-sync @@ -137,7 +137,7 @@ begin num_added = num_updated = num_scanned = num_restored = 0 last_info_time = start_time = Time.now - Redwood::PollManager.add_messages_from source, :force_overwrite => true do |m, offset, entry| + Redwood::PollManager.add_messages_from source, :force_overwrite => true do |m_old, m, offset| num_scanned += 1 seen[m.id] = true @@ -153,10 +153,10 @@ begin ## skip if we're operating only on changed messages, the message ## is in the index, and it's unchanged from what the source is ## reporting. - next if target == :changed && entry && entry[:source_id].to_i == source.id && entry[:source_info].to_i == offset + next if target == :changed && m_old && m_old.source.id == source.id && m_old.source_info == offset ## get the state currently in the index - index_state = entry[:label].symbolistize if entry + index_state = m_old.labels.dup if m_old ## skip if we're operating on restored messages, and this one ## ain't. @@ -196,7 +196,7 @@ begin puts "Adding message #{source}##{offset} from #{m.from} with state {#{m.labels * ', '}}" if opts[:verbose] num_added += 1 else - puts "Updating message #{source}##{offset}, source #{entry[:source_id]} => #{source.id}, offset #{entry[:source_info]} => #{offset}, state {#{index_state * ', '}} => {#{m.labels * ', '}}" if opts[:verbose] + puts "Updating message #{source}##{offset}, source #{m_old.source.id} => #{source.id}, offset #{m_old.source_info} => #{offset}, state {#{index_state * ', '}} => {#{m.labels * ', '}}" if opts[:verbose] num_updated += 1 end diff --git a/bin/sup-sync-back b/bin/sup-sync-back index 4f1387e..1c746d2 100755 --- a/bin/sup-sync-back +++ b/bin/sup-sync-back @@ -105,11 +105,11 @@ EOS num_dropped = num_moved = num_scanned = 0 out_fp = Tempfile.new "sup-sync-back-#{source.id}" - Redwood::PollManager.add_messages_from source do |m, offset, entry| + Redwood::PollManager.add_messages_from source do |m_old, m, offset| num_scanned += 1 - if entry - labels = entry[:label].symbolistize.to_boolean_h + if m_old + labels = m_old.labels if labels.member? :deleted if opts[:drop_deleted] diff --git a/lib/sup/index.rb b/lib/sup/index.rb index 09b41cf..c331dec 100644 --- a/lib/sup/index.rb +++ b/lib/sup/index.rb @@ -174,16 +174,10 @@ EOS ## Syncs the message to the index, replacing any previous version. adding ## either way. Index state will be determined by the message's #labels ## accessor. - ## - ## if need_load is false, docid and entry are assumed to be set to the - ## result of load_entry_for_id (which can be nil). - def sync_message m, need_load=true, docid=nil, entry=nil, opts={} - docid, entry = load_entry_for_id m.id if need_load + def sync_message m, opts={} + entry = @index[m.id] raise "no source info for message #{m.id}" unless m.source && m.source_info - @index_mutex.synchronize do - raise "trying to delete non-corresponding entry #{docid} with index message-id #{@index[docid][:message_id].inspect} and parameter message id #{m.id.inspect}" if docid && @index[docid][:message_id] != m.id - end source_id = if m.source.is_a? Integer m.source @@ -256,13 +250,9 @@ EOS } @index_mutex.synchronize do - @index.delete docid if docid + @index.delete m.id @index.add_document d end - - ## this hasn't been triggered in a long time. - ## docid, entry = load_entry_for_id m.id - ## raise "just added message #{m.id.inspect} but couldn't find it in a search" unless docid end def save_index fn=File.join(@dir, "ferret") @@ -391,7 +381,7 @@ EOS ## builds a message object from a ferret result def build_message docid @index_mutex.synchronize do - doc = @index[docid] + doc = @index[docid] or return source = @source_mutex.synchronize { @sources[doc[:source_id].to_i] } raise "invalid source #{doc[:source_id]}" unless source diff --git a/lib/sup/message.rb b/lib/sup/message.rb index ded577a..8a09ac8 100644 --- a/lib/sup/message.rb +++ b/lib/sup/message.rb @@ -288,6 +288,12 @@ EOS "Subject: #{@subj}"] end + def self.build_from_source source, source_info + m = Message.new :source => source, :source_info => source_info + m.load_from_source! + m + end + private ## here's where we handle decoding mime attachments. unfortunately diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb index 74f7d1c..bbad5f2 100644 --- a/lib/sup/poll.rb +++ b/lib/sup/poll.rb @@ -95,11 +95,11 @@ EOS num = 0 numi = 0 - add_messages_from source do |m, offset, entry| + add_messages_from source do |m_old, m, offset| ## always preserve the labels on disk. - m.labels = ((m.labels - [:unread, :inbox]) + entry[:label].symbolistize).uniq if entry + m.labels = ((m.labels - [:unread, :inbox]) + m_old.labels).uniq if m_old yield "Found message at #{offset} with labels {#{m.labels * ', '}}" - unless entry + unless m_old num += 1 from_and_subj << [m.from && m.from.longname, m.subj] if m.has_label?(:inbox) && ([:spam, :deleted, :killed] & m.labels).empty? @@ -138,29 +138,24 @@ EOS begin return if source.done? || source.has_errors? - source.each do |offset, labels| + source.each do |offset, default_labels| if source.has_errors? Redwood::log "error loading messages from #{source}: #{source.error.message}" return end - labels << :sent if source.uri.eql?(SentManager.source_uri) - labels.each { |l| LabelManager << l } - labels = labels + (source.archived? ? [] : [:inbox]) + m_new = Message.build_from_source source, offset + m_old = Index.build_message m_new.id - m = Message.new :source => source, :source_info => offset, :labels => labels - m.load_from_source! + m_new.labels = default_labels + (source.archived? ? [] : [:inbox]) + m_new.labels << :sent if source.uri.eql?(SentManager.source_uri) + m_new.labels.delete :unread if m_new.source_marked_read? + m_new.labels.each { |l| LabelManager << l } - if m.source_marked_read? - m.remove_label :unread - labels.delete :unread - end - - docid, entry = Index.load_entry_for_id m.id - HookManager.run "before-add-message", :message => m - m = yield(m, offset, entry) or next if block_given? - times = Index.sync_message m, false, docid, entry, opts - UpdateManager.relay self, :added, m unless entry + HookManager.run "before-add-message", :message => m_new + m_ret = yield(m_old, m_new, offset) or next if block_given? + Index.sync_message m_ret, opts + UpdateManager.relay self, :added, m_ret unless m_old end rescue SourceError => e Redwood::log "problem getting messages from #{source}: #{e.message}" diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb index e6ae856..b750d71 100644 --- a/lib/sup/sent.rb +++ b/lib/sup/sent.rb @@ -30,7 +30,7 @@ class SentManager def write_sent_message date, from_email, &block @source.store_message date, from_email, &block - PollManager.add_messages_from(@source) do |m, o, e| + PollManager.add_messages_from(@source) do |m_old, m, offset| m.remove_label :unread m end