1#!/usr/local/bin/perl 2 3# Name: dbinfo -- identify berkeley DB version used to create 4# a database file 5# 6# Author: Paul Marquess <Paul.Marquess@btinternet.com> 7# Version: 1.05 8# Date 1sh November 2003 9# 10# Copyright (c) 1998-2003 Paul Marquess. All rights reserved. 11# This program is free software; you can redistribute it and/or 12# modify it under the same terms as Perl itself. 13 14# Todo: Print more stats on a db file, e.g. no of records 15# add log/txn/lock files 16 17use strict ; 18 19my %Data = 20 ( 21 0x053162 => { 22 Type => "Btree", 23 Versions => 24 { 25 1 => [0, "Unknown (older than 1.71)"], 26 2 => [0, "Unknown (older than 1.71)"], 27 3 => [0, "1.71 -> 1.85, 1.86"], 28 4 => [0, "Unknown"], 29 5 => [0, "2.0.0 -> 2.3.0"], 30 6 => [0, "2.3.1 -> 2.7.7"], 31 7 => [0, "3.0.x"], 32 8 => [0, "3.1.x -> 4.0.x"], 33 9 => [1, "4.1.x or greater"], 34 } 35 }, 36 0x061561 => { 37 Type => "Hash", 38 Versions => 39 { 40 1 => [0, "Unknown (older than 1.71)"], 41 2 => [0, "1.71 -> 1.85"], 42 3 => [0, "1.86"], 43 4 => [0, "2.0.0 -> 2.1.0"], 44 5 => [0, "2.2.6 -> 2.7.7"], 45 6 => [0, "3.0.x"], 46 7 => [0, "3.1.x -> 4.0.x"], 47 8 => [1, "4.1.x or greater"], 48 } 49 }, 50 0x042253 => { 51 Type => "Queue", 52 Versions => 53 { 54 1 => [0, "3.0.x"], 55 2 => [0, "3.1.x"], 56 3 => [0, "3.2.x -> 4.0.x"], 57 4 => [1, "4.1.x or greater"], 58 } 59 }, 60 ) ; 61 62die "Usage: dbinfo file\n" unless @ARGV == 1 ; 63 64print "testing file $ARGV[0]...\n\n" ; 65open (F, "<$ARGV[0]") or die "Cannot open file $ARGV[0]: $!\n" ; 66 67my $buff ; 68read F, $buff, 30 ; 69 70 71my (@info) = unpack("NNNNNNC", $buff) ; 72my (@info1) = unpack("VVVVVVC", $buff) ; 73my ($magic, $version, $endian, $encrypt) ; 74 75if ($Data{$info[0]}) # first try DB 1.x format, big endian 76{ 77 $magic = $info[0] ; 78 $version = $info[1] ; 79 $endian = "Big Endian" ; 80 $encrypt = "Not Supported"; 81} 82elsif ($Data{$info1[0]}) # first try DB 1.x format, little endian 83{ 84 $magic = $info1[0] ; 85 $version = $info1[1] ; 86 $endian = "Little Endian" ; 87 $encrypt = "Not Supported"; 88} 89elsif ($Data{$info[3]}) # next DB 2.x big endian 90{ 91 $magic = $info[3] ; 92 $version = $info[4] ; 93 $endian = "Big Endian" ; 94} 95elsif ($Data{$info1[3]}) # next DB 2.x little endian 96{ 97 $magic = $info1[3] ; 98 $version = $info1[4] ; 99 $endian = "Little Endian" ; 100} 101else 102 { die "not a Berkeley DB database file.\n" } 103 104my $type = $Data{$magic} ; 105$magic = sprintf "%06X", $magic ; 106 107my $ver_string = "Unknown" ; 108 109if ( defined $type->{Versions}{$version} ) 110{ 111 $ver_string = $type->{Versions}{$version}[1]; 112 if ($type->{Versions}{$version}[0] ) 113 { $encrypt = $info[6] ? "Enabled" : "Disabled" } 114 else 115 { $encrypt = "Not Supported" } 116} 117 118print <<EOM ; 119File Type: Berkeley DB $type->{Type} file. 120File Version ID: $version 121Built with Berkeley DB: $ver_string 122Byte Order: $endian 123Magic: $magic 124Encryption: $encrypt 125EOM 126 127close F ; 128 129exit ; 130