innodb_ruby 0.9.11 → 0.9.12

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -13,7 +13,9 @@ Various parts of this library and the tools included may have wildly differing m
13
13
 
14
14
  # Resources #
15
15
 
16
+ * The [innodb_ruby wiki](https://github.com/jeremycole/innodb_ruby/wiki) contains some additional references and documentation to help you get started.
16
17
  * 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
18
  * 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
 
20
+
19
21
  [![Build Status](https://travis-ci.org/jeremycole/innodb_ruby.svg?branch=master)](https://travis-ci.org/jeremycole/innodb_ruby)
@@ -1100,8 +1100,12 @@ The following options are supported:
1100
1100
  tracing (including reads during opening of the tablespace) which can
1101
1101
  be quite noisy.
1102
1102
 
1103
- --system-space-file, -s <file>
1104
- Load the system tablespace file <file> (normally ibdata1).
1103
+ --system-space-file, -s <arg>
1104
+ Load the system tablespace file or files <arg>: Either a single file e.g.
1105
+ "ibdata1", a comma-delimited list of files e.g. "ibdata1,ibdata1", or a
1106
+ directory name. If a directory name is provided, it will be scanned for all
1107
+ files named "ibdata?" which will then be sorted alphabetically and used to
1108
+ load the system tablespace.
1105
1109
 
1106
1110
  --table-name, -T <name>
1107
1111
  Use the table name <name>.
@@ -1309,9 +1313,9 @@ getopt.each do |opt, arg|
1309
1313
  when "--trace"
1310
1314
  @options.trace += 1
1311
1315
  when "--system-space-file"
1312
- @options.system_space_file = arg
1316
+ @options.system_space_file = arg.split(",")
1313
1317
  when "--space-file"
1314
- @options.space_file = arg
1318
+ @options.space_file = arg.split(",")
1315
1319
  when "--table-name"
1316
1320
  @options.table_name = arg
1317
1321
  when "--index-name"
@@ -52,7 +52,7 @@ class Innodb::Page::FspHdrXdes < Innodb::Page
52
52
  :compressed => compressed_page_size ? false : true,
53
53
  :page_size => compressed_page_size || system_page_size,
54
54
  :post_antelope => read_bits_at_offset(flags, 1, 0) == 1,
55
- :atomic_blogs => read_bits_at_offset(flags, 1, 5) == 1,
55
+ :atomic_blobs => read_bits_at_offset(flags, 1, 5) == 1,
56
56
  :data_directory => read_bits_at_offset(flags, 1, 10) == 1,
57
57
  :value => flags,
58
58
  }
@@ -20,11 +20,39 @@ class Innodb::Space
20
20
  7 => :SYS,
21
21
  }
22
22
 
23
+ class DataFile
24
+ attr_reader :file
25
+ attr_reader :size
26
+ attr_reader :offset
27
+
28
+ def initialize(filename, offset)
29
+ @file = File.open(filename)
30
+ @size = @file.stat.size
31
+ @offset = offset
32
+ end
33
+
34
+ def name
35
+ prefix = ""
36
+ if File.extname(file.path) == ".ibd"
37
+ prefix = File.basename(File.dirname(file.path)) + "/"
38
+ end
39
+
40
+ prefix + File.basename(file.path)
41
+ end
42
+ end
43
+
23
44
  # Open a space file, optionally providing the page size to use. Pages
24
45
  # that aren't 16 KiB may not be supported well.
25
- def initialize(file)
26
- @file = File.open(file)
27
- @size = @file.stat.size
46
+ def initialize(filenames)
47
+ filenames = [filenames] unless filenames.is_a?(Array)
48
+
49
+ @data_files = []
50
+ @size = 0
51
+ filenames.each do |filename|
52
+ file = DataFile.new(filename, @size)
53
+ @size += file.size
54
+ @data_files << file
55
+ end
28
56
 
29
57
  @system_page_size = fsp_flags[:system_page_size]
30
58
  @page_size = fsp_flags[:page_size]
@@ -58,14 +86,7 @@ class Innodb::Space
58
86
  # to do anything which could instantiate a BufferCursor so that we can use
59
87
  # this method in cursor initialization.
60
88
  def name
61
- return @name if @name
62
-
63
- prefix = ""
64
- if File.extname(@file.path) == ".ibd"
65
- prefix = File.basename(File.dirname(@file.path)) + "/"
66
- end
67
-
68
- @name = prefix + File.basename(@file.path)
89
+ @name ||= @data_files.map { |f| f.name }.join(",")
69
90
  end
70
91
 
71
92
  def inspect
@@ -184,18 +205,25 @@ class Innodb::Space
184
205
  xdes_array[xdes_entry_for_page(page_number)]
185
206
  end
186
207
 
208
+ def data_file_for_offset(offset)
209
+ @data_files.each do |file|
210
+ return file if offset < file.size
211
+ offset -= file.size
212
+ end
213
+ nil
214
+ end
215
+
187
216
  # Get the raw byte buffer of size bytes at offset in the file.
188
217
  def read_at_offset(offset, size)
189
- @file.seek(offset)
190
- @file.read(size)
218
+ return nil unless offset < @size && (offset + size) <= @size
219
+ data_file = data_file_for_offset(offset)
220
+ data_file.file.seek(offset - data_file.offset)
221
+ data_file.file.read(size)
191
222
  end
192
223
 
193
224
  # Get the raw byte buffer for a specific page by page number.
194
225
  def page_data(page_number)
195
- offset = page_number.to_i * page_size
196
- return nil unless offset < @size
197
- return nil unless (offset + page_size) <= @size
198
- read_at_offset(offset, page_size)
226
+ read_at_offset(page_number * page_size, page_size)
199
227
  end
200
228
 
201
229
  # Get an Innodb::Page object for a specific page by page number.
@@ -18,14 +18,28 @@ class Innodb::System
18
18
  # The space ID of the system space, always 0.
19
19
  SYSTEM_SPACE_ID = 0
20
20
 
21
- def initialize(system_space_file)
21
+ def initialize(arg)
22
+ if arg.is_a?(Array) && arg.size > 1
23
+ data_filenames = arg
24
+ else
25
+ arg = arg.first if arg.is_a?(Array)
26
+ if File.directory?(arg)
27
+ data_filenames = Dir.glob(arg + "/ibdata?").sort
28
+ if data_filenames.empty?
29
+ raise "Couldn't find any ibdata files in #{arg}"
30
+ end
31
+ else
32
+ data_filenames = [arg]
33
+ end
34
+ end
35
+
22
36
  @spaces = {}
23
37
  @orphans = []
24
38
  @config = {
25
- :datadir => File.dirname(system_space_file),
39
+ :datadir => File.dirname(data_filenames.first),
26
40
  }
27
41
 
28
- add_space_file(system_space_file)
42
+ add_space_file(data_filenames)
29
43
 
30
44
  @data_dictionary = Innodb::DataDictionary.new(system_space)
31
45
  end
@@ -45,8 +59,8 @@ class Innodb::System
45
59
  end
46
60
 
47
61
  # Add a space by filename.
48
- def add_space_file(space_file)
49
- space = Innodb::Space.new(space_file)
62
+ def add_space_file(space_filenames)
63
+ space = Innodb::Space.new(space_filenames)
50
64
  space.innodb_system = self
51
65
  add_space(space)
52
66
  end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module Innodb
4
- VERSION = "0.9.11"
4
+ VERSION = "0.9.12"
5
5
  end
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.11
4
+ version: 0.9.12
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-09-29 00:00:00.000000000 Z
13
+ date: 2014-10-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bindata