From 53315eaa2551f7122ac029d8fcb929a4dc7dda70 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 31 May 2010 14:22:24 +0100 Subject: [PATCH] [errdb] Add errdb.pl script to build error database Signed-off-by: Michael Brown --- contrib/errdb/.gitignore | 1 + contrib/errdb/errdb.pl | 108 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 contrib/errdb/.gitignore create mode 100755 contrib/errdb/errdb.pl diff --git a/contrib/errdb/.gitignore b/contrib/errdb/.gitignore new file mode 100644 index 00000000..95bf5c3c --- /dev/null +++ b/contrib/errdb/.gitignore @@ -0,0 +1 @@ +errors.db diff --git a/contrib/errdb/errdb.pl b/contrib/errdb/errdb.pl new file mode 100755 index 00000000..fc1919f6 --- /dev/null +++ b/contrib/errdb/errdb.pl @@ -0,0 +1,108 @@ +#!/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/ ); + $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();