class Innodb::Record

Attributes

page[R]
record[RW]

Public Class Methods

new(page, record) click to toggle source
# File lib/innodb/record.rb, line 12
def initialize(page, record)
  @page = page
  @record = record
end

Public Instance Methods

compare_key(other_key) click to toggle source

Compare two arrays of fields to determine if they are equal. This follows the same comparison rules as strcmp and others:

0 = a is equal to b
-1 = a is less than b
+1 = a is greater than b
# File lib/innodb/record.rb, line 103
def compare_key(other_key)
  Innodb::Stats.increment :compare_key

  return 0 if other_key.nil? && key.nil?
  return -1 if other_key.nil? || (!key.nil? && other_key.size < key.size)
  return +1 if key.nil? || (!other_key.nil? && other_key.size > key.size)

  key.each_index do |i|
    Innodb::Stats.increment :compare_key_field_comparison
    return -1 if other_key[i] < key[i].value
    return +1 if other_key[i] > key[i].value
  end

  0
end
dump() click to toggle source
# File lib/innodb/record.rb, line 119
def dump
  puts "Record at offset %i" % offset
  puts

  puts "Header:"
  puts "  %-20s: %i" % ["Next record offset", header.next]
  puts "  %-20s: %i" % ["Heap number", header.heap_number]
  puts "  %-20s: %s" % ["Type", header.type]
  puts "  %-20s: %s" % ["Deleted", header.deleted?]
  puts "  %-20s: %s" % ["Length", header.length]
  puts

  if page.leaf?
    puts "System fields:"
    puts "  Transaction ID: %s" % transaction_id
    puts "  Roll Pointer:"
    puts "    Undo Log: page %i, offset %i" % [
      roll_pointer.undo_log.page,
      roll_pointer.undo_log.offset,
    ]
    puts "    Rollback Segment ID: %i" % roll_pointer.rseg_id
    puts "    Insert: %s" % roll_pointer.is_insert
    puts
  end

  puts "Key fields:"
  key.each do |field|
    puts "  %s: %s" % [
      field.name,
      field.value.inspect,
    ]
  end
  puts

  if page.leaf?
    puts "Non-key fields:"
    row.each do |field|
      puts "  %s: %s" % [
        field.name,
        field.value.inspect,
      ]
    end
  else
    puts "Child page number: %i" % child_page_number
  end
  puts
end
each_undo_record() { |undo_record| ... } click to toggle source
# File lib/innodb/record.rb, line 64
def each_undo_record
  return enum_for(:each_undo_record) unless block_given?

  undo_record = undo
  while undo_record
    yield undo_record
    undo_record = undo_record.prev_by_history
  end

  nil
end
fields() click to toggle source
# File lib/innodb/record.rb, line 94
def fields
  @fields ||= uncached_fields
end
full_value_with_externs_for_field(field) click to toggle source
# File lib/innodb/record.rb, line 42
def full_value_with_externs_for_field(field)
  blob_value = field.value
  extern_page = field.extern && page.space.page(field.extern.page_number)
  while extern_page
    blob_value += extern_page.blob_data
    extern_page = extern_page.next_blob_page
  end
  blob_value
end
key_string() click to toggle source
# File lib/innodb/record.rb, line 34
def key_string
  key&.map { |r| "%s=%s" % [r.name, r.value.inspect] }&.join(", ")
end
row_string() click to toggle source
# File lib/innodb/record.rb, line 38
def row_string
  row&.map { |r| "%s=%s" % [r.name, r.value.inspect] }&.join(", ")
end
string() click to toggle source
# File lib/innodb/record.rb, line 76
def string
  if child_page_number
    "(%s) → #%s" % [key_string, child_page_number]
  else
    "(%s) → (%s)" % [key_string, row_string]
  end
end
uncached_fields() click to toggle source
# File lib/innodb/record.rb, line 84
def uncached_fields
  fields_hash = {}
  %i[key row].each do |group|
    record[group]&.each do |column|
      fields_hash[column.name] = column.value
    end
  end
  fields_hash
end
undo() click to toggle source
# File lib/innodb/record.rb, line 52
def undo
  return nil unless roll_pointer
  return unless (innodb_system = @page.space.innodb_system)

  undo_page = innodb_system.system_space.page(roll_pointer.undo_log.page)
  return unless undo_page

  new_undo_record = Innodb::UndoRecord.new(undo_page, roll_pointer.undo_log.offset)
  new_undo_record.index_page = page
  new_undo_record
end