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