Sha256: 9f72413ddbce57ae2adffa7f4c252b4641685e13c8451dddf8f124d0d7ef12e7

Contents?: true

Size: 1.1 KB

Versions: 2

Compression:

Stored size: 1.1 KB

Contents

module Asynchronic
  module DataStore
    class InMemory

      include Helper

      def self.connect(object_id)
        connections[object_id]
      end

      def self.connections
        @connections ||= {}
      end

      def initialize
        @hash = {}
        @mutex = Mutex.new
        @keys_mutex = {}
        self.class.connections[object_id] = self
      end

      def [](key)
        Marshal.load(hash[key.to_s]) if hash.key? key.to_s
      end

      def []=(key, value)
        mutex.synchronize { hash[key.to_s] = Marshal.dump(value) }
      end

      def delete(key)
        hash.delete key.to_s
      end

      def delete_cascade(key)
        keys.select { |k| k.sections.first == key }
            .each { |k| delete k }
      end

      def keys
        hash.keys.map { |k| Key[k] }
      end

      def synchronize(key, &block)
        mutex.synchronize do
          keys_mutex[key] ||= Mutex.new
        end
        keys_mutex[key].synchronize(&block)
      end

      def connection_args
        [object_id]
      end

      private

      attr_reader :hash, :mutex, :keys_mutex

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
asynchronic-4.0.3 lib/asynchronic/data_store/in_memory.rb
asynchronic-4.0.2 lib/asynchronic/data_store/in_memory.rb