#!/usr/bin/perl -w =head1 NAME errdb.pl =head1 SYNOPSIS errdb.pl [options] ../../src/bin/errors Options: -d,--database=db Specify path to errors.db -h,--help Display brief help message -v,--verbose Increase verbosity -q,--quiet Decrease verbosity =cut use Getopt::Long; use Pod::Usage; use DBI; use strict; use warnings; # Parse command-line options my $verbosity = 0; my $errdb = "errors.db"; Getopt::Long::Configure ( 'bundling', 'auto_abbrev' ); GetOptions ( 'database|d=s' => sub { shift; $errdb = shift; }, 'verbose|v+' => sub { $verbosity++; }, 'quiet|q+' => sub { $verbosity--; }, 'help|h' => sub { pod2usage ( 1 ); }, ) or die "Could not parse command-line options\n"; pod2usage ( 1 ) unless @ARGV >= 1; # Open database my $dbh = DBI->connect ( "dbi:SQLite:dbname=".$errdb, "", "", { RaiseError => 1, PrintError => 0 } ); $dbh->begin_work(); # Create errors table if necessary eval { $dbh->selectall_arrayref ( "SELECT * FROM errors LIMIT 1" ); }; if ( $@ ) { print "Creating errors table\n" if $verbosity >= 1; $dbh->do ( "CREATE TABLE errors (". " errno char(8) NOT NULL,". " description text NOT NULL,". " PRIMARY KEY ( errno ) )" ); } # Create xrefs table if necessary eval { $dbh->selectall_arrayref ( "SELECT * FROM xrefs LIMIT 1" ); }; if ( $@ ) { print "Creating xrefs table\n" if $verbosity >= 1; $dbh->do ( "CREATE TABLE xrefs (". " errno char(8) NOT NULL,". " filename text NOT NULL,". " line integer NOT NULL,". " UNIQUE ( errno, filename, line ),". " FOREIGN KEY ( errno ) REFERENCES errors ( errno ) )" ); $dbh->do ( "CREATE INDEX xrefs_errno ON xrefs ( errno )" ); } # Parse input file(s) my $errors = {}; my $xrefs = {}; while ( <> ) { chomp; ( my $errno, my $filename, my $line, my $description ) = split ( /\t/ ); $errno = substr ( $errno, 0, 6 ) unless $errno =~ /^7f/; $errors->{$errno} = $description; $xrefs->{$errno} ||= {}; $xrefs->{$errno}->{$filename} ||= {}; $xrefs->{$errno}->{$filename}->{$line} ||= 1; } # Ensure all errors are present in database my $error_update = $dbh->prepare ( "UPDATE errors SET description = ? WHERE errno = ?" ); my $error_insert = $dbh->prepare ( "INSERT INTO errors VALUES ( ?, ? )" ); while ( ( my $errno, my $description ) = each %$errors ) { print "Error ".$errno." is \"".$description."\"\n" if $verbosity >= 2; if ( $error_update->execute ( $description, $errno ) == 0 ) { $error_insert->execute ( $errno, $description ); } } # Replace xrefs in database $dbh->do ( "DELETE FROM xrefs" ); my $xref_insert = $dbh->prepare ( "INSERT INTO xrefs VALUES ( ?, ?, ? )" ); while ( ( my $errno, my $xref_errno ) = each %$xrefs ) { while ( ( my $filename, my $xref_filename ) = each %$xref_errno ) { foreach my $line ( keys %$xref_filename ) { print "Error ".$errno." is used at ".$filename." line ".$line."\n" if $verbosity >= 2; $xref_insert->execute ( $errno, $filename, $line ); } } } # Close database $dbh->commit(); $dbh->disconnect();