summaryrefslogtreecommitdiff
path: root/cpan/DB_File/dbinfo
blob: b2dadbc9d90ee435158f88ff4cb9d13d83f3d0e9 (plain)
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/perl

# Name:         dbinfo -- identify berkeley DB version used to create
#                         a database file
#
# Author:       Paul Marquess  <pmqs@cpan.org>
# Version:      1.07
# Date          2nd April 2011
#
#     Copyright (c) 1998-2022 Paul Marquess. All rights reserved.
#     This program is free software; you can redistribute it and/or
#     modify it under the same terms as Perl itself.

# Todo: Print more stats on a db file, e.g. no of records
#       add log/txn/lock files

use strict ;

my %Data =
        (
        0x053162 =>     # DB_BTREEMAGIC
            {
                          Type     => "Btree",
                          Versions => # DB_BTREEVERSION
                                {
                                  1     => [0, "Unknown (older than 1.71)"],
                                  2     => [0, "Unknown (older than 1.71)"],
                                  3     => [0, "1.71 -> 1.85, 1.86"],
                                  4     => [0, "Unknown"],
                                  5     => [0, "2.0.0 -> 2.3.0"],
                                  6     => [0, "2.3.1 -> 2.7.7"],
                                  7     => [0, "3.0.x"],
                                  8     => [0, "3.1.x -> 4.0.x"],
                                  9     => [1, "4.1.x or greater"],
                                }
                        },
        0x061561 =>     # DB_HASHMAGIC
            {
                          Type     => "Hash",
                          Versions => # DB_HASHVERSION
                                {
                                  1     => [0, "Unknown (older than 1.71)"],
                                  2     => [0, "1.71 -> 1.85"],
                                  3     => [0, "1.86"],
                                  4     => [0, "2.0.0 -> 2.1.0"],
                                  5     => [0, "2.2.6 -> 2.7.7"],
                                  6     => [0, "3.0.x"],
                                  7     => [0, "3.1.x -> 4.0.x"],
                                  8     => [1, "4.1.x or greater"],
                                  9     => [1, "4.6.x or greater"],
                                }
                        },
        0x042253 =>     # DB_QAMMAGIC
            {
                          Type     => "Queue",
                          Versions => # DB_QAMVERSION
                                {
                                  1     => [0, "3.0.x"],
                                  2     => [0, "3.1.x"],
                                  3     => [0, "3.2.x -> 4.0.x"],
                                  4     => [1, "4.1.x or greater"],
                                }
                        },
        0x074582 => 	  # DB_HEAPMAGIC
            {
                          Type     => "Heap",
                          Versions => # DB_HEAPVERSION
                                {
                                  1	    => [1, "5.2.x"],
                                }
                        },
        ) ;

die "Usage: dbinfo file\n" unless @ARGV == 1 ;

print "testing file $ARGV[0]...\n\n" ;
open (F, "<$ARGV[0]") or die "Cannot open file $ARGV[0]: $!\n" ;

my $buff ;
read F, $buff, 30 ;


my (@info) = unpack("NNNNNNC", $buff) ;
my (@info1) = unpack("VVVVVVC", $buff) ;
my ($magic, $version, $endian, $encrypt) ;

if ($Data{$info[0]}) # first try DB 1.x format, big endian
{
    $magic = $info[0] ;
    $version = $info[1] ;
    $endian  = "Big Endian" ;
    $encrypt = "Not Supported";
}
elsif ($Data{$info1[0]}) # first try DB 1.x format, little endian
{
    $magic = $info1[0] ;
    $version = $info1[1] ;
    $endian  = "Little Endian" ;
    $encrypt = "Not Supported";
}
elsif ($Data{$info[3]}) # next DB 2.x big endian
{
    $magic = $info[3] ;
    $version = $info[4] ;
    $endian  = "Big Endian" ;
}
elsif ($Data{$info1[3]}) # next DB 2.x little endian
{
    $magic = $info1[3] ;
    $version = $info1[4] ;
    $endian  = "Little Endian" ;
}
else
  { die "not a Berkeley DB database file.\n" }

my $type = $Data{$magic} ;
$magic = sprintf "%06X", $magic ;

my $ver_string = "Unknown" ;

if ( defined $type->{Versions}{$version} )
{
     $ver_string = $type->{Versions}{$version}[1];
     if ($type->{Versions}{$version}[0] )
       { $encrypt = $info[6] ? "Enabled" : "Disabled" }
     else
       { $encrypt = "Not Supported" }
}

print <<EOM ;
File Type:              Berkeley DB $type->{Type} file.
File Version ID:        $version
Built with Berkeley DB: $ver_string
Byte Order:             $endian
Magic:                  $magic
Encryption:             $encrypt
EOM

close F ;

exit ;