]> git.donarmstrong.com Git - debbugs.git/blob - bin/debbugs-loadsql
abstract out some of the bug loading code into Debbugs::DB::Load
[debbugs.git] / bin / debbugs-loadsql
1 #! /usr/bin/perl
2 # debbugs-loadsql is part of debbugs, and is released
3 # under the terms of the GPL version 2, or any later version, at your
4 # option. See the file README and COPYING for more information.
5 # Copyright 2012 by Don Armstrong <don@donarmstrong.com>.
6
7
8 use warnings;
9 use strict;
10
11 use Getopt::Long qw(:config no_ignore_case);
12 use Pod::Usage;
13
14 =head1 NAME
15
16 debbugs-loadsql -- load debbugs sql database
17
18 =head1 SYNOPSIS
19
20 debbugs-loadsql [options]
21
22  Options:
23   --quick, -q only load changed bugs
24   --service, -s service name
25   --sysconfdir, -c postgresql service config dir
26   --spool-dir debbugs spool directory
27   --debug, -d debugging level (Default 0)
28   --help, -h display this help
29   --man, -m display manual
30
31 =head1 OPTIONS
32
33 =over
34
35 =item B<--quick, -q>
36
37 Only load changed bugs
38
39 =item B<--service,-s>
40
41 Postgreql service to use; defaults to debbugs
42
43 =item B<--sysconfdir,-c>
44
45 System configuration directory to use; if not set, defaults to the
46 postgresql default. [Operates by setting PGSYSCONFDIR]
47
48 =item B<--spool-dir>
49
50 Debbugs spool directory; defaults to the value configured in the
51 debbugs configuration file.
52
53 =item B<--debug, -d
54
55 Debug verbosity.
56
57 =item B<--help, -h>
58
59 Display brief useage information.
60
61 =item B<--man, -m>
62
63 Display this manual.
64
65 =back
66
67
68 =cut
69
70
71 use vars qw($DEBUG);
72
73 use Debbugs::Common qw(checkpid lockpid get_hashname getparsedaddrs getbugcomponent make_list);
74 use Debbugs::Config qw(:config);
75 use Debbugs::Status qw(read_bug split_status_fields);
76 use Debbugs::Log;
77 use Debbugs::DB;
78 use Debbugs::DB::Load qw(load_bug handle_load_bug_queue);
79 use DateTime;
80 use File::stat;
81
82
83 my %options = (debug           => 0,
84                help            => 0,
85                man             => 0,
86                verbose         => 0,
87                quiet           => 0,
88                quick           => 0,
89                service         => 'debbugs',
90               );
91
92
93 GetOptions(\%options,
94            'quick|q',
95            'service|s',
96            'sysconfdir|c',
97            'spool_dir|spool-dir=s',
98            'debug|d+','help|h|?','man|m');
99
100 pod2usage() if $options{help};
101 pod2usage({verbose=>2}) if $options{man};
102
103 $DEBUG = $options{debug};
104
105 my @USAGE_ERRORS;
106 $options{verbose} = $options{verbose} - $options{quiet};
107
108 pod2usage(join("\n",@USAGE_ERRORS)) if @USAGE_ERRORS;
109
110 if (exists $options{sysconfdir}) {
111     if (not defined $options{sysconfdir} or not length $options{sysconfdir}) {
112         delete $ENV{PGSYSCONFDIR};
113     } else {
114         $ENV{PGSYSCONFDIR} = $options{sysconfdir};
115     }
116 }
117
118 if (exists $options{spool_dir} and defined $options{spool_dir}) {
119     $config{spool_dir} = $options{spool_dir};
120 }
121 chdir($config{spool_dir}) or die "chdir $config{spool_dir} failed: $!";
122
123 my $verbose = $options{debug};
124
125 my $initialdir = "db-h";
126
127 if (defined $ARGV[0] and $ARGV[0] eq "archive") {
128     $initialdir = "archive";
129 }
130
131 if (not lockpid($config{spool_dir}.'/lock/debbugs-loadsql')) {
132      if ($options{quick}) {
133           # If this is a quick run, just exit
134           print STDERR "Another debbugs-loadsql is running; stopping\n" if $verbose;
135           exit 0;
136      }
137      print STDERR "Another debbugs-loadsql is running; stopping\n";
138      exit 1;
139 }
140
141 # connect to the database; figure out how to handle errors properly
142 # here.
143 my $schema = Debbugs::DB->connect('dbi:Pg:service='.$options{service}) or
144     die "Unable to connect to database: ";
145
146 my $time = 0;
147 my $start_time = time;
148
149
150 my @dirs = ($initialdir);
151 my $cnt = 0;
152 my %tags;
153 my %queue;
154 while (my $dir = shift @dirs) {
155     printf "Doing dir %s ...\n", $dir if $verbose;
156
157     opendir(DIR, "$dir/.") or die "opendir $dir: $!";
158     my @subdirs = readdir(DIR);
159     closedir(DIR);
160
161     my @list = map { m/^(\d+)\.summary$/?($1):() } @subdirs;
162     push @dirs, map { m/^(\d+)$/ && -d "$dir/$1"?("$dir/$1"):() } @subdirs;
163
164     for my $bug (@list) {
165         print "Up to $cnt bugs...\n" if (++$cnt % 100 == 0 && $verbose);
166         my $stat = stat(getbugcomponent($bug,'summary',$initialdir));
167         if (not defined $stat) {
168             print STDERR "Unable to stat $bug $!\n";
169             next;
170         }
171         next if $stat->mtime < $time;
172         my $data = read_bug(bug => $bug,
173                             location => $initialdir);
174         load_bug(db => $schema,
175                  data => split_status_fields($data),
176                  tags => \%tags,
177                  queue => \%queue);
178     }
179 }
180 handle_load_bug_queue(db => $schema,
181                       queue => \%queue);
182
183
184 __END__