class ObjectFramework::Persistence::UnitOfWork
Public Class Methods
Source
# File lib/object_framework/persistence/session.rb, line 25 def initialize(transaction:) @transaction, @entries = transaction, {}.compare_by_identity end
Public Instance Methods
Source
# File lib/object_framework/persistence/session.rb, line 65 def clear; @entries.clear; end
Source
# File lib/object_framework/persistence/session.rb, line 29 def entry(entity); @entries.fetch(entity); end
Source
# File lib/object_framework/persistence/session.rb, line 45 def flush @entries.values.each do |entry| entity, mapping = entry.entity, entry.mapping id = mapping.identity.reader.call(entity) raise InvalidInput, "Managed identity cannot change" unless entry.identity == id if entry.state == :deleted @transaction.delete(mapping.table, id) @entries.delete(entity) next end row = mapping.dump(entity, baseline: entry.baseline, loaded: entry.loaded) if entry.state == :new @transaction.insert(mapping.table, row) elsif row != entry.baseline @transaction.update(mapping.table, id, row) end entry.baseline, entry.state = row, :clean end end
Source
# File lib/object_framework/persistence/session.rb, line 36 def remove(entity) entry = @entries.fetch(entity) { raise InvalidInput, "Entity is not managed by this session" } if entry.state == :new @entries.delete(entity) else entry.state = :deleted end end
Source
# File lib/object_framework/persistence/session.rb, line 32 def track(entity, mapping:, baseline:, state: :clean) @entries[entity] ||= Entry.new(entity:, identity: Values.detach(mapping.identity.reader.call(entity)), mapping:, baseline:, state:, loaded: []) end
Source
# File lib/object_framework/persistence/session.rb, line 30 def tracked?(entity); @entries.key?(entity); end