8d41f0a5689bc6f330daf92ea2abda69dd16e350
[debian-cd-search.git] / find_file_db.pl
1 #!/usr/bin/perl -w
2 #
3 # find_file_db.pl
4 #
5 # Look through a provided database to find which CD/DVD image(s)
6 # contain a specified Debian package or source file.
7
8 # Copyright (c) 2011 Steve McIntyre <93sam@debian.org>
9
10 # This program is free software; you can redistribute it and/or modify
11 # it under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2 of the License, or
13 # (at your option) any later version.
14 #
15 # This program is distributed in the hope that it will be useful,
16 # but WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 # GNU General Public License for more details.
19 #
20 # You should have received a copy of the GNU General Public License
21 # along with this program; if not, write to the Free Software
22 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
23
24 use strict;
25 use DB_File;
26
27 my $dbdir = "/home/steve/debian/debian-cd/search/search-db";
28 my @AREAS;
29 my %num_files;
30 my %fileinfo;
31 my %imageinfo;
32 my @results;
33
34 # Borrowed from Ikiwiki.pm
35 sub glob2re ($) {
36     my $re=quotemeta(shift);
37     $re=~s/\\\*/.*/g;
38     $re=~s/\\\?/./g;
39     return qr/^$re$/i;
40 }
41
42 chdir($dbdir) || die "Failed to cd to $dbdir: $!\n";
43 opendir(my $dh, ".") || die "Failed to open $dbdir: $!\n";
44 while (defined($_ = readdir($dh))) {
45     m/(.*)\.db$/ and push (@AREAS, $1);
46 }
47 closedir($dh);
48
49 my $query_term = shift;
50
51 if (!defined($query_term) || !length($query_term)) {
52     die "No query term specified!\n";
53 }
54
55 my $re_search = glob2re($query_term);
56
57 foreach my $area (@AREAS) {
58     print "Looking in area $area\n";
59     my $db_file_name = "$dbdir/$area.db";
60     dbmopen(%fileinfo, "$db_file_name", 0000) || 
61         die "Failed to open db file: $!\n";
62     foreach my $file (keys %fileinfo) {
63         if ($file =~ $re_search) {
64             push(@results, "$file $fileinfo{$file}");
65         }
66     }
67     dbmclose %fileinfo;
68 }
69
70 my $count = scalar(@results);
71 print "$count results for \"$query_term\":\n";
72 foreach my $result (sort (@results)) {
73     my($found, @list) = split(' ', $result);
74     print "  $found:\n";
75     foreach my $image (sort(@list)) {
76         print "    $image\n";
77     }
78 }