innodb_ruby 0.9.8 → 0.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/AUTHORS.md +1 -0
- data/README.md +2 -0
- data/bin/innodb_space +81 -26
- data/lib/innodb/data_dictionary.rb +46 -3
- data/lib/innodb/fseg_entry.rb +8 -2
- data/lib/innodb/ibuf_bitmap.rb +50 -0
- data/lib/innodb/ibuf_index.rb +3 -0
- data/lib/innodb/index.rb +1 -0
- data/lib/innodb/page/blob.rb +1 -1
- data/lib/innodb/page/fsp_hdr_xdes.rb +31 -20
- data/lib/innodb/page/ibuf_bitmap.rb +47 -0
- data/lib/innodb/page/index.rb +2 -2
- data/lib/innodb/page/inode.rb +1 -1
- data/lib/innodb/page/sys.rb +3 -0
- data/lib/innodb/page/sys_data_dictionary_header.rb +1 -1
- data/lib/innodb/page/sys_ibuf_header.rb +45 -0
- data/lib/innodb/page/sys_rseg_header.rb +1 -1
- data/lib/innodb/page/trx_sys.rb +1 -1
- data/lib/innodb/page/undo_log.rb +1 -1
- data/lib/innodb/space.rb +72 -29
- data/lib/innodb/system.rb +34 -2
- data/lib/innodb/util/buffer_cursor.rb +7 -7
- data/lib/innodb/version.rb +1 -1
- data/lib/innodb/xdes.rb +3 -3
- data/lib/innodb.rb +3 -0
- metadata +6 -2
data/AUTHORS.md
CHANGED
data/README.md
CHANGED
@@ -15,3 +15,5 @@ Various parts of this library and the tools included may have wildly differing m
|
|
15
15
|
|
16
16
|
* Visit the [innodb_ruby mailing list on Google Groups](https://groups.google.com/d/forum/innodb_ruby) or email [innodb_ruby@googlegroups.com](mailto:innodb_ruby@googlegroups.com) — If you have questions about `innodb_ruby` or its usage.
|
17
17
|
* See the [RubyGems page for innodb_ruby](http://rubygems.org/gems/innodb_ruby) — Gem packaged releases are published regularly to RubyGems.org, which also provides online documentation.
|
18
|
+
|
19
|
+
[](https://travis-ci.org/jeremycole/innodb_ruby)
|
data/bin/innodb_space
CHANGED
@@ -178,6 +178,10 @@ def system_spaces(innodb_system)
|
|
178
178
|
next unless space
|
179
179
|
print_space_information.call(table_name, space)
|
180
180
|
end
|
181
|
+
|
182
|
+
innodb_system.each_orphan do |table_name|
|
183
|
+
puts "%-43s (orphan/tmp)" % table_name
|
184
|
+
end
|
181
185
|
end
|
182
186
|
|
183
187
|
# Print the contents of the SYS_TABLES data dictionary table.
|
@@ -451,13 +455,15 @@ end
|
|
451
455
|
# filled block colored based on the index the page is part of. Print a legend
|
452
456
|
# for the colors used afterwards.
|
453
457
|
def space_extents_illustrate(space)
|
458
|
+
width = space.pages_per_extent
|
454
459
|
puts
|
455
|
-
puts "%12s
|
460
|
+
puts "%12s ╭%-#{width}s╮" % [ "Start Page", "─" * width ]
|
456
461
|
|
457
462
|
identifiers = {}
|
463
|
+
count_by_identifier = Hash.new(0)
|
458
464
|
|
459
465
|
space.each_xdes do |entry|
|
460
|
-
puts "%12i
|
466
|
+
puts "%12i │%-#{width}s│" % [
|
461
467
|
entry.xdes[:start_page],
|
462
468
|
entry.each_page_status.inject("") { |bitmap, (page_number, page_status)|
|
463
469
|
if page_number < space.pages
|
@@ -473,7 +479,9 @@ def space_extents_illustrate(space)
|
|
473
479
|
if page.respond_to?(:index_id)
|
474
480
|
identifier = page.index_id
|
475
481
|
unless identifiers[identifier]
|
476
|
-
identifiers[identifier] =
|
482
|
+
identifiers[identifier] = (page.index_id == Innodb::IbufIndex::INDEX_ID) ?
|
483
|
+
"Insert Buffer Index" :
|
484
|
+
"Index #{page.index_id}"
|
477
485
|
if space.innodb_system
|
478
486
|
table, index = space.innodb_system.table_and_index_name_by_id(page.index_id)
|
479
487
|
if table && index
|
@@ -484,6 +492,11 @@ def space_extents_illustrate(space)
|
|
484
492
|
end
|
485
493
|
end
|
486
494
|
bitmap += filled_block(used_fraction, identifier)
|
495
|
+
if used_fraction != 0.0
|
496
|
+
count_by_identifier[identifier] += 1
|
497
|
+
else
|
498
|
+
count_by_identifier[:free] += 1
|
499
|
+
end
|
487
500
|
else
|
488
501
|
bitmap += " "
|
489
502
|
end
|
@@ -492,15 +505,33 @@ def space_extents_illustrate(space)
|
|
492
505
|
]
|
493
506
|
end
|
494
507
|
|
495
|
-
puts "%12s
|
508
|
+
puts "%12s ╰%-#{width}s╯" % [ "", "─" * width ]
|
496
509
|
|
497
510
|
puts
|
498
|
-
puts "Legend:"
|
499
|
-
puts " %
|
511
|
+
puts "Legend (%s = 1 page):" % [filled_block(1.0, nil)]
|
512
|
+
puts " %-62s %8s %8s" % [
|
513
|
+
"Page Type", "Pages", "Ratio"
|
514
|
+
]
|
515
|
+
puts " %s %-60s %8i %7.2f%%" % [
|
516
|
+
filled_block(1.0, nil),
|
517
|
+
"System",
|
518
|
+
count_by_identifier[nil],
|
519
|
+
100.0 * (count_by_identifier[nil].to_f / space.pages.to_f),
|
520
|
+
]
|
500
521
|
identifiers.sort.each do |identifier, description|
|
501
|
-
puts " %s %
|
522
|
+
puts " %s %-60s %8i %7.2f%%" % [
|
523
|
+
filled_block(1.0, identifier),
|
524
|
+
description,
|
525
|
+
count_by_identifier[identifier],
|
526
|
+
100.0 * (count_by_identifier[identifier].to_f / space.pages.to_f),
|
527
|
+
]
|
502
528
|
end
|
503
|
-
puts " %s %
|
529
|
+
puts " %s %-60s %8i %7.2f%%" % [
|
530
|
+
filled_block(0.0, nil),
|
531
|
+
"Free space",
|
532
|
+
count_by_identifier[:free],
|
533
|
+
100.0 * (count_by_identifier[:free].to_f / space.pages.to_f),
|
534
|
+
]
|
504
535
|
puts
|
505
536
|
end
|
506
537
|
|
@@ -572,7 +603,7 @@ def space_lsn_age_illustrate(space)
|
|
572
603
|
end
|
573
604
|
|
574
605
|
puts
|
575
|
-
puts "Legend:"
|
606
|
+
puts "Legend (%s = 1 page):" % [filled_block(1.0, nil)]
|
576
607
|
puts " %12s %s %-12s" % [
|
577
608
|
"Min LSN",
|
578
609
|
lsn_legend,
|
@@ -759,6 +790,7 @@ def page_illustrate(page)
|
|
759
790
|
blocks = Array.new(page.size, " ")
|
760
791
|
identifiers = {}
|
761
792
|
identifier_sort = 0
|
793
|
+
count_by_identifier = Hash.new(0)
|
762
794
|
|
763
795
|
page.each_region.sort { |a,b| a[:offset] <=> b[:offset]}.each do |region|
|
764
796
|
region[:length].times do |n|
|
@@ -782,6 +814,7 @@ def page_illustrate(page)
|
|
782
814
|
end
|
783
815
|
end
|
784
816
|
blocks[region[:offset] + n] = filled_block(fraction, identifier, BLOCK_CHARS_H)
|
817
|
+
count_by_identifier[identifier] += 1
|
785
818
|
end
|
786
819
|
end
|
787
820
|
|
@@ -795,14 +828,33 @@ def page_illustrate(page)
|
|
795
828
|
puts "%12s ╰%-#{width}s╯" % [ "", "─" * width ]
|
796
829
|
|
797
830
|
puts
|
798
|
-
puts "Legend:"
|
831
|
+
puts "Legend (%s = 1 byte):" % [filled_block(1.0, nil)]
|
832
|
+
puts " %-32s %8s %8s" % [
|
833
|
+
"Region Type",
|
834
|
+
"Bytes",
|
835
|
+
"Ratio",
|
836
|
+
]
|
799
837
|
identifiers.sort { |a,b| a[1] <=> b[1] }.each do |identifier, description|
|
800
|
-
puts " %s %
|
838
|
+
puts " %s %-30s %8i %7.2f%%" % [
|
801
839
|
filled_block(1.0, identifier),
|
802
|
-
description.gsub(/^<\d+>/, "")
|
840
|
+
description.gsub(/^<\d+>/, ""),
|
841
|
+
count_by_identifier[identifier],
|
842
|
+
100.0 * (count_by_identifier[identifier].to_f / page.size.to_f),
|
803
843
|
]
|
804
844
|
end
|
805
|
-
puts " %s %
|
845
|
+
puts " %s %-30s %8i %7.2f%%" % [
|
846
|
+
filled_block(0.0, nil),
|
847
|
+
"Garbage",
|
848
|
+
count_by_identifier[nil],
|
849
|
+
100.0 * (count_by_identifier[nil].to_f / page.size.to_f),
|
850
|
+
]
|
851
|
+
free_space = page.size - count_by_identifier.inject(0) { |sum,(k,v)| sum + v }
|
852
|
+
puts " %s %-30s %8i %7.2f%%" % [
|
853
|
+
" ",
|
854
|
+
"Free",
|
855
|
+
free_space,
|
856
|
+
100.0 * (free_space.to_f / page.size.to_f),
|
857
|
+
]
|
806
858
|
|
807
859
|
puts
|
808
860
|
end
|
@@ -969,6 +1021,11 @@ The following options are supported:
|
|
969
1021
|
--help, -?
|
970
1022
|
Print this usage text.
|
971
1023
|
|
1024
|
+
--trace, -t
|
1025
|
+
Enable tracing of all data read. Specify twice to enable even more
|
1026
|
+
tracing (including reads during opening of the tablespace) which can
|
1027
|
+
be quite noisy.
|
1028
|
+
|
972
1029
|
--system-space-file, -s <file>
|
973
1030
|
Load the system tablespace file <file> (normally ibdata1).
|
974
1031
|
|
@@ -997,10 +1054,6 @@ The following options are supported:
|
|
997
1054
|
--describer, -d <describer>
|
998
1055
|
Use the named record describer to parse records in index pages.
|
999
1056
|
|
1000
|
-
--page-size, -P <size>
|
1001
|
-
Provide the page size, overriding auto-detection (in KiB): 16, 8, 4, 2, 1.
|
1002
|
-
Page sizes other than 16 may not work well, or at all.
|
1003
|
-
|
1004
1057
|
The following modes are supported:
|
1005
1058
|
|
1006
1059
|
system-spaces
|
@@ -1129,6 +1182,7 @@ Signal.trap("INT") { exit }
|
|
1129
1182
|
Signal.trap("PIPE") { exit }
|
1130
1183
|
|
1131
1184
|
@options = OpenStruct.new
|
1185
|
+
@options.trace = 0
|
1132
1186
|
@options.system_space_file = nil
|
1133
1187
|
@options.space_file = nil
|
1134
1188
|
@options.table_name = nil
|
@@ -1136,7 +1190,6 @@ Signal.trap("PIPE") { exit }
|
|
1136
1190
|
@options.page = nil
|
1137
1191
|
@options.level = nil
|
1138
1192
|
@options.list = nil
|
1139
|
-
@options.page_size = nil
|
1140
1193
|
@options.describer = nil
|
1141
1194
|
|
1142
1195
|
getopt_options = [
|
@@ -1150,7 +1203,6 @@ getopt_options = [
|
|
1150
1203
|
[ "--level", "-l", GetoptLong::REQUIRED_ARGUMENT ],
|
1151
1204
|
[ "--list", "-L", GetoptLong::REQUIRED_ARGUMENT ],
|
1152
1205
|
[ "--require", "-r", GetoptLong::REQUIRED_ARGUMENT ],
|
1153
|
-
[ "--page-size", "-P", GetoptLong::REQUIRED_ARGUMENT ],
|
1154
1206
|
[ "--describer", "-d", GetoptLong::REQUIRED_ARGUMENT ],
|
1155
1207
|
]
|
1156
1208
|
|
@@ -1161,7 +1213,7 @@ getopt.each do |opt, arg|
|
|
1161
1213
|
when "--help"
|
1162
1214
|
usage 0
|
1163
1215
|
when "--trace"
|
1164
|
-
|
1216
|
+
@options.trace += 1
|
1165
1217
|
when "--system-space-file"
|
1166
1218
|
@options.system_space_file = arg
|
1167
1219
|
when "--space-file"
|
@@ -1178,11 +1230,6 @@ getopt.each do |opt, arg|
|
|
1178
1230
|
@options.list = arg.to_sym
|
1179
1231
|
when "--require"
|
1180
1232
|
require File.expand_path(arg)
|
1181
|
-
when "--page-size"
|
1182
|
-
unless [1, 2, 4, 8, 16].include?(arg.to_i)
|
1183
|
-
usage 1, "Page size #{arg} is not understood"
|
1184
|
-
end
|
1185
|
-
@options.page_size = arg.to_i * 1024
|
1186
1233
|
when "--describer"
|
1187
1234
|
@options.describer = arg
|
1188
1235
|
end
|
@@ -1196,6 +1243,10 @@ if @options.system_space_file and @options.space_file
|
|
1196
1243
|
usage 1, "Only one of system space or space file may be specified"
|
1197
1244
|
end
|
1198
1245
|
|
1246
|
+
if @options.trace > 1
|
1247
|
+
BufferCursor.trace!
|
1248
|
+
end
|
1249
|
+
|
1199
1250
|
innodb_system = nil
|
1200
1251
|
if @options.system_space_file
|
1201
1252
|
innodb_system = Innodb::System.new(@options.system_space_file)
|
@@ -1205,7 +1256,7 @@ space = innodb_system ? innodb_system.system_space : nil
|
|
1205
1256
|
if innodb_system and @options.table_name
|
1206
1257
|
space = innodb_system.space_by_table_name(@options.table_name)
|
1207
1258
|
elsif @options.space_file
|
1208
|
-
space = Innodb::Space.new(@options.space_file
|
1259
|
+
space = Innodb::Space.new(@options.space_file)
|
1209
1260
|
end
|
1210
1261
|
|
1211
1262
|
if @options.describer
|
@@ -1262,6 +1313,10 @@ if [
|
|
1262
1313
|
usage 1, "Record describer must be specified using -d/--describer"
|
1263
1314
|
end
|
1264
1315
|
|
1316
|
+
if @options.trace > 0
|
1317
|
+
BufferCursor.trace!
|
1318
|
+
end
|
1319
|
+
|
1265
1320
|
case mode
|
1266
1321
|
when "system-spaces"
|
1267
1322
|
system_spaces(innodb_system)
|
@@ -145,6 +145,7 @@ class Innodb::DataDictionary
|
|
145
145
|
:UNIVERSAL => 4,
|
146
146
|
:IBUF => 8,
|
147
147
|
:CORRUPT => 16,
|
148
|
+
:FTS => 32,
|
148
149
|
}
|
149
150
|
|
150
151
|
# A hash of INDEX_TYPE_FLAG keys by value.
|
@@ -228,6 +229,41 @@ class Innodb::DataDictionary
|
|
228
229
|
system_space.data_dictionary_page.data_dictionary_header[:indexes]
|
229
230
|
end
|
230
231
|
|
232
|
+
def data_dictionary_index_ids
|
233
|
+
if @data_dictionary_index_ids
|
234
|
+
return @data_dictionary_index_ids
|
235
|
+
end
|
236
|
+
|
237
|
+
@data_dictionary_index_ids = {}
|
238
|
+
data_dictionary_indexes.each do |table, indexes|
|
239
|
+
indexes.each do |index, root_page_number|
|
240
|
+
if root_page = system_space.page(root_page_number)
|
241
|
+
@data_dictionary_index_ids[root_page.index_id] = {
|
242
|
+
:table => table,
|
243
|
+
:index => index
|
244
|
+
}
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
@data_dictionary_index_ids
|
250
|
+
end
|
251
|
+
|
252
|
+
def data_dictionary_table?(table_name)
|
253
|
+
DATA_DICTIONARY_RECORD_DESCRIBERS.include?(table_name.to_sym)
|
254
|
+
end
|
255
|
+
|
256
|
+
def data_dictionary_index?(table_name, index_name)
|
257
|
+
return unless data_dictionary_table?(table_name)
|
258
|
+
DATA_DICTIONARY_RECORD_DESCRIBERS[table_name.to_sym].include?(index_name.to_sym)
|
259
|
+
end
|
260
|
+
|
261
|
+
def data_dictionary_index_describer(table_name, index_name)
|
262
|
+
return unless data_dictionary_index?(table_name, index_name)
|
263
|
+
|
264
|
+
DATA_DICTIONARY_RECORD_DESCRIBERS[table_name.to_sym][index_name.to_sym].new
|
265
|
+
end
|
266
|
+
|
231
267
|
# Return an Innodb::Index object initialized to the
|
232
268
|
# internal data dictionary index with an appropriate
|
233
269
|
# record describer so that records can be recursed.
|
@@ -241,10 +277,9 @@ class Innodb::DataDictionary
|
|
241
277
|
end
|
242
278
|
|
243
279
|
# If we have a record describer for this index, load it.
|
244
|
-
record_describer =
|
245
|
-
DATA_DICTIONARY_RECORD_DESCRIBERS[table_name][index_name]
|
280
|
+
record_describer = data_dictionary_index_describer(table_name, index_name)
|
246
281
|
|
247
|
-
system_space.index(index_root_page, record_describer
|
282
|
+
system_space.index(index_root_page, record_describer)
|
248
283
|
end
|
249
284
|
|
250
285
|
# Iterate through all data dictionary indexes, yielding the
|
@@ -605,6 +640,10 @@ class Innodb::DataDictionary
|
|
605
640
|
# Return an Innodb::RecordDescriber object describing records for a given
|
606
641
|
# index by table name and index name.
|
607
642
|
def record_describer_by_index_name(table_name, index_name)
|
643
|
+
if data_dictionary_index?(table_name, index_name)
|
644
|
+
return data_dictionary_index_describer(table_name, index_name)
|
645
|
+
end
|
646
|
+
|
608
647
|
unless index = index_by_name(table_name, index_name)
|
609
648
|
raise "Index #{index_name} for table #{table_name} not found"
|
610
649
|
end
|
@@ -632,6 +671,10 @@ class Innodb::DataDictionary
|
|
632
671
|
# Return an Innodb::RecordDescriber object describing the records
|
633
672
|
# in a given index by index ID.
|
634
673
|
def record_describer_by_index_id(index_id)
|
674
|
+
if dd_index = data_dictionary_index_ids[index_id]
|
675
|
+
return data_dictionary_index_describer(dd_index[:table], dd_index[:index])
|
676
|
+
end
|
677
|
+
|
635
678
|
unless index = index_by_id(index_id)
|
636
679
|
raise "Index #{index_id} not found"
|
637
680
|
end
|
data/lib/innodb/fseg_entry.rb
CHANGED
@@ -22,9 +22,15 @@ class Innodb::FsegEntry
|
|
22
22
|
# Return an INODE entry which represents this file segment.
|
23
23
|
def self.get_inode(space, cursor)
|
24
24
|
address = cursor.name("address") { get_entry_address(cursor) }
|
25
|
+
if address[:offset] == 0
|
26
|
+
return nil
|
27
|
+
end
|
28
|
+
|
25
29
|
page = space.page(address[:page_number])
|
26
|
-
if page.type
|
27
|
-
|
30
|
+
if page.type != :INODE
|
31
|
+
return nil
|
28
32
|
end
|
33
|
+
|
34
|
+
page.inode_at(page.cursor(address[:offset]))
|
29
35
|
end
|
30
36
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
class Innodb::IbufBitmap
|
4
|
+
BITS_PER_PAGE = 4
|
5
|
+
|
6
|
+
BITMAP_BV_FREE = 1 + 2
|
7
|
+
BITMAP_BV_BUFFERED = 4
|
8
|
+
BITMAP_BV_IBUF = 8
|
9
|
+
|
10
|
+
BITMAP_BV_ALL =
|
11
|
+
BITMAP_BV_FREE |
|
12
|
+
BITMAP_BV_BUFFERED |
|
13
|
+
BITMAP_BV_IBUF
|
14
|
+
|
15
|
+
def initialize(page, cursor)
|
16
|
+
@page = page
|
17
|
+
@bitmap = read_bitmap(page, cursor)
|
18
|
+
end
|
19
|
+
|
20
|
+
def size_bitmap
|
21
|
+
(@page.space.pages_per_bookkeeping_page * BITS_PER_PAGE) / 8
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_bitmap(page, cursor)
|
25
|
+
cursor.name("ibuf_bitmap") do |c|
|
26
|
+
c.get_bytes(size_bitmap)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def each_page_status
|
31
|
+
unless block_given?
|
32
|
+
return enum_for(:each_page_status)
|
33
|
+
end
|
34
|
+
|
35
|
+
bitmap = @bitmap.enum_for(:each_byte)
|
36
|
+
|
37
|
+
bitmap.each_with_index do |byte, byte_index|
|
38
|
+
(0..1).each do |page_offset|
|
39
|
+
page_number = (byte_index * 2) + page_offset
|
40
|
+
page_bits = ((byte >> (page_offset * BITS_PER_PAGE)) & BITMAP_BV_ALL)
|
41
|
+
page_status = {
|
42
|
+
:free => (page_bits & BITMAP_BV_FREE),
|
43
|
+
:buffered => (page_bits & BITMAP_BV_BUFFERED != 0),
|
44
|
+
:ibuf => (page_bits & BITMAP_BV_IBUF != 0),
|
45
|
+
}
|
46
|
+
yield page_number, page_status
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/innodb/index.rb
CHANGED
data/lib/innodb/page/blob.rb
CHANGED
@@ -17,40 +17,50 @@ class Innodb::Page::FspHdrXdes < Innodb::Page
|
|
17
17
|
|
18
18
|
# A value added to the adjusted exponent stored in the page size field of
|
19
19
|
# the flags in the FSP header.
|
20
|
-
|
20
|
+
FLAGS_PAGE_SIZE_SHIFT = 9
|
21
|
+
|
22
|
+
def self.shift_page_size(page_size_shifted)
|
23
|
+
if page_size_shifted != 0
|
24
|
+
(1 << (FLAGS_PAGE_SIZE_SHIFT + page_size_shifted))
|
25
|
+
end
|
26
|
+
end
|
21
27
|
|
22
28
|
# Decode the "flags" field in the FSP header, returning a hash of useful
|
23
|
-
#
|
24
|
-
# implementation of these flags. The flags are:
|
29
|
+
# decodings of the flags (based on MySQl 5.6 definitions). The flags are:
|
25
30
|
#
|
26
31
|
# Offset Size Description
|
27
|
-
# 0 1
|
28
|
-
# coerced to 0 if it is "compact" and no other flags are
|
29
|
-
# set, making it useless to innodb_ruby.
|
32
|
+
# 0 1 Post-Antelope Flag.
|
30
33
|
# 1 4 Compressed Page Size (zip_size). This is stored as a
|
31
34
|
# power of 2, minus 9. Since 0 is reserved to mean "not
|
32
35
|
# compressed", the minimum value is 1, thus making the
|
33
36
|
# smallest page size 1024 (2 ** (9 + 1)).
|
34
|
-
# 5 1
|
35
|
-
#
|
36
|
-
#
|
37
|
+
# 5 1 Atomic Blobs Flag.
|
38
|
+
# 6 4 System Page Size (innodb_page_size, UNIV_PAGE_SIZE).
|
39
|
+
# The setting of the system page size when the tablespace
|
40
|
+
# was created, stored in the same format as the compressed
|
41
|
+
# page size above.
|
42
|
+
# 10 1 Data Directory Flag.
|
37
43
|
#
|
38
44
|
def self.decode_flags(flags)
|
39
|
-
|
40
|
-
|
41
|
-
|
45
|
+
system_page_size =
|
46
|
+
shift_page_size(read_bits_at_offset(flags, 4, 6)) ||
|
47
|
+
Innodb::Space::DEFAULT_PAGE_SIZE
|
48
|
+
compressed_page_size = shift_page_size(read_bits_at_offset(flags, 4, 1))
|
49
|
+
|
42
50
|
{
|
43
|
-
:
|
44
|
-
:
|
45
|
-
|
46
|
-
|
51
|
+
:system_page_size => system_page_size,
|
52
|
+
:compressed => compressed_page_size ? false : true,
|
53
|
+
:page_size => compressed_page_size || system_page_size,
|
54
|
+
:post_antelope => read_bits_at_offset(flags, 1, 0) == 1,
|
55
|
+
:atomic_blogs => read_bits_at_offset(flags, 1, 5) == 1,
|
56
|
+
:data_directory => read_bits_at_offset(flags, 1, 10) == 1,
|
47
57
|
:value => flags,
|
48
58
|
}
|
49
59
|
end
|
50
60
|
|
51
61
|
# The FSP header immediately follows the FIL header.
|
52
62
|
def pos_fsp_header
|
53
|
-
|
63
|
+
pos_page_body
|
54
64
|
end
|
55
65
|
|
56
66
|
# The FSP header contains six 32-bit integers, one 64-bit integer, and 5
|
@@ -87,7 +97,7 @@ class Innodb::Page::FspHdrXdes < Innodb::Page
|
|
87
97
|
:unused => c.name("unused") { c.get_uint32 },
|
88
98
|
:size => c.name("size") { c.get_uint32 },
|
89
99
|
:free_limit => c.name("free_limit") { c.get_uint32 },
|
90
|
-
:flags => c.name("flags") {
|
100
|
+
:flags => c.name("flags") {
|
91
101
|
self.class.decode_flags(c.get_uint32)
|
92
102
|
},
|
93
103
|
:frag_n_used => c.name("frag_n_used") { c.get_uint32 },
|
@@ -155,11 +165,12 @@ class Innodb::Page::FspHdrXdes < Innodb::Page
|
|
155
165
|
})
|
156
166
|
|
157
167
|
each_xdes do |xdes|
|
168
|
+
state = xdes.state || "unused"
|
158
169
|
yield({
|
159
170
|
:offset => xdes.offset,
|
160
171
|
:length => size_xdes_entry,
|
161
|
-
:name =>
|
162
|
-
:info => "Extent Descriptor",
|
172
|
+
:name => "xdes_#{state}".to_sym,
|
173
|
+
:info => "Extent Descriptor (#{state})",
|
163
174
|
})
|
164
175
|
end
|
165
176
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
class Innodb::Page::IbufBitmap < Innodb::Page
|
4
|
+
extend ReadBitsAtOffset
|
5
|
+
|
6
|
+
def pos_ibuf_bitmap
|
7
|
+
pos_page_body
|
8
|
+
end
|
9
|
+
|
10
|
+
def size_ibuf_bitmap
|
11
|
+
(Innodb::IbufBitmap::BITS_PER_PAGE * space.pages_per_bookkeeping_page) / 8
|
12
|
+
end
|
13
|
+
|
14
|
+
def ibuf_bitmap
|
15
|
+
Innodb::IbufBitmap.new(self, cursor(pos_ibuf_bitmap))
|
16
|
+
end
|
17
|
+
|
18
|
+
def each_region
|
19
|
+
unless block_given?
|
20
|
+
return enum_for(:each_region)
|
21
|
+
end
|
22
|
+
|
23
|
+
super do |region|
|
24
|
+
yield region
|
25
|
+
end
|
26
|
+
|
27
|
+
yield({
|
28
|
+
:offset => pos_ibuf_bitmap,
|
29
|
+
:length => size_ibuf_bitmap,
|
30
|
+
:name => :ibuf_bitmap,
|
31
|
+
:info => "Insert Buffer Bitmap",
|
32
|
+
})
|
33
|
+
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def dump
|
38
|
+
super
|
39
|
+
|
40
|
+
puts "ibuf bitmap:"
|
41
|
+
ibuf_bitmap.each_page_status do |page_number, page_status|
|
42
|
+
puts " Page %i: %s" % [page_number, page_status.inspect]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Innodb::Page::SPECIALIZED_CLASSES[:IBUF_BITMAP] = Innodb::Page::IbufBitmap
|
data/lib/innodb/page/index.rb
CHANGED
@@ -73,7 +73,7 @@ class Innodb::Page::Index < Innodb::Page
|
|
73
73
|
# Return the byte offset of the start of the "index" page header, which
|
74
74
|
# immediately follows the "fil" header.
|
75
75
|
def pos_index_header
|
76
|
-
|
76
|
+
pos_page_body
|
77
77
|
end
|
78
78
|
|
79
79
|
# The size of the "index" header.
|
@@ -287,7 +287,7 @@ class Innodb::Page::Index < Innodb::Page
|
|
287
287
|
# 13 bits for heap_number
|
288
288
|
bits1 = c.name("bits1") { c.get_uint16 }
|
289
289
|
header[:type] = RECORD_TYPES[bits1 & 0x07]
|
290
|
-
header[:heap_number] = (bits1 &
|
290
|
+
header[:heap_number] = (bits1 & 0xfff8) >> 3
|
291
291
|
when :redundant
|
292
292
|
# The "next" pointer is an absolute offset within the page.
|
293
293
|
header[:next] = c.name("next") { c.get_uint16 }
|
data/lib/innodb/page/inode.rb
CHANGED
data/lib/innodb/page/sys.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require "innodb/page/sys_rseg_header"
|
4
4
|
require "innodb/page/sys_data_dictionary_header"
|
5
|
+
require "innodb/page/sys_ibuf_header"
|
5
6
|
|
6
7
|
# Another layer of indirection for pages of type SYS, as they have multiple
|
7
8
|
# uses within InnoDB. We'll override the self.handle method and check the
|
@@ -9,6 +10,8 @@ require "innodb/page/sys_data_dictionary_header"
|
|
9
10
|
class Innodb::Page::Sys < Innodb::Page
|
10
11
|
def self.handle(page, space, buffer)
|
11
12
|
case
|
13
|
+
when page.offset == 3
|
14
|
+
Innodb::Page::SysIbufHeader.new(space, buffer)
|
12
15
|
when page.offset == 7
|
13
16
|
Innodb::Page::SysDataDictionaryHeader.new(space, buffer)
|
14
17
|
when space.rseg_page?(page.offset)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
class Innodb::Page::SysIbufHeader < Innodb::Page
|
4
|
+
def pos_ibuf_header
|
5
|
+
pos_page_body
|
6
|
+
end
|
7
|
+
|
8
|
+
def size_ibuf_header
|
9
|
+
Innodb::FsegEntry::SIZE
|
10
|
+
end
|
11
|
+
|
12
|
+
def ibuf_header
|
13
|
+
cursor(pos_ibuf_header).name("ibuf_header") do |c|
|
14
|
+
{
|
15
|
+
:fseg => c.name("fseg") {
|
16
|
+
Innodb::FsegEntry.get_inode(space, c)
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def each_region
|
23
|
+
unless block_given?
|
24
|
+
return enum_for(:each_region)
|
25
|
+
end
|
26
|
+
|
27
|
+
super do |region|
|
28
|
+
yield region
|
29
|
+
end
|
30
|
+
|
31
|
+
yield({
|
32
|
+
:offset => pos_ibuf_header,
|
33
|
+
:length => size_ibuf_header,
|
34
|
+
:name => :ibuf_header,
|
35
|
+
:info => "Insert Buffer Header",
|
36
|
+
})
|
37
|
+
end
|
38
|
+
|
39
|
+
def dump
|
40
|
+
super
|
41
|
+
|
42
|
+
puts "ibuf header:"
|
43
|
+
pp ibuf_header
|
44
|
+
end
|
45
|
+
end
|
data/lib/innodb/page/trx_sys.rb
CHANGED
data/lib/innodb/page/undo_log.rb
CHANGED
data/lib/innodb/space.rb
CHANGED
@@ -22,18 +22,15 @@ class Innodb::Space
|
|
22
22
|
|
23
23
|
# Open a space file, optionally providing the page size to use. Pages
|
24
24
|
# that aren't 16 KiB may not be supported well.
|
25
|
-
def initialize(file
|
25
|
+
def initialize(file)
|
26
26
|
@file = File.open(file)
|
27
27
|
@size = @file.stat.size
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@page_size = fsp_flags[:page_size]
|
33
|
-
end
|
29
|
+
@system_page_size = fsp_flags[:system_page_size]
|
30
|
+
@page_size = fsp_flags[:page_size]
|
31
|
+
@compressed = fsp_flags[:compressed]
|
34
32
|
|
35
33
|
@pages = (@size / @page_size)
|
36
|
-
@compressed = fsp_flags[:compressed]
|
37
34
|
@innodb_system = nil
|
38
35
|
@record_describer = nil
|
39
36
|
end
|
@@ -45,6 +42,9 @@ class Innodb::Space
|
|
45
42
|
# this space.
|
46
43
|
attr_accessor :record_describer
|
47
44
|
|
45
|
+
# The system default page size (in bytes), equivalent to UNIV_PAGE_SIZE.
|
46
|
+
attr_reader :system_page_size
|
47
|
+
|
48
48
|
# The size (in bytes) of each page in the space.
|
49
49
|
attr_reader :page_size
|
50
50
|
|
@@ -83,18 +83,24 @@ class Innodb::Space
|
|
83
83
|
def raw_fsp_header_flags
|
84
84
|
# A simple sanity check. The FIL header should be initialized in page 0,
|
85
85
|
# to offset 0 and page type :FSP_HDR (8).
|
86
|
-
page_offset = BinData::Uint32be.read(read_at_offset(4, 4))
|
87
|
-
page_type = BinData::Uint16be.read(read_at_offset(24, 2))
|
86
|
+
page_offset = BinData::Uint32be.read(read_at_offset(4, 4)).to_i
|
87
|
+
page_type = BinData::Uint16be.read(read_at_offset(24, 2)).to_i
|
88
88
|
unless page_offset == 0 && Innodb::Page::PAGE_TYPE_BY_VALUE[page_type] == :FSP_HDR
|
89
|
-
raise "Something is very wrong; Page 0 does not seem to be type FSP_HDR"
|
89
|
+
raise "Something is very wrong; Page 0 does not seem to be type FSP_HDR; got page type %i but expected %i" % [
|
90
|
+
page_type,
|
91
|
+
Innodb::Page::PAGE_TYPE[:FSP_HDR][:value],
|
92
|
+
]
|
90
93
|
end
|
91
94
|
|
92
95
|
# Another sanity check. The Space ID should be the same in both the FIL
|
93
96
|
# and FSP headers.
|
94
|
-
fil_space = BinData::Uint32be.read(read_at_offset(34, 4))
|
95
|
-
fsp_space = BinData::Uint32be.read(read_at_offset(38, 4))
|
97
|
+
fil_space = BinData::Uint32be.read(read_at_offset(34, 4)).to_i
|
98
|
+
fsp_space = BinData::Uint32be.read(read_at_offset(38, 4)).to_i
|
96
99
|
unless fil_space == fsp_space
|
97
|
-
raise "Something is very wrong; FIL and FSP header Space IDs don't match"
|
100
|
+
raise "Something is very wrong; FIL and FSP header Space IDs don't match: FIL is %i but FSP is %i" % [
|
101
|
+
fil_space,
|
102
|
+
fsp_space,
|
103
|
+
]
|
98
104
|
end
|
99
105
|
|
100
106
|
# Well, we're as sure as we can be. Read the flags field and decode it.
|
@@ -113,30 +119,56 @@ class Innodb::Space
|
|
113
119
|
end
|
114
120
|
end
|
115
121
|
|
116
|
-
# The size (in bytes) of an extent.
|
117
|
-
def extent_size
|
118
|
-
1048576
|
119
|
-
end
|
120
|
-
|
121
122
|
# The number of pages per extent.
|
122
123
|
def pages_per_extent
|
123
|
-
|
124
|
+
# Note that uncompressed tables and compressed tables using the same page
|
125
|
+
# size will have a different number of pages per "extent" because InnoDB
|
126
|
+
# compression uses the FSP_EXTENT_SIZE define (which is then based on the
|
127
|
+
# UNIV_PAGE_SIZE define, which may be based on the innodb_page_size system
|
128
|
+
# variable) for compressed tables rather than something based on the actual
|
129
|
+
# compressed page size.
|
130
|
+
#
|
131
|
+
# For this reason, an "extent" differs in size as follows (the maximum page
|
132
|
+
# size supported for compressed tables is the innodb_page_size):
|
133
|
+
#
|
134
|
+
# innodb_page_size | innodb compression |
|
135
|
+
# page size | extent size | pages | page size | extent size | pages |
|
136
|
+
# 16384 | 1 MiB | 64 | 16384 | 1 MiB | 64 |
|
137
|
+
# | 8192 | 512 KiB | 64 |
|
138
|
+
# | 4096 | 256 KiB | 64 |
|
139
|
+
# | 2048 | 128 KiB | 64 |
|
140
|
+
# | 1024 | 64 KiB | 64 |
|
141
|
+
# 8192 | 1 MiB | 128 | 8192 | 1 MiB | 128 |
|
142
|
+
# | 4096 | 512 KiB | 128 |
|
143
|
+
# | 2048 | 256 KiB | 128 |
|
144
|
+
# | 1024 | 128 KiB | 128 |
|
145
|
+
# 4096 | 1 MiB | 256 | 4096 | 1 MiB | 256 |
|
146
|
+
# | 2048 | 512 KiB | 256 |
|
147
|
+
# | 1024 | 256 KiB | 256 |
|
148
|
+
#
|
149
|
+
|
150
|
+
1048576 / system_page_size
|
124
151
|
end
|
125
152
|
|
126
|
-
# The
|
127
|
-
|
128
|
-
|
129
|
-
page_size
|
153
|
+
# The size (in bytes) of an extent.
|
154
|
+
def extent_size
|
155
|
+
pages_per_extent * page_size
|
130
156
|
end
|
131
157
|
|
132
|
-
#
|
133
|
-
|
134
|
-
|
158
|
+
# The number of pages per FSP_HDR/XDES/IBUF_BITMAP page. This is crudely
|
159
|
+
# mapped to the page size, and works for pages down to 1KiB.
|
160
|
+
def pages_per_bookkeeping_page
|
161
|
+
page_size
|
135
162
|
end
|
136
163
|
|
137
164
|
# The FSP_HDR/XDES page which will contain the XDES entry for a given page.
|
138
165
|
def xdes_page_for_page(page_number)
|
139
|
-
page_number - (page_number %
|
166
|
+
page_number - (page_number % pages_per_bookkeeping_page)
|
167
|
+
end
|
168
|
+
|
169
|
+
# The IBUF_BITMAP page which will contain the bitmap entry for a given page.
|
170
|
+
def ibuf_bitmap_page_for_page(page_number)
|
171
|
+
page_number - (page_number % pages_per_bookkeeping_page) + 1
|
140
172
|
end
|
141
173
|
|
142
174
|
# The XDES entry offset for a given page within its FSP_HDR/XDES page's
|
@@ -343,6 +375,17 @@ class Innodb::Space
|
|
343
375
|
end
|
344
376
|
end
|
345
377
|
|
378
|
+
# An array of all FSP/XDES page numbers for the space.
|
379
|
+
def each_xdes_page_number
|
380
|
+
unless block_given?
|
381
|
+
return enum_for(:each_xdes_page_number)
|
382
|
+
end
|
383
|
+
|
384
|
+
0.step(pages - 1, pages_per_bookkeeping_page).each do |n|
|
385
|
+
yield n
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
346
389
|
# Iterate through all FSP_HDR/XDES pages, returning an Innodb::Page object
|
347
390
|
# for each one.
|
348
391
|
def each_xdes_page
|
@@ -350,9 +393,9 @@ class Innodb::Space
|
|
350
393
|
return enum_for(:each_xdes_page)
|
351
394
|
end
|
352
395
|
|
353
|
-
|
396
|
+
each_xdes_page_number do |page_number|
|
354
397
|
current_page = page(page_number)
|
355
|
-
yield current_page if current_page
|
398
|
+
yield current_page if current_page and [:FSP_HDR, :XDES].include?(current_page.type)
|
356
399
|
end
|
357
400
|
end
|
358
401
|
|
data/lib/innodb/system.rb
CHANGED
@@ -9,6 +9,9 @@ class Innodb::System
|
|
9
9
|
# A hash of spaces by space ID.
|
10
10
|
attr_reader :spaces
|
11
11
|
|
12
|
+
# Array of space names for which a space file was not found.
|
13
|
+
attr_reader :orphans
|
14
|
+
|
12
15
|
# The Innodb::DataDictionary for this system.
|
13
16
|
attr_reader :data_dictionary
|
14
17
|
|
@@ -17,6 +20,7 @@ class Innodb::System
|
|
17
20
|
|
18
21
|
def initialize(system_space_file)
|
19
22
|
@spaces = {}
|
23
|
+
@orphans = []
|
20
24
|
@config = {
|
21
25
|
:datadir => File.dirname(system_space_file),
|
22
26
|
}
|
@@ -47,10 +51,20 @@ class Innodb::System
|
|
47
51
|
add_space(space)
|
48
52
|
end
|
49
53
|
|
54
|
+
# Add an orphaned space.
|
55
|
+
def add_space_orphan(space_file)
|
56
|
+
orphans << space_file
|
57
|
+
end
|
58
|
+
|
50
59
|
# Add a space by table name, constructing an appropriate filename
|
51
60
|
# from the provided table name.
|
52
61
|
def add_table(table_name)
|
53
|
-
|
62
|
+
space_file = "%s/%s.ibd" % [config[:datadir], table_name]
|
63
|
+
if File.exist?(space_file)
|
64
|
+
add_space_file(space_file)
|
65
|
+
else
|
66
|
+
add_space_orphan(table_name)
|
67
|
+
end
|
54
68
|
end
|
55
69
|
|
56
70
|
# Return an Innodb::Space object for a given space ID, looking up
|
@@ -93,6 +107,19 @@ class Innodb::System
|
|
93
107
|
nil
|
94
108
|
end
|
95
109
|
|
110
|
+
# Iterate throught all orphaned spaces.
|
111
|
+
def each_orphan
|
112
|
+
unless block_given?
|
113
|
+
return enum_for(:each_orphan)
|
114
|
+
end
|
115
|
+
|
116
|
+
orphans.each do |space_name|
|
117
|
+
yield space_name
|
118
|
+
end
|
119
|
+
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
96
123
|
# Iterate through all column names by table name.
|
97
124
|
def each_column_name_by_table_name(table_name)
|
98
125
|
unless block_given?
|
@@ -150,7 +177,12 @@ class Innodb::System
|
|
150
177
|
|
151
178
|
# Return an array of the table name and index name given an index ID.
|
152
179
|
def table_and_index_name_by_id(index_id)
|
153
|
-
if
|
180
|
+
if dd_index = data_dictionary.data_dictionary_index_ids[index_id]
|
181
|
+
# This is a data dictionary index, which won't be found in the data
|
182
|
+
# dictionary itself.
|
183
|
+
[dd_index[:table], dd_index[:index]]
|
184
|
+
elsif index_record = data_dictionary.index_by_id(index_id)
|
185
|
+
# This is a system or user index.
|
154
186
|
[table_name_by_id(index_record["TABLE_ID"]), index_record["NAME"]]
|
155
187
|
end
|
156
188
|
end
|
@@ -250,49 +250,49 @@ class BufferCursor
|
|
250
250
|
def get_uint8(position=nil)
|
251
251
|
seek(position)
|
252
252
|
data = read_and_advance(1)
|
253
|
-
BinData::Uint8.read(data)
|
253
|
+
BinData::Uint8.read(data).to_i
|
254
254
|
end
|
255
255
|
|
256
256
|
# Read a big-endian unsigned 16-bit integer.
|
257
257
|
def get_uint16(position=nil)
|
258
258
|
seek(position)
|
259
259
|
data = read_and_advance(2)
|
260
|
-
BinData::Uint16be.read(data)
|
260
|
+
BinData::Uint16be.read(data).to_i
|
261
261
|
end
|
262
262
|
|
263
263
|
# Read a big-endian signed 16-bit integer.
|
264
264
|
def get_sint16(position=nil)
|
265
265
|
seek(position)
|
266
266
|
data = read_and_advance(2)
|
267
|
-
BinData::Int16be.read(data)
|
267
|
+
BinData::Int16be.read(data).to_i
|
268
268
|
end
|
269
269
|
|
270
270
|
# Read a big-endian unsigned 24-bit integer.
|
271
271
|
def get_uint24(position=nil)
|
272
272
|
seek(position)
|
273
273
|
data = read_and_advance(3)
|
274
|
-
BinData::Uint24be.read(data)
|
274
|
+
BinData::Uint24be.read(data).to_i
|
275
275
|
end
|
276
276
|
|
277
277
|
# Read a big-endian unsigned 32-bit integer.
|
278
278
|
def get_uint32(position=nil)
|
279
279
|
seek(position)
|
280
280
|
data = read_and_advance(4)
|
281
|
-
BinData::Uint32be.read(data)
|
281
|
+
BinData::Uint32be.read(data).to_i
|
282
282
|
end
|
283
283
|
|
284
284
|
# Read a big-endian unsigned 48-bit integer.
|
285
285
|
def get_uint48(position=nil)
|
286
286
|
seek(position)
|
287
287
|
data = read_and_advance(6)
|
288
|
-
BinData::Uint48be.read(data)
|
288
|
+
BinData::Uint48be.read(data).to_i
|
289
289
|
end
|
290
290
|
|
291
291
|
# Read a big-endian unsigned 64-bit integer.
|
292
292
|
def get_uint64(position=nil)
|
293
293
|
seek(position)
|
294
294
|
data = read_and_advance(8)
|
295
|
-
BinData::Uint64be.read(data)
|
295
|
+
BinData::Uint64be.read(data).to_i
|
296
296
|
end
|
297
297
|
|
298
298
|
# Read a big-endian unsigned integer given its size in bytes.
|
data/lib/innodb/version.rb
CHANGED
data/lib/innodb/xdes.rb
CHANGED
@@ -117,9 +117,9 @@ class Innodb::Xdes
|
|
117
117
|
bitmap = xdes[:bitmap].enum_for(:each_byte)
|
118
118
|
|
119
119
|
bitmap.each_with_index do |byte, byte_index|
|
120
|
-
(0..3).
|
121
|
-
page_number = xdes[:start_page] + (byte_index * 4) +
|
122
|
-
page_bits = ((byte >> (
|
120
|
+
(0..3).each do |page_offset|
|
121
|
+
page_number = xdes[:start_page] + (byte_index * 4) + page_offset
|
122
|
+
page_bits = ((byte >> (page_offset * BITS_PER_PAGE)) & BITMAP_BV_ALL)
|
123
123
|
page_status = {
|
124
124
|
:free => (page_bits & BITMAP_BV_FREE != 0),
|
125
125
|
:clean => (page_bits & BITMAP_BV_CLEAN != 0),
|
data/lib/innodb.rb
CHANGED
@@ -27,6 +27,7 @@ require "innodb/data_dictionary"
|
|
27
27
|
require "innodb/page"
|
28
28
|
require "innodb/page/blob"
|
29
29
|
require "innodb/page/fsp_hdr_xdes"
|
30
|
+
require "innodb/page/ibuf_bitmap"
|
30
31
|
require "innodb/page/inode"
|
31
32
|
require "innodb/page/index"
|
32
33
|
require "innodb/page/trx_sys"
|
@@ -38,6 +39,8 @@ require "innodb/space"
|
|
38
39
|
require "innodb/system"
|
39
40
|
require "innodb/history"
|
40
41
|
require "innodb/history_list"
|
42
|
+
require "innodb/ibuf_bitmap"
|
43
|
+
require "innodb/ibuf_index"
|
41
44
|
require "innodb/inode"
|
42
45
|
require "innodb/index"
|
43
46
|
require "innodb/log_record"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: innodb_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-09-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bindata
|
@@ -47,6 +47,8 @@ files:
|
|
47
47
|
- lib/innodb/fseg_entry.rb
|
48
48
|
- lib/innodb/history.rb
|
49
49
|
- lib/innodb/history_list.rb
|
50
|
+
- lib/innodb/ibuf_bitmap.rb
|
51
|
+
- lib/innodb/ibuf_index.rb
|
50
52
|
- lib/innodb/index.rb
|
51
53
|
- lib/innodb/inode.rb
|
52
54
|
- lib/innodb/list.rb
|
@@ -59,11 +61,13 @@ files:
|
|
59
61
|
- lib/innodb/page.rb
|
60
62
|
- lib/innodb/page/blob.rb
|
61
63
|
- lib/innodb/page/fsp_hdr_xdes.rb
|
64
|
+
- lib/innodb/page/ibuf_bitmap.rb
|
62
65
|
- lib/innodb/page/index.rb
|
63
66
|
- lib/innodb/page/index_compressed.rb
|
64
67
|
- lib/innodb/page/inode.rb
|
65
68
|
- lib/innodb/page/sys.rb
|
66
69
|
- lib/innodb/page/sys_data_dictionary_header.rb
|
70
|
+
- lib/innodb/page/sys_ibuf_header.rb
|
67
71
|
- lib/innodb/page/sys_rseg_header.rb
|
68
72
|
- lib/innodb/page/trx_sys.rb
|
69
73
|
- lib/innodb/page/undo_log.rb
|