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, #_transfer, 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.



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

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.



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

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 references to the given object ID.



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

def _delete_reference_to_id(id)
  @data.delete_if do |v|
    v && v.respond_to?(:is_poxreference?) && v.id == id
  end
  @store.cache.cache_write(self)
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.



118
119
120
121
# File 'lib/perobs/Array.rb', line 118

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

#_referenced_object_idsArray of Integer

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



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

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

#inspectString

Textual dump for debugging purposes



125
126
127
128
129
130
131
132
# File 'lib/perobs/Array.rb', line 125

def inspect
  "<#{self.class}:#{@_id}>\n[\n" +
  @data.map do |v|
    "  " + (v.respond_to?(:is_poxreference?) ?
            "<PEROBS::ObjectBase:#{v._id}>" : v.inspect)
  end.join(",\n") +
  "\n]\n"
end