Sha256: 1a5099ce5ae303b4db6b41fbc7734d7708acb335a7845a1a39672262b7051ddf

Contents?: true

Size: 1.57 KB

Versions: 3

Compression:

Stored size: 1.57 KB

Contents

require "imap/backup/serializer/imap"
require "imap/backup/serializer/mbox"
require "imap/backup/serializer/transaction"

module Imap; end

module Imap::Backup
  class Serializer::DelayedMetadataSerializer
    extend Forwardable

    attr_reader :serializer

    def_delegator :serializer, :uids

    def initialize(serializer:)
      @serializer = serializer
      @tsx = nil
    end

    def transaction(&block)
      tsx.fail_in_transaction!(:transaction, message: "nested transactions are not supported")

      tsx.begin({metadata: []}) do
        mbox.transaction do
          block.call

          commit
        end
      end
    end

    def append(uid, message, flags)
      tsx.fail_outside_transaction!(:append)
      mboxrd_message = Email::Mboxrd::Message.new(message)
      serialized = mboxrd_message.to_serialized
      tsx.data[:metadata] << {uid: uid, length: serialized.length, flags: flags}
      mbox.append(serialized)
    end

    private

    def commit
      # rubocop:disable Lint/RescueException
      imap.transaction do
        tsx.data[:metadata].each do |m|
          imap.append m[:uid], m[:length], flags: m[:flags]
        end
      rescue Exception => e
        Logger.logger.error "#{self.class} handling #{e.class}"
        imap.rollback
        raise e
      end
      # rubocop:enable Lint/RescueException
    end

    def mbox
      @mbox ||= Serializer::Mbox.new(serializer.folder_path)
    end

    def imap
      @imap ||= Serializer::Imap.new(serializer.folder_path)
    end

    def tsx
      @tsx ||= Serializer::Transaction.new(owner: self)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
imap-backup-11.1.0 lib/imap/backup/serializer/delayed_metadata_serializer.rb
imap-backup-11.1.0.rc1 lib/imap/backup/serializer/delayed_metadata_serializer.rb
imap-backup-11.0.1 lib/imap/backup/serializer/delayed_metadata_serializer.rb