innodb_ruby 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21b726dd85c361262f577f663a70b008acb56f45fc2a1632147bc94eb622141e
4
- data.tar.gz: 720eda759132e67b03c8bcd9c0e50a90625f3de214048e870875cb964bdd8bbe
3
+ metadata.gz: c2dd793281e3b83403e55c8d4e9104898d5df6099af80dd4453795a524e3fb32
4
+ data.tar.gz: d6ac28ab11759a618f9a84af611a705644f5f47f9c1cd387360b628bac88f527
5
5
  SHA512:
6
- metadata.gz: 1814840cf61fd850140e282ea2706c196563881e4de69e6612e890b8dcd6e9b93cd4dbc73c61d8c02fbc071c3e339223eea4d0af636ef00a4505ab1f143e207e
7
- data.tar.gz: 85b0326cc2b029ab24a493e1b781e4f9239533bff9b1849e67a4672493ce9775006a08004ce1a4d9aa724b0324354c67465cfcdfa3a722032c7c34f90822c6c1
6
+ metadata.gz: ffb5ba4b9805d4cb78aaecaec92adb4e6064d73a9349fbeb43fcc938b958adeb14f140747dd540f76d31bbf9a38fbde259bd99f3a9cc64f32a1456efc2006997
7
+ data.tar.gz: 9e98bd61fe4448fdbb15be66975581fe65d97c342685c21f2309ead8b0ed1fc217b08baf2855c336d8ea426e22b7c0556e0926064722e6cc23a95312a6a63ca4
data/bin/innodb_space CHANGED
@@ -6,6 +6,18 @@ require "ostruct"
6
6
  require "histogram/array"
7
7
  require "innodb"
8
8
 
9
+ class String
10
+ def squish!
11
+ gsub!(/[[:space:]]+/, " ")
12
+ strip!
13
+ self
14
+ end
15
+
16
+ def squish
17
+ dup.squish!
18
+ end
19
+ end
20
+
9
21
  # Convert a floating point RGB array into an ANSI color number approximating it.
10
22
  def rgb_to_ansi(rgb)
11
23
  rgb_n = rgb.map { |c| (c * 5.0).round }
@@ -1045,6 +1057,8 @@ def record_dump(page, record_offset)
1045
1057
  raise "Record at offset #{record_offset} not found" unless record
1046
1058
 
1047
1059
  record.dump
1060
+ rescue IOError
1061
+ raise "Record could not be read at offset #{record_offset}; is it a valid record offset?"
1048
1062
  end
1049
1063
 
1050
1064
  def record_history(page, record_offset)
@@ -1243,14 +1257,15 @@ Usage: innodb_space <options> <mode>
1243
1257
 
1244
1258
  Invocation examples:
1245
1259
 
1246
- innodb_space -s ibdata1 [-T tname [-I iname]] [options] <mode>
1247
- Use ibdata1 as the system tablespace and load the tname table (and the
1248
- iname index for modes that require it) from data located in the system
1249
- tablespace data dictionary. This will automatically generate a record
1250
- describer for any indexes.
1260
+ innodb_space -s ibdata1 [-T table-name [-I index-name [-R record-offset]]] [options] <mode>
1261
+ Use ibdata1 as the system tablespace and load the table-name table (and
1262
+ the index-name index for modes that require it) from data located in the
1263
+ system tablespace data dictionary. This will automatically generate a
1264
+ record describer for any indexes using the data dictionary.
1251
1265
 
1252
- innodb_space -f tname.ibd [-r ./desc.rb -d DescClass] [options] <mode>
1253
- Use the tname.ibd table (and the DescClass describer where required).
1266
+ innodb_space -f file-name.ibd [-r ./describer.rb -d DescriberClass] [options] <mode>
1267
+ Use the file-name.ibd tablespace file (and the DescriberClass describer
1268
+ where required) to read the tablespace structures or indexes.
1254
1269
 
1255
1270
  The following options are supported:
1256
1271
 
@@ -1269,11 +1284,22 @@ The following options are supported:
1269
1284
  files named 'ibdata?' which will then be sorted alphabetically and used to
1270
1285
  load the system tablespace.
1271
1286
 
1272
- --table-name, -T <name>
1273
- Use the table name <name>.
1287
+ If using the --system-space-file option, the following options may also
1288
+ be used:
1289
+
1290
+ --table-name, -T <name>
1291
+ Use the table name <name>.
1292
+
1293
+ --index-name, -I <name>
1294
+ Use the index name <name>.
1274
1295
 
1275
- --index-name, -I <name>
1276
- Use the index name <name>.
1296
+ --system-space-tables, -x
1297
+ Allow opening tables from the system space to support system spaces with
1298
+ tables created without innodb-file-per-table enabled.
1299
+
1300
+ --data-directory, -D <directory>
1301
+ Open per-table tablespace files from <directory> rather than from the
1302
+ directory where the system-space-file is located.
1277
1303
 
1278
1304
  --space-file, -f <file>
1279
1305
  Load the tablespace file <file>.
@@ -1281,6 +1307,9 @@ The following options are supported:
1281
1307
  --page, -p <page>
1282
1308
  Operate on the page <page>.
1283
1309
 
1310
+ --record, -R <offset>
1311
+ Operate on the record located at <offset> within the index page.
1312
+
1284
1313
  --level, -l <level>
1285
1314
  Operate on the level <level>.
1286
1315
 
@@ -1451,12 +1480,15 @@ END_OF_USAGE
1451
1480
  exit exit_code
1452
1481
  end
1453
1482
 
1454
- Signal.trap("INT") { exit }
1455
- Signal.trap("PIPE") { exit }
1483
+ %w[INT PIPE].each do |name|
1484
+ Signal.trap(name) { exit } if Signal.list.include?(name)
1485
+ end
1456
1486
 
1457
1487
  @options = OpenStruct.new
1458
1488
  @options.trace = 0
1459
1489
  @options.system_space_file = nil
1490
+ @options.system_space_tables = false
1491
+ @options.data_directory = nil
1460
1492
  @options.space_file = nil
1461
1493
  @options.table_name = nil
1462
1494
  @options.index_name = nil
@@ -1474,6 +1506,8 @@ getopt_options = [
1474
1506
  [ "--help", "-?", GetoptLong::NO_ARGUMENT ],
1475
1507
  [ "--trace", "-t", GetoptLong::NO_ARGUMENT ],
1476
1508
  [ "--system-space-file", "-s", GetoptLong::REQUIRED_ARGUMENT ],
1509
+ [ "--system-space-tables", "-x", GetoptLong::NO_ARGUMENT ],
1510
+ [ "--data-directory", "-D", GetoptLong::REQUIRED_ARGUMENT ],
1477
1511
  [ "--space-file", "-f", GetoptLong::REQUIRED_ARGUMENT ],
1478
1512
  [ "--table-name", "-T", GetoptLong::REQUIRED_ARGUMENT ],
1479
1513
  [ "--index-name", "-I", GetoptLong::REQUIRED_ARGUMENT ],
@@ -1499,6 +1533,10 @@ getopt.each do |opt, arg|
1499
1533
  @options.trace += 1
1500
1534
  when "--system-space-file"
1501
1535
  @options.system_space_file = arg.split(",")
1536
+ when "--system-space-tables"
1537
+ @options.system_space_tables = true
1538
+ when "--data-directory"
1539
+ @options.data_directory = arg
1502
1540
  when "--space-file"
1503
1541
  @options.space_file = arg.split(",")
1504
1542
  when "--table-name"
@@ -1529,11 +1567,24 @@ end
1529
1567
  # rubocop:disable Style/IfUnlessModifier
1530
1568
 
1531
1569
  unless @options.system_space_file || @options.space_file
1532
- usage 1, "System space file (-s) or space file (-f) must be specified"
1570
+ usage(1, "Either the --system-space-file (-s) or --space-file (-f) must be specified")
1533
1571
  end
1534
1572
 
1535
1573
  if @options.system_space_file && @options.space_file
1536
- usage 1, "Only one of system space or space file may be specified"
1574
+ usage(1, "Only one of --system-space-file (-s) or --space-file (-f) may be specified")
1575
+ end
1576
+
1577
+ system_space_options =
1578
+ @options.table_name || @options.index_name || @options.system_space_tables || @options.data_directory
1579
+
1580
+ if !@options.system_space_file && system_space_options
1581
+ usage(
1582
+ 1,
1583
+ %{
1584
+ The --table-name (-T), --index-name (-I), --system-space-tables (-x), and --data-directory (-D)
1585
+ options can only be used with the --system-space-file (-s) option
1586
+ }.squish
1587
+ )
1537
1588
  end
1538
1589
 
1539
1590
  BufferCursor.trace! if @options.trace > 1
@@ -1545,12 +1596,18 @@ index = nil
1545
1596
  page = nil
1546
1597
 
1547
1598
  if @options.system_space_file
1548
- innodb_system = Innodb::System.new(@options.system_space_file)
1599
+ innodb_system = Innodb::System.new(@options.system_space_file, data_directory: @options.data_directory)
1549
1600
  end
1550
1601
 
1551
1602
  if innodb_system && @options.table_name
1552
1603
  table_tablespace = innodb_system.space_by_table_name(@options.table_name)
1553
- space = table_tablespace || innodb_system.system_space
1604
+ if table_tablespace
1605
+ space = table_tablespace
1606
+ elsif @options.system_space_tables
1607
+ space = innodb_system.system_space
1608
+ else
1609
+ raise "Tablespace file not found and --system-space-tables (-x) is not enabled"
1610
+ end
1554
1611
  elsif @options.space_file
1555
1612
  space = Innodb::Space.new(@options.space_file)
1556
1613
  else
@@ -1580,39 +1637,57 @@ unless mode
1580
1637
  end
1581
1638
 
1582
1639
  if /^(system-|data-dictionary-)/.match(mode) && !innodb_system
1583
- usage(1, "System tablespace must be specified using -s/--system-space-file")
1640
+ usage(1, "System tablespace must be specified using --system-space-file (-s)")
1584
1641
  end
1585
1642
 
1586
1643
  if /^space-/.match(mode) && !space
1587
1644
  usage(
1588
1645
  1,
1589
- "Tablespace must be specified using either -f/--space-file " \
1590
- "or a combination of -s/--system-space-file and -T/--table"
1646
+ %{
1647
+ Tablespace must be specified using either --space-file (-f)
1648
+ or a combination of --system-space-file (-s) and --table (-T)
1649
+ }.squish
1591
1650
  )
1592
1651
  end
1593
1652
 
1594
1653
  if /^index-/.match(mode) && !index
1595
1654
  usage(
1596
1655
  1,
1597
- "Index must be specified using a combination of either -f/--space-file and -p/--page " \
1598
- "or -s/--system-space-file, -T/--table-name, and -I/--index-name"
1656
+ %{
1657
+ Index must be specified using a combination of either --space-file (-f) and --page (-p)
1658
+ or --system-space-file (-s), --table-name (-T), and --index-name (-I)
1659
+ }.squish
1599
1660
  )
1600
1661
  end
1601
1662
 
1602
1663
  if /^page-/.match(mode) && !page
1603
- usage(1, "Page number must be specified using -p/--page")
1664
+ usage(1, "Page number must be specified using --page (-p)")
1604
1665
  end
1605
1666
 
1606
1667
  if /^record-/.match(mode) && !@options.record
1607
- usage(1, "Record offset must be specified using -R/--record")
1668
+ usage(1, "Record offset must be specified using --record (-R)")
1669
+ end
1670
+
1671
+ if /^record-/.match(mode) && !page
1672
+ usage(
1673
+ 1,
1674
+ %{
1675
+ An index page must be available when using --record (-R); specify either
1676
+ --page (-p) or --table-name (-T) and --index-name (-I) for the index root page.
1677
+ }
1678
+ )
1679
+ end
1680
+
1681
+ if /^record-/.match(mode) && page.type != :INDEX
1682
+ usage(1, "Mode #{mode} may be used only with index pages")
1608
1683
  end
1609
1684
 
1610
1685
  if /-list-iterate$/.match(mode) && !@options.list
1611
- usage(1, "List name must be specified using -L/--list")
1686
+ usage(1, "List name must be specified using --list (-L)")
1612
1687
  end
1613
1688
 
1614
1689
  if /-level-/.match(mode) && !@options.level
1615
- usage(1, "Level must be specified using -l/--level")
1690
+ usage(1, "Level must be specified using --level (-l)")
1616
1691
  end
1617
1692
 
1618
1693
  if %w[
@@ -1621,13 +1696,13 @@ if %w[
1621
1696
  index-digraph
1622
1697
  index-level-summary
1623
1698
  ].include?(mode) && !index.record_describer
1624
- usage(1, "Record describer must be specified using -d/--describer")
1699
+ usage(1, "Record describer must be specified using --describer (-d)")
1625
1700
  end
1626
1701
 
1627
1702
  if %w[
1628
1703
  space-index-fseg-pages-summary
1629
1704
  ].include?(mode) && !@options.fseg_id
1630
- usage(1, "File segment id must be specified using -F/--fseg-id")
1705
+ usage(1, "File segment id must be specified using --fseg-id (-F)")
1631
1706
  end
1632
1707
 
1633
1708
  # rubocop:enable Style/IfUnlessModifier
data/lib/innodb/list.rb CHANGED
@@ -100,6 +100,11 @@ module Innodb
100
100
  @base.length
101
101
  end
102
102
 
103
+ # Is the list currently empty?
104
+ def empty?
105
+ length.zero?
106
+ end
107
+
103
108
  # Return the first object in the list using the list base node "first"
104
109
  # address pointer.
105
110
  def first
data/lib/innodb/system.rb CHANGED
@@ -19,7 +19,7 @@ module Innodb
19
19
  # The space ID of the system space, always 0.
20
20
  SYSTEM_SPACE_ID = 0
21
21
 
22
- def initialize(arg)
22
+ def initialize(arg, data_directory: nil)
23
23
  if arg.is_a?(Array) && arg.size > 1
24
24
  data_filenames = arg
25
25
  else
@@ -35,7 +35,7 @@ module Innodb
35
35
  @spaces = {}
36
36
  @orphans = []
37
37
  @config = {
38
- datadir: File.dirname(data_filenames.first),
38
+ data_directory: data_directory || File.dirname(data_filenames.first),
39
39
  }
40
40
 
41
41
  add_space_file(data_filenames)
@@ -70,7 +70,7 @@ module Innodb
70
70
  # Add a space by table name, constructing an appropriate filename
71
71
  # from the provided table name.
72
72
  def add_table(table_name)
73
- space_file = "%s/%s.ibd" % [config[:datadir], table_name]
73
+ space_file = "%s/%s.ibd" % [config[:data_directory], table_name]
74
74
  if File.exist?(space_file)
75
75
  add_space_file(space_file)
76
76
  else
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Innodb
4
- VERSION = "0.11.0"
4
+ VERSION = "0.12.0"
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.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Cole
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-07-17 00:00:00.000000000 Z
12
+ date: 2021-09-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bindata