File: ibd_convert.pl

package info (click to toggle)
mariadb 1%3A11.8.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 765,428 kB
  • sloc: ansic: 2,382,827; cpp: 1,803,532; asm: 378,315; perl: 63,176; sh: 46,496; pascal: 40,776; java: 39,363; yacc: 20,428; python: 19,506; sql: 17,864; xml: 12,463; ruby: 8,544; makefile: 6,059; cs: 5,855; ada: 1,700; lex: 1,193; javascript: 1,039; objc: 80; tcl: 73; awk: 46; php: 22
file content (45 lines) | stat: -rw-r--r-- 1,503 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# Convert tablespace flags to the format understood by MariaDB 10.1.0..10.1.20,
# with the assumption that the flags were correct.

sub convert_to_mariadb_101
{
    my ($file, $page_size) = @_;
    open(FILE, "+<", $file) or die "Unable to open $file\n";
    sysread(FILE, $_, $page_size)==$page_size||die "Unable to read $file\n";
    sysseek(FILE, 0, 0)||die "Unable to seek $file\n";

    # FIL_PAGE_DATA + FSP_SPACE_FLAGS = 38 + 16 = 54 bytes from the start
    my($flags) = unpack "x[54]N", $_;
    my $badflags = ($flags & 0x3f);
    my $compression_level=3;
    $badflags |= 1<<6|$compression_level<<7 if ($flags & 1 << 16);
    $badflags |= ($flags & 15 << 6) << 7; # PAGE_SSIZE

    if ($badflags != $flags)
    {
	warn "$file: changing $flags to $badflags\n";
	substr ($_, 54, 4) = pack("N", $badflags);
	# Compute and replace the innodb_checksum_algorithm=crc32 checksum
	my $polynomial = 0x82f63b78; # CRC-32C
	if ($page_size == 1024)
	{
	    # ROW_FORMAT=COMPRESSED
	    substr($_,0,4)=pack("N",
				mycrc32(substr($_, 4, 12), 0, $polynomial) ^
				mycrc32(substr($_, 24, 2), 0, $polynomial) ^
				mycrc32(substr($_, 34, $page_size - 34), 0,
					$polynomial));
	}
	else
	{
	    my $ck=pack("N",
			mycrc32(substr($_, 4, 22), 0, $polynomial) ^
			mycrc32(substr($_, 38, $page_size - 38 - 8), 0,
				$polynomial));
	    substr($_, 0, 4) = $ck;
	    substr ($_, $page_size - 8, 4) = $ck;
	}
	syswrite(FILE, $_, $page_size)==$page_size||die "Unable to write $file\n";
    }
    close(FILE);
}