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.

Direct Known Subclasses

BigHash::Collisions

Constant Summary

Constants inherited from ObjectBase

ObjectBase::NATIVE_CLASSES

Instance Attribute Summary collapse

Attributes inherited from ObjectBase

#_id, #myself, #store

Instance Method Summary collapse

Methods inherited from ObjectBase

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

Constructor Details

#initialize(p, arg1 = 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

  • arg1 (Integer or Array) (defaults to: 0)

    The requested size of the Array or an Array to initialize

  • default (Any) (defaults to: nil)

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



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/perobs/Array.rb', line 105

def initialize(p, arg1 = 0, default = nil)
  super(p)
  if arg1.is_a?(::Array)
    arg1.each { |v| _check_assignment_value(v) }
    @data = arg1.dup
  elsif block_given?
    @data = ::Array.new(arg1) do
      _check_assignment_value(yield)
    end
  else
    @data = ::Array.new(arg1, _check_assignment_value(default))
  end

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



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

def data
  @data
end

Instance Method Details

#[]=(*args) ⇒ Object

Proxy for the assignment method.



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

def []=(*args)
  if args.length == 2
    _check_assignment_value(args[1])
  else
    _check_assignment_value(args[2])
  end
  @store.cache.cache_write(self)
  @data.[]=(*args)
end

#_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.

Parameters:

  • id (Integer)

    targeted object ID



152
153
154
155
156
157
# File 'lib/perobs/Array.rb', line 152

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.

Parameters:

  • data (Array)

    the actual Array object



163
164
165
166
# File 'lib/perobs/Array.rb', line 163

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.

Returns:

  • (Array of Integer)

    IDs of referenced objects



143
144
145
146
147
# File 'lib/perobs/Array.rb', line 143

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

#inspectString

Textual dump for debugging purposes

Returns:

  • (String)


170
171
172
173
174
175
176
177
# File 'lib/perobs/Array.rb', line 170

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

#unshift(val) ⇒ Object

Proxy for the unshift method.



134
135
136
137
138
# File 'lib/perobs/Array.rb', line 134

def unshift(val)
  _check_assignment_value(val)
  @store.cache.cache_write(self)
  @data.unshift(val)
end