Sha256: 43efd8993b8a051b4f0221870d9b4c2e7866b676a84eb9f392281d04b59c6784

Contents?: true

Size: 1.64 KB

Versions: 4

Compression:

Stored size: 1.64 KB

Contents

require "imap/backup/email/mboxrd/message"
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

          serializer.reload
        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.bytesize, 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

4 entries across 4 versions & 1 rubygems

Version Path
imap-backup-14.4.1 lib/imap/backup/serializer/delayed_metadata_serializer.rb
imap-backup-14.4.0 lib/imap/backup/serializer/delayed_metadata_serializer.rb
imap-backup-14.3.0 lib/imap/backup/serializer/delayed_metadata_serializer.rb
imap-backup-14.2.0 lib/imap/backup/serializer/delayed_metadata_serializer.rb