innodb_ruby 0.7.7 → 0.7.10
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/bin/innodb_space +52 -8
- data/lib/innodb/index.rb +41 -20
- data/lib/innodb/page/fsp_hdr_xdes.rb +40 -1
- data/lib/innodb/space.rb +68 -11
- data/lib/innodb/version.rb +1 -1
- metadata +27 -50
data/bin/innodb_space
CHANGED
@@ -229,6 +229,32 @@ def space_extents(space)
|
|
229
229
|
print_xdes_list(space.each_xdes)
|
230
230
|
end
|
231
231
|
|
232
|
+
def page_directory_summary(page)
|
233
|
+
puts "%-8s%-8s%-14s%-8s%s" % [
|
234
|
+
"slot",
|
235
|
+
"offset",
|
236
|
+
"type",
|
237
|
+
"owned",
|
238
|
+
"key",
|
239
|
+
]
|
240
|
+
|
241
|
+
page.directory.each_with_index do |offset, slot|
|
242
|
+
record = page.record(offset)
|
243
|
+
key = if [:conventional, :node_pointer].include? record[:header][:type]
|
244
|
+
if record[:key]
|
245
|
+
"(%s)" % record[:key].join(", ")
|
246
|
+
end
|
247
|
+
end
|
248
|
+
puts "%-8i%-8i%-14s%-8i%s" % [
|
249
|
+
slot,
|
250
|
+
offset,
|
251
|
+
record[:header][:type],
|
252
|
+
record[:header][:n_owned],
|
253
|
+
key,
|
254
|
+
]
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
232
258
|
def index_fseg_lists(index, fseg_name)
|
233
259
|
unless index.fseg(fseg_name)
|
234
260
|
raise "File segment '#{fseg_name}' doesn't exist"
|
@@ -362,8 +388,8 @@ Usage: innodb_space -f <file> [-p <page>] [-l <level>] <mode> [<mode>, ...]
|
|
362
388
|
Load the tablespace file <file>.
|
363
389
|
|
364
390
|
--page-size, -P <size>
|
365
|
-
Provide the page size (in KiB): 16
|
366
|
-
other than 16 may not work well, or at all.
|
391
|
+
Provide the page size, overriding auto-detection (in KiB): 16, 8, 4, 2, 1.
|
392
|
+
Page sizes other than 16 may not work well, or at all.
|
367
393
|
|
368
394
|
--page, -p <page>
|
369
395
|
Operate on the page <page>; may be specified more than once.
|
@@ -383,9 +409,6 @@ Usage: innodb_space -f <file> [-p <page>] [-l <level>] <mode> [<mode>, ...]
|
|
383
409
|
|
384
410
|
The following modes are supported:
|
385
411
|
|
386
|
-
page-dump
|
387
|
-
Dump the contents of the page, using the Ruby pp ("pretty-print") module.
|
388
|
-
|
389
412
|
space-summary
|
390
413
|
Summarize all pages within a tablespace. A starting page number can be
|
391
414
|
provided with the --page/-p argument.
|
@@ -421,6 +444,13 @@ The following modes are supported:
|
|
421
444
|
space-extents
|
422
445
|
Iterate through all extents, printing the extent descriptor bitmap.
|
423
446
|
|
447
|
+
page-dump
|
448
|
+
Dump the contents of a page, using the Ruby pp ("pretty-print") module.
|
449
|
+
|
450
|
+
page-directory-summary
|
451
|
+
Summarize the record contents of the page directory in a page. If a record
|
452
|
+
describer is available, the key of each record will be printed.
|
453
|
+
|
424
454
|
index-recurse
|
425
455
|
Recurse an index, starting at the root (which must be provided in the first
|
426
456
|
--page/-p argument), printing the node pages, node pointers (links), leaf
|
@@ -457,9 +487,12 @@ END_OF_USAGE
|
|
457
487
|
exit exit_code
|
458
488
|
end
|
459
489
|
|
490
|
+
Signal.trap("INT") { exit }
|
491
|
+
Signal.trap("PIPE") { exit }
|
492
|
+
|
460
493
|
@options = OpenStruct.new
|
461
494
|
@options.file = nil
|
462
|
-
@options.page_size =
|
495
|
+
@options.page_size = nil
|
463
496
|
@options.pages = []
|
464
497
|
@options.levels = []
|
465
498
|
@options.lists = []
|
@@ -525,9 +558,20 @@ ARGV.each do |mode|
|
|
525
558
|
usage 1, "Page numbers to dump must be provided with --page/-p"
|
526
559
|
end
|
527
560
|
|
528
|
-
@options.pages.each do |
|
529
|
-
space.page(
|
561
|
+
@options.pages.each do |page_number|
|
562
|
+
space.page(page_number).dump
|
530
563
|
end
|
564
|
+
when "page-directory-summary"
|
565
|
+
if @options.pages.empty?
|
566
|
+
usage 1, "Page numbers to dump must be provided with --page/-p"
|
567
|
+
end
|
568
|
+
|
569
|
+
page = space.page(@options.pages.first)
|
570
|
+
if page.type != :INDEX
|
571
|
+
usage 1, "Page must be an index page"
|
572
|
+
end
|
573
|
+
|
574
|
+
page_directory_summary(page)
|
531
575
|
when "space-summary"
|
532
576
|
space_summary(space, @options.pages.first || 0)
|
533
577
|
when "space-index-pages-summary"
|
data/lib/innodb/index.rb
CHANGED
@@ -187,10 +187,10 @@ class Innodb::Index
|
|
187
187
|
this_rec = cursor.record
|
188
188
|
|
189
189
|
if @debug
|
190
|
-
puts "linear_search_from_cursor:
|
191
|
-
this_rec && this_rec[:key].join(", "),
|
190
|
+
puts "linear_search_from_cursor: page=%i, level=%i, start=(%s)" % [
|
192
191
|
page.offset,
|
193
192
|
page.level,
|
193
|
+
this_rec && this_rec[:key].join(", "),
|
194
194
|
]
|
195
195
|
end
|
196
196
|
|
@@ -200,7 +200,9 @@ class Innodb::Index
|
|
200
200
|
@stats[:linear_search_from_cursor_record_scans] += 1
|
201
201
|
|
202
202
|
if @debug
|
203
|
-
puts "linear_search_from_cursor:
|
203
|
+
puts "linear_search_from_cursor: page=%i, level=%i, current=(%s)" % [
|
204
|
+
page.offset,
|
205
|
+
page.level,
|
204
206
|
this_rec && this_rec[:key].join(", "),
|
205
207
|
]
|
206
208
|
end
|
@@ -208,6 +210,10 @@ class Innodb::Index
|
|
208
210
|
# If we reach supremum, return the last non-system record we got.
|
209
211
|
return this_rec if next_rec[:header][:type] == :supremum
|
210
212
|
|
213
|
+
if compare_key(key, this_rec[:key]) < 0
|
214
|
+
return this_rec
|
215
|
+
end
|
216
|
+
|
211
217
|
if (compare_key(key, this_rec[:key]) >= 0) &&
|
212
218
|
(compare_key(key, next_rec[:key]) < 0)
|
213
219
|
# The desired key is either an exact match for this_rec or is greater
|
@@ -235,19 +241,21 @@ class Innodb::Index
|
|
235
241
|
|
236
242
|
return nil if dir.empty?
|
237
243
|
|
244
|
+
# Split the directory at the mid-point (using integer math, so the division
|
245
|
+
# is rounding down). Retrieve the record that sits at the mid-point.
|
246
|
+
mid = ((dir.size-1) / 2)
|
247
|
+
rec = page.record(dir[mid])
|
248
|
+
|
238
249
|
if @debug
|
239
|
-
puts "binary_search_by_directory: page=%i, level=%i, dir.size=%i" % [
|
250
|
+
puts "binary_search_by_directory: page=%i, level=%i, dir.size=%i, dir[%i]=(%s)" % [
|
240
251
|
page.offset,
|
241
252
|
page.level,
|
242
253
|
dir.size,
|
254
|
+
mid,
|
255
|
+
rec[:key] && rec[:key].join(", "),
|
243
256
|
]
|
244
257
|
end
|
245
258
|
|
246
|
-
# Split the directory at the mid-point (using integer math, so the division
|
247
|
-
# is rounding down). Retrieve the record that sits at the mid-point.
|
248
|
-
mid = dir.size / 2
|
249
|
-
rec = page.record(dir[mid])
|
250
|
-
|
251
259
|
# The mid-point record was the infimum record, which is not comparable with
|
252
260
|
# compare_key, so we need to just linear scan from here. If the mid-point
|
253
261
|
# is the beginning of the page there can't be many records left to check
|
@@ -264,18 +272,29 @@ class Innodb::Index
|
|
264
272
|
rec
|
265
273
|
when +1
|
266
274
|
# The mid-point record's key is less than the desired key.
|
267
|
-
if dir.size
|
268
|
-
# This is the last entry remaining from the directory, use linear
|
269
|
-
# search to find the record.
|
270
|
-
@stats[:binary_search_by_directory_linear_search] += 1
|
271
|
-
linear_search_from_cursor(page, page.record_cursor(rec[:offset]), key)
|
272
|
-
else
|
275
|
+
if dir.size > 2
|
273
276
|
# There are more entries remaining from the directory, recurse again
|
274
277
|
# using binary search on the right half of the directory, which
|
275
278
|
# represents values greater than or equal to the mid-point record's
|
276
279
|
# key.
|
277
280
|
@stats[:binary_search_by_directory_recurse_right] += 1
|
278
281
|
binary_search_by_directory(page, dir[mid...dir.size], key)
|
282
|
+
else
|
283
|
+
next_rec = page.record(dir[mid+1])
|
284
|
+
next_key = next_rec && compare_key(key, next_rec[:key])
|
285
|
+
if dir.size == 1 || next_key == -1 || next_key == 0
|
286
|
+
# This is the last entry remaining from the directory, or our key is
|
287
|
+
# greater than rec and less than rec+1's key. Use linear search to
|
288
|
+
# find the record starting at rec.
|
289
|
+
@stats[:binary_search_by_directory_linear_search] += 1
|
290
|
+
linear_search_from_cursor(page, page.record_cursor(rec[:offset]), key)
|
291
|
+
elsif next_key == +1
|
292
|
+
puts "+1"
|
293
|
+
@stats[:binary_search_by_directory_linear_search] += 1
|
294
|
+
linear_search_from_cursor(page, page.record_cursor(next_rec[:offset]), key)
|
295
|
+
else
|
296
|
+
nil
|
297
|
+
end
|
279
298
|
end
|
280
299
|
when -1
|
281
300
|
# The mid-point record's key is greater than the desired key.
|
@@ -304,10 +323,10 @@ class Innodb::Index
|
|
304
323
|
page = @root
|
305
324
|
|
306
325
|
if @debug
|
307
|
-
puts "linear_search:
|
308
|
-
key.join(", "),
|
326
|
+
puts "linear_search: root=%i, level=%i, key=(%s)" % [
|
309
327
|
page.offset,
|
310
328
|
page.level,
|
329
|
+
key.join(", "),
|
311
330
|
]
|
312
331
|
end
|
313
332
|
|
@@ -336,14 +355,16 @@ class Innodb::Index
|
|
336
355
|
page = @root
|
337
356
|
|
338
357
|
if @debug
|
339
|
-
puts "binary_search:
|
340
|
-
key.join(", "),
|
358
|
+
puts "binary_search: root=%i, level=%i, key=(%s)" % [
|
341
359
|
page.offset,
|
342
360
|
page.level,
|
361
|
+
key.join(", "),
|
343
362
|
]
|
344
363
|
end
|
345
364
|
|
346
|
-
|
365
|
+
# Remove supremum from the page directory, since nothing can be scanned
|
366
|
+
# linearly from there anyway.
|
367
|
+
while rec = binary_search_by_directory(page, page.directory[0...-1], key)
|
347
368
|
if page.level > 0
|
348
369
|
# If we haven't reached a leaf page yet, move down the tree and search
|
349
370
|
# again using binary search.
|
@@ -11,6 +11,45 @@ require "innodb/xdes"
|
|
11
11
|
# The basic structure of FSP_HDR and XDES pages is: FIL header, FSP header,
|
12
12
|
# an array of 256 XDES entries, empty (unused) space, and FIL trailer.
|
13
13
|
class Innodb::Page::FspHdrXdes < Innodb::Page
|
14
|
+
# A value added to the adjusted exponent stored in the page size field of
|
15
|
+
# the flags in the FSP header.
|
16
|
+
FLAGS_PAGE_SIZE_ADJUST = 9
|
17
|
+
|
18
|
+
# Read a given number of bits from an integer at a specific bit offset. The
|
19
|
+
# value returned is 0-based so does not need further shifting or adjustment.
|
20
|
+
def self.read_bits_at_offset(data, bits, offset)
|
21
|
+
((data & (((1 << bits) - 1) << offset)) >> offset)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Decode the "flags" field in the FSP header, returning a hash of useful
|
25
|
+
# decoded flags. Unfortunately, InnoDB has a fairly weird and broken
|
26
|
+
# implementation of these flags. The flags are:
|
27
|
+
#
|
28
|
+
# Offset Size Description
|
29
|
+
# 0 1 Page Format (redundant, compact). This is unfortunately
|
30
|
+
# coerced to 0 if it is "compact" and no other flags are
|
31
|
+
# set, making it useless to innodb_ruby.
|
32
|
+
# 1 4 Compressed Page Size (zip_size). This is stored as a
|
33
|
+
# power of 2, minus 9. Since 0 is reserved to mean "not
|
34
|
+
# compressed", the minimum value is 1, thus making the
|
35
|
+
# smallest page size 1024 (2 ** (9 + 1)).
|
36
|
+
# 5 1 Table Format (Antelope, Barracuda). This was supposed
|
37
|
+
# to reserve 6 bits, but due to a bug in InnoDB only
|
38
|
+
# actually reserved 1 bit.
|
39
|
+
#
|
40
|
+
def self.decode_flags(flags)
|
41
|
+
# The page size for compressed pages is stored at bit offset 1 and consumes
|
42
|
+
# 4 bits. Value 0 means the page is not compressed.
|
43
|
+
page_size = read_bits_at_offset(flags, 4, 1)
|
44
|
+
{
|
45
|
+
:compressed => page_size == 0 ? false : true,
|
46
|
+
:page_size => page_size == 0 ?
|
47
|
+
Innodb::Space::DEFAULT_PAGE_SIZE :
|
48
|
+
(1 << (FLAGS_PAGE_SIZE_ADJUST + page_size)),
|
49
|
+
:value => flags,
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
14
53
|
# The FSP header immediately follows the FIL header.
|
15
54
|
def pos_fsp_header
|
16
55
|
pos_fil_header + size_fil_header
|
@@ -42,7 +81,7 @@ class Innodb::Page::FspHdrXdes < Innodb::Page
|
|
42
81
|
:unused => c.get_uint32,
|
43
82
|
:size => c.get_uint32,
|
44
83
|
:free_limit => c.get_uint32,
|
45
|
-
:flags => c.get_uint32,
|
84
|
+
:flags => self.class.decode_flags(c.get_uint32),
|
46
85
|
:frag_n_used => c.get_uint32,
|
47
86
|
:free => Innodb::List::Xdes.new(@space,
|
48
87
|
Innodb::List.get_base_node(c)),
|
data/lib/innodb/space.rb
CHANGED
@@ -4,13 +4,20 @@ class Innodb::Space
|
|
4
4
|
# InnoDB's default page size is 16KiB.
|
5
5
|
DEFAULT_PAGE_SIZE = 16384
|
6
6
|
|
7
|
-
# Open a tablespace file, providing the page size to use. Pages
|
8
|
-
# 16 KiB may not be supported well.
|
9
|
-
def initialize(file, page_size=
|
7
|
+
# Open a tablespace file, optionally providing the page size to use. Pages
|
8
|
+
# that aren't 16 KiB may not be supported well.
|
9
|
+
def initialize(file, page_size=nil)
|
10
10
|
@file = File.open(file)
|
11
|
-
@page_size = page_size
|
12
11
|
@size = @file.stat.size
|
13
|
-
|
12
|
+
|
13
|
+
if page_size
|
14
|
+
@page_size = page_size
|
15
|
+
else
|
16
|
+
@page_size = fsp_flags[:page_size]
|
17
|
+
end
|
18
|
+
|
19
|
+
@pages = (@size / @page_size)
|
20
|
+
@compressed = fsp_flags[:compressed]
|
14
21
|
@record_describer = nil
|
15
22
|
end
|
16
23
|
|
@@ -27,6 +34,42 @@ class Innodb::Space
|
|
27
34
|
# The number of pages in the space.
|
28
35
|
attr_reader :pages
|
29
36
|
|
37
|
+
# Read the FSP header "flags" field by byte offset within the space file.
|
38
|
+
# This is useful in order to initialize the page size, as we can't properly
|
39
|
+
# read the FSP_HDR page before we know its size.
|
40
|
+
def raw_fsp_header_flags
|
41
|
+
# A simple sanity check. The FIL header should be initialized in page 0,
|
42
|
+
# to offset 0 and page type :FSP_HDR (8).
|
43
|
+
page_offset = BinData::Uint32be.read(read_at_offset(4, 4))
|
44
|
+
page_type = BinData::Uint16be.read(read_at_offset(24, 2))
|
45
|
+
unless page_offset == 0 && Innodb::Page::PAGE_TYPE[page_type] == :FSP_HDR
|
46
|
+
raise "Something is very wrong; Page 0 does not seem to be type FSP_HDR"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Another sanity check. The Space ID should be the same in both the FIL
|
50
|
+
# and FSP headers.
|
51
|
+
fil_space = BinData::Uint32be.read(read_at_offset(34, 4))
|
52
|
+
fsp_space = BinData::Uint32be.read(read_at_offset(38, 4))
|
53
|
+
unless fil_space == fsp_space
|
54
|
+
raise "Something is very wrong; FIL and FSP header Space IDs don't match"
|
55
|
+
end
|
56
|
+
|
57
|
+
# Well, we're as sure as we can be. Read the flags field and decode it.
|
58
|
+
flags_value = BinData::Uint32be.read(read_at_offset(54, 4))
|
59
|
+
Innodb::Page::FspHdrXdes.decode_flags(flags_value)
|
60
|
+
end
|
61
|
+
|
62
|
+
# The FSP header flags, decoded. If the page size has not been initialized,
|
63
|
+
# reach into the raw bytes of the FSP_HDR page and attempt to decode the
|
64
|
+
# flags field that way.
|
65
|
+
def fsp_flags
|
66
|
+
if @page_size
|
67
|
+
return fsp[:flags]
|
68
|
+
else
|
69
|
+
raw_fsp_header_flags
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
30
73
|
# The size (in bytes) of an extent.
|
31
74
|
def extent_size
|
32
75
|
1048576
|
@@ -48,14 +91,23 @@ class Innodb::Space
|
|
48
91
|
(0..(@pages / pages_per_xdes_page)).map { |n| n * pages_per_xdes_page }
|
49
92
|
end
|
50
93
|
|
51
|
-
# Get
|
52
|
-
def
|
94
|
+
# Get the raw byte buffer of size bytes at offset in the file.
|
95
|
+
def read_at_offset(offset, size)
|
96
|
+
@file.seek(offset)
|
97
|
+
@file.read(size)
|
98
|
+
end
|
99
|
+
|
100
|
+
# Get the raw byte buffer for a specific page by page number.
|
101
|
+
def page_data(page_number)
|
53
102
|
offset = page_number.to_i * page_size
|
54
103
|
return nil unless offset < @size
|
55
104
|
return nil unless (offset + page_size) <= @size
|
56
|
-
|
57
|
-
|
58
|
-
|
105
|
+
read_at_offset(offset, page_size)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Get an Innodb::Page object for a specific page by page number.
|
109
|
+
def page(page_number)
|
110
|
+
this_page = Innodb::Page.parse(self, page_data(page_number))
|
59
111
|
|
60
112
|
if this_page.type == :INDEX
|
61
113
|
this_page.record_describer = @record_describer
|
@@ -64,9 +116,14 @@ class Innodb::Space
|
|
64
116
|
this_page
|
65
117
|
end
|
66
118
|
|
119
|
+
# Get (and cache) the FSP header from the FSP_HDR page.
|
120
|
+
def fsp
|
121
|
+
@fsp ||= page(0).fsp_header
|
122
|
+
end
|
123
|
+
|
67
124
|
# Get an Innodb::List object for a specific list by list name.
|
68
125
|
def list(name)
|
69
|
-
|
126
|
+
fsp[name]
|
70
127
|
end
|
71
128
|
|
72
129
|
# Get an Innodb::Index object for a specific index by root page number.
|
data/lib/innodb/version.rb
CHANGED
metadata
CHANGED
@@ -1,48 +1,35 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: innodb_ruby
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.10
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 7
|
9
|
-
- 7
|
10
|
-
version: 0.7.7
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Jeremy Cole
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-01-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: bindata
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70135906385360 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 13
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 4
|
32
|
-
- 5
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 1.4.5
|
34
22
|
type: :runtime
|
35
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70135906385360
|
36
25
|
description: Library for parsing InnoDB data files in Ruby
|
37
26
|
email: jeremy@jcole.us
|
38
|
-
executables:
|
27
|
+
executables:
|
39
28
|
- innodb_log
|
40
29
|
- innodb_space
|
41
30
|
extensions: []
|
42
|
-
|
43
31
|
extra_rdoc_files: []
|
44
|
-
|
45
|
-
files:
|
32
|
+
files:
|
46
33
|
- README.md
|
47
34
|
- lib/innodb.rb
|
48
35
|
- lib/innodb/cursor.rb
|
@@ -65,37 +52,27 @@ files:
|
|
65
52
|
- bin/innodb_space
|
66
53
|
homepage: http://jcole.us/
|
67
54
|
licenses: []
|
68
|
-
|
69
55
|
post_install_message:
|
70
56
|
rdoc_options: []
|
71
|
-
|
72
|
-
require_paths:
|
57
|
+
require_paths:
|
73
58
|
- lib
|
74
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
60
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
|
80
|
-
|
81
|
-
- 0
|
82
|
-
version: "0"
|
83
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
66
|
none: false
|
85
|
-
requirements:
|
86
|
-
- -
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
|
89
|
-
segments:
|
90
|
-
- 0
|
91
|
-
version: "0"
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
92
71
|
requirements: []
|
93
|
-
|
94
72
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.8.
|
73
|
+
rubygems_version: 1.8.6
|
96
74
|
signing_key:
|
97
75
|
specification_version: 3
|
98
76
|
summary: InnoDB data file parser
|
99
77
|
test_files: []
|
100
|
-
|
101
78
|
has_rdoc:
|