Class: Innodb::Page::Inode

Inherits:
Innodb::Page show all
Defined in:
lib/innodb/page/inode.rb

Constant Summary

Constants inherited from Innodb::Page

PAGE_TYPE, PAGE_TYPE_BY_VALUE, UNDEFINED_PAGE_NUMBER

Instance Attribute Summary

Attributes inherited from Innodb::Page

#space

Instance Method Summary collapse

Methods inherited from Innodb::Page

#checksum_crc32, #checksum_crc32?, #checksum_innodb, #checksum_innodb?, #checksum_invalid?, #checksum_type, #checksum_valid?, #corrupt?, #cursor, #default_page_size?, #each_page_body_byte_as_uint8, #each_page_header_byte_as_uint8, #extent_descriptor?, #fil_header, #fil_trailer, handle, #in_doublewrite_buffer?, #initialize, #inspect, #inspect_header_fields, maybe_undefined, #misplaced?, #misplaced_offset?, #misplaced_space?, #name, page_type_by_value, parse, #pos_fil_header, #pos_fil_trailer, #pos_page_body, #pos_partial_page_header, register_specialization, #size, #size_fil_header, #size_fil_trailer, #size_page_body, #size_partial_page_header, specialization_for, specialization_for?, #torn?, undefined?

Constructor Details

This class inherits a constructor from Innodb::Page

Instance Method Details

#dumpObject

Dump the contents of a page for debugging purposes.



117
118
119
120
121
122
123
124
125
126
127
# File 'lib/innodb/page/inode.rb', line 117

def dump
  super

  puts "list entry:"
  pp list_entry
  puts

  puts "inodes:"
  each_inode(&:dump)
  puts
end

#each_allocated_inodeObject

Iterate through all allocated inodes in the inode array.



75
76
77
78
79
80
81
# File 'lib/innodb/page/inode.rb', line 75

def each_allocated_inode
  return enum_for(:each_allocated_inode) unless block_given?

  each_inode do |this_inode|
    yield this_inode if this_inode.allocated?
  end
end

#each_inodeObject

Iterate through all Inodes in the inode array.



63
64
65
66
67
68
69
70
71
72
# File 'lib/innodb/page/inode.rb', line 63

def each_inode
  return enum_for(:each_inode) unless block_given?

  inode_cursor = cursor(pos_inode_array)
  inodes_per_page.times do |n|
    inode_cursor.name("inode[#{n}]") do |c|
      yield Innodb::Inode.new_from_cursor(@space, c)
    end
  end
end

#each_region {|Region.new( offset: pos_list_entry, length: size_list_entry, name: :list_entry, info: "Inode List Entry" )| ... } ⇒ Object

Yields:



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/innodb/page/inode.rb', line 83

def each_region(&block)
  return enum_for(:each_region) unless block_given?

  super

  yield Region.new(
    offset: pos_list_entry,
    length: size_list_entry,
    name: :list_entry,
    info: "Inode List Entry"
  )

  each_inode do |inode|
    if inode.allocated?
      yield Region.new(
        offset: inode.offset,
        length: Innodb::Inode::SIZE,
        name: :inode_used,
        info: "Inode (used)"
      )
    else
      yield Region.new(
        offset: inode.offset,
        length: Innodb::Inode::SIZE,
        name: :inode_free,
        info: "Inode (free)"
      )
    end
  end

  nil
end

#inode_at(cursor) ⇒ Object

Read a single Inode entry from the provided byte offset by creating a cursor and reading the inode using the inode method.



58
59
60
# File 'lib/innodb/page/inode.rb', line 58

def inode_at(cursor)
  cursor.name("inode[#{cursor.position}]") { |c| Innodb::Inode.new_from_cursor(@space, c) }
end

#inodes_per_pageObject

The number of Inode entries that fit on a page.



31
32
33
# File 'lib/innodb/page/inode.rb', line 31

def inodes_per_page
  (size - pos_inode_array - 10) / Innodb::Inode::SIZE
end

#list_entryObject

Return the list entry.



40
41
42
# File 'lib/innodb/page/inode.rb', line 40

def list_entry
  cursor(pos_list_entry).name("list") { |c| Innodb::List.get_node(c) }
end

#next_addressObject

Return the “next” address pointer from the list entry. This is used by Innodb::List::Inode to iterate through Inode lists.



52
53
54
# File 'lib/innodb/page/inode.rb', line 52

def next_address
  list_entry.next
end

#pos_inode_arrayObject

Return the byte offset of the Inode array in the page, which immediately follows the list entry.



26
27
28
# File 'lib/innodb/page/inode.rb', line 26

def pos_inode_array
  pos_list_entry + size_list_entry
end

#pos_list_entryObject

Return the byte offset of the list node, which immediately follows the FIL header.



15
16
17
# File 'lib/innodb/page/inode.rb', line 15

def pos_list_entry
  pos_page_body
end

#prev_addressObject

Return the “previous” address pointer from the list entry. This is used by Innodb::List::Inode to iterate through Inode lists.



46
47
48
# File 'lib/innodb/page/inode.rb', line 46

def prev_address
  list_entry.prev
end

#size_inode_arrayObject



35
36
37
# File 'lib/innodb/page/inode.rb', line 35

def size_inode_array
  inodes_per_page * Innodb::Inode::SIZE
end

#size_list_entryObject

Return the size of the list node.



20
21
22
# File 'lib/innodb/page/inode.rb', line 20

def size_list_entry
  Innodb::List::NODE_SIZE
end