1perl; 2 use strict; 3 my $path = "$ENV{'PATH_TO_TABLE'}"; 4 if ($path eq "") { die "No path given!"; } 5 my @found_files = glob($path . "*.MYD"); 6 if ($#found_files >= 0) { 7 print "found " . (1 + $#found_files) . " *.MYD file(s)\n"; 8 } 9 @found_files = glob($path . "*.ibd"); 10 if ($#found_files >= 0) { 11 print "found " . (1 + $#found_files) . " *.ibd file(s)\n"; 12 } 13 if (-e $path . ".par") { 14 print ".par file exists\n"; 15 } 16 my $frm_file = $path . ".frm"; 17 if (not -e $frm_file) { 18 die $frm_file . " does not file exists!"; 19 } 20 open(FH, "<", $frm_file) or die "Failed to open '$frm_file'"; 21 binmode FH; 22 my $bin_val; 23 seek(FH, 0x33, 0) or die "Failed to seek"; 24 my $res= read FH, $bin_val, 4; 25 die "Failed to read bin_val! res: $res" unless ($res == 4); 26 my $frm_ver = unpack("V", $bin_val); 27 if ($frm_ver >= 50708) { 28 print ".frm created by version >= 5.7.8\n"; 29 } else { 30 print ".frm created by version: $frm_ver\n"; 31 } 32 seek(FH, 3, 0) or die "Failed to seek"; 33 my $res= read FH, $bin_val, 1; 34 die "Failed to read bin_val! res: $res" unless ($res == 1); 35 print "DB_TYPE (byte 3): " . unpack("C", $bin_val) . "\n"; 36 seek(FH, 61, 0) or die "Failed to seek"; 37 $res= read FH, $bin_val, 1; 38 die "Failed to read bin_val! res: $res" unless ($res == 1); 39 print "DEFAULT_PART_DB_TYPE (byte 61): " . unpack("C", $bin_val) . "\n"; 40 # Also check the engine name 41 seek(FH, 55, 0) or die "Failed to seek"; 42 $res= read FH, $bin_val, 4; 43 my $length = unpack("V", $bin_val); 44 if ($length != 0) 45 { 46 # see from table.cc (reading .frm file) 47 seek(FH, 6, 0) or die "Failed to seek"; 48 $res= read FH, $bin_val, 2; 49 my $record_offset= unpack("v", $bin_val); 50 seek(FH, 14, 0) or die "Failed to seek"; 51 $res= read FH, $bin_val, 2; 52 my $tmp = unpack("v", $bin_val); 53 if ($tmp == 0xffff) 54 { 55 seek(FH, 47, 0) or die "Failed to seek"; 56 $res= read FH, $bin_val, 4; 57 $tmp= unpack("V", $bin_val); 58 } 59 $record_offset+= $tmp; 60 seek(FH, 16, 0) or die "Failed to seek"; 61 $res= read FH, $bin_val, 2; 62 $tmp = unpack("v", $bin_val); 63 $record_offset+= $tmp; 64 # connect string length + string 65 seek(FH, $record_offset, 0) or die "Failed to seek"; 66 $res= read FH, $bin_val, 2; 67 die "Failed to read bin_val! res: $res" unless ($res == 2); 68 $length= unpack("v", $bin_val); 69 seek(FH, $record_offset + 2 + $length, 0) or die "Failed to seek"; 70 $res= read FH, $bin_val, 2; 71 die "Failed to read bin_val! res: $res" unless ($res == 2); 72 $length= unpack("v", $bin_val); 73 $res= read FH, $bin_val, $length; 74 die "Failed to read bin_val! res: $res" unless ($res == $length); 75 print "DB_TYPE string: '" . $bin_val . "'\n"; 76 } 77 close(FH); 78EOF 79