Module: Saseo::Persistence::Persistor

Extended by:
Persistor
Included in:
Persistor
Defined in:
lib/saseo/persistence/persistor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#loggerObject



25
26
27
# File 'lib/saseo/persistence/persistor.rb', line 25

def logger
  @logger ||= Logger.new(STDOUT)
end

Instance Method Details

#build_version(message) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/saseo/persistence/persistor.rb', line 40

def build_version(message)
  Saseo::Models::Version.new.tap do |version|

    version_attributes.each do |attr|
      version.send("#{attr}=", message.send(attr))
    end

    # ActiveRecord 3 doesn't handle jsonb columns properly
    version.old_data = message.old_data && Oj.dump(message.old_data)
    version.new_data = message.new_data && Oj.dump(message.new_data)
  end
end

#persist_message!(message) ⇒ Object



36
37
38
# File 'lib/saseo/persistence/persistor.rb', line 36

def persist_message!(message)
  save_version!(build_version(message))
end

#process(message) ⇒ Object



29
30
31
32
33
34
# File 'lib/saseo/persistence/persistor.rb', line 29

def process(message)
  logger.debug { "received source version for persistence: #{message.id}" }

  message = Saseo::Persistence::MessageFilter.filter_message!(message)
  persist_message!(message) if message
end

#save_version!(version) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/saseo/persistence/persistor.rb', line 53

def save_version!(version)
  if version.has_changes?
    begin
      version.save!
      logger.debug { "saved version: #{version.id}" }

    rescue ActiveRecord::RecordNotUnique => e
      logger.warn "Duplicate version: #{version.attributes}"
    rescue ActiveRecord::StatementInvalid => e
      if e.message.match /PG::ConnectionBad/
        logger.warn { 'Lost connection to DB, attempting to reconnect.' }
        Saseo::Models::Version.reconnect!
        retry
      end
    end
  else
    logger.info { "Skipped version with no changes: #{version.attributes}" }
  end
end

#version_attributesObject



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/saseo/persistence/persistor.rb', line 12

def version_attributes
  i[
      id
      transaction_id
      table_name
      item_id
      item_uuid
      action_timestamp
      action
      whodunnit
    ]
end