e366b481049dd8145bfd35ed83cce34c7663402e
[migration-tools.git] / bibliofile / parse_db.pl
1 #!/usr/bin/perl -w
2
3 # Parses Bibliofile files.
4 # Usage: parse_db.pl TITLE.DB
5 # Works fine on TITLE.DB, but misses the boat on other files; probably different block sizes or something.
6
7 use strict;
8
9 $/ = undef;
10
11 my $startOfColumnTypes = 8;
12 my $startOfRealData = 4096;
13 my $blockSize = 4096;
14 my $initialOffset = 6;
15 my %dataTypes = (
16   'A' => 'Text',
17   'N' => 'Numeric',
18   'S' => 'Integer'
19 );
20
21 my $rowLength;
22 my @fieldLengths;
23 my @fieldNames;
24 my @fieldTypes;
25
26 my $db = $ARGV[0];
27 my $dbd = $db . "D";
28
29 open (DBD, $dbd);
30
31 while (<DBD>) {
32
33   my $data = $_;
34
35   $rowLength = ord substr($data, 0, 1);
36   #print "Row length: $rowLength\n";
37
38   my $numColumns = ord substr($data, 2, 1);
39   #print "Columns:    $numColumns\n";
40
41   my $namedata = substr($data, $startOfColumnTypes + ($numColumns * 7) - 2);
42   @fieldNames = split(/\x00/, $namedata);
43  
44   for (my $i = 0; $i < $numColumns; $i++) {
45     $fieldTypes[$i] = substr($data, ($i * 7) + $startOfColumnTypes, 1);
46     $fieldLengths[$i] = ord substr($data, ($i * 7) + $startOfColumnTypes + 1, 1);
47   }
48
49 }
50
51 close(DBD);
52
53 print join("\t", @fieldNames) . "\n";
54
55 open (DB, $db);
56
57 my $blocks = 0;
58
59 while (read DB, my $data, $blockSize) {
60   $blocks++;
61   next if ($blocks == 1);
62   my $maxRecords = int( $blockSize / $rowLength);
63   my $indexIndicator = ord substr($data, 7, 1);
64   next if ($indexIndicator == 0);
65
66 #  for (my $i = 1; $i <= scalar(@fieldLengths); $i++) {
67 #    print "Field $i has length $fieldLengths[$i-1]\n";
68 #  }
69
70   for (my $r = 0; $r < $maxRecords; $r++) {
71
72     my $pos = 0;
73     my @field;
74
75     for (my $f = 0; $f < scalar(@fieldLengths); $f++) {
76       $field[$f] = substr($data, $initialOffset + ($r * $rowLength) + $pos, $fieldLengths[$f]);
77       if ($fieldTypes[$f] eq 'S') { $field[$f] = ord $field[$f]; }
78       $pos += $fieldLengths[$f];
79     }
80
81     if ($field[0] =~ m/[^\x00]/) {
82       print join("\t", @field) . "\n";
83     }
84   }
85
86 }
87
88 close(DB);