Class: PEROBS::Array

Inherits:
ObjectBase show all
Defined in:
lib/perobs/Array.rb

Overview

An Array that is transparently persisted onto the back-end storage. It is very similar to the Ruby built-in Array class but like other PEROBS object classes it converts direct references to other PEROBS objects into POXReference objects that only indirectly reference the other object. It also tracks all reads and write to any Array element and updates the cache accordingly.

We don’t support an Array.initialize_copy proxy as this would conflict with BasicObject.initialize_copy. You can use PEROBS::Array.replace() instead.

Instance Attribute Summary collapse

Attributes inherited from ObjectBase

#_id, #myself, #store

Instance Method Summary collapse

Methods inherited from ObjectBase

#==, _finalize, #_initialize, #_restore, #_stash, #_sync, read, #restore

Constructor Details

#initialize(p, size = 0, default = nil) ⇒ Array

New PEROBS objects must always be created by calling # Store.new(). PEROBS users should never call this method or equivalents of derived methods directly.

Parameters:

  • p (PEROBS::Handle)

    PEROBS handle

  • size (Fixnum) (defaults to: 0)

    The requested size of the Array

  • default (Any) (defaults to: nil)

    The default value that is returned when no value is stored for a specific key.



86
87
88
89
90
91
92
# File 'lib/perobs/Array.rb', line 86

def initialize(p, size = 0, default = nil)
  super(p)
  @data = ::Array.new(size, default)

  # Ensure that the newly created object will be pushed into the database.
  @store.cache.cache_write(self)
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



44
45
46
# File 'lib/perobs/Array.rb', line 44

def data
  @data
end

Instance Method Details

#_delete_reference_to_id(id) ⇒ Object

This method should only be used during store repair operations. It will delete all referenced to the given object ID.

Parameters:

  • id (Fixnum/Bignum)

    targeted object ID



106
107
108
109
110
# File 'lib/perobs/Array.rb', line 106

def _delete_reference_to_id(id)
  @data.delete_if do |v|
    v && v.respond_to?(:is_poxreference?) && v.id == id
  end
end

#_deserialize(data) ⇒ Object

Restore the persistent data from a single data structure. This is a library internal method. Do not use outside of this library.

Parameters:

  • data (Array)

    the actual Array object



116
117
118
119
# File 'lib/perobs/Array.rb', line 116

def _deserialize(data)
  @data = data.map { |v| v.is_a?(POReference) ?
                     POXReference.new(@store, v.id) : v }
end

#_referenced_object_idsArray of Fixnum or Bignum

Return a list of all object IDs of all persistend objects that this Array is referencing.

Returns:

  • (Array of Fixnum or Bignum)

    IDs of referenced objects



97
98
99
100
101
# File 'lib/perobs/Array.rb', line 97

def _referenced_object_ids
  @data.each.select do |v|
    v && v.respond_to?(:is_poxreference?)
  end.map { |o| o.id }
end