Sha256: 564d4a5c7d398449c0744ce41580868129b82ea3adb0fbe160cede519064c3e7

Contents?: true

Size: 1.75 KB

Versions: 8

Compression:

Stored size: 1.75 KB

Contents

# frozen_string_literal: true

module ActiveGraph
  module Transactions
    extend ActiveSupport::Concern

    included do
      thread_mattr_accessor :explicit_session, :tx, :last_bookmark
    end

    class_methods do
      def session(**session_config)
        ActiveGraph::Base.driver.session(**session_config) do |session|
          self.explicit_session = session
          yield session
        ensure
          self.last_bookmark = session.last_bookmark
        end
      end

      def write_transaction(**config, &block)
        send_transaction(:write_transaction, **config, &block)
      end

      def read_transaction(**config, &block)
        send_transaction(:read_transaction, **config, &block)
      end

      alias transaction write_transaction

      def lock_node(node)
        node.as(:n).query.remove('n._AGLOCK_').exec if tx&.open?
      end

      private

      def send_transaction(method, **config, &block)
        return yield tx if tx&.open?
        return run_transaction_work(explicit_session, method, **config, &block) if explicit_session&.open?
        driver.session do |session|
          run_transaction_work(session, method, **config, &block)
        end
      end

      def run_transaction_work(session, method, **config, &block)
        implicit = config.delete(:implicit)
        session.send(method, **config) do |tx|
          self.tx = tx
          block.call(tx).tap do |result|
            if implicit &&
              [Core::Result, ActiveGraph::Node::Query::QueryProxy, ActiveGraph::Core::Query]
                .any?(&result.method(:is_a?))
              result.store
            end
          end
        end.tap { tx.apply_callbacks }
      rescue ActiveGraph::Rollback
        # rollbacks are silently swallowed
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
activegraph-12.0.0.beta.5 lib/active_graph/transactions.rb
activegraph-12.0.0.beta.4 lib/active_graph/transactions.rb
activegraph-11.5.0.beta.3 lib/active_graph/transactions.rb
activegraph-12.0.0.beta.3 lib/active_graph/transactions.rb
activegraph-12.0.0.beta.2 lib/active_graph/transactions.rb
activegraph-11.5.0.beta.2 lib/active_graph/transactions.rb
activegraph-12.0.0.beta.1 lib/active_graph/transactions.rb
activegraph-11.5.0.beta.1 lib/active_graph/transactions.rb