]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/DBase.pm
Stop URLs at " too. Thanks to Vincent Lefevre (Closes: #766354).
[debbugs.git] / Debbugs / DBase.pm
index 913fd1f6c832e08fc6f4beddf5de032d3c532697..5df78b01d2b747830f4355ca99a3d8f6a5120f77 100644 (file)
@@ -13,12 +13,12 @@ BEGIN {
        $VERSION     = 1.00;
 
        @ISA         = qw(Exporter);
-       @EXPORT      = qw( %Record );
+       @EXPORT      = qw();
        %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
 
        # your exported package globals go here,
        # as well as any optionally exported functions
-       @EXPORT_OK   = qw( %Record );
+       @EXPORT_OK   = qw();
 }
 
 use vars      @EXPORT_OK;
@@ -26,17 +26,18 @@ use Fcntl ':flock';
 use Debbugs::Config;
 use Debbugs::Email;
 use Debbugs::Common;
+use Debbugs::DBase::Log;
+use Debbugs::DBase::Log::Html;
+use Debbugs::DBase::Log::Message;
+use Debbugs::DBase::Log::Mail;
+
 use FileHandle;
 use File::Basename qw(&dirname);
 use File::Path;
 
-%Record = ();
-
-my $LoadedRecord = 0;
 my $OpenedRecord = 0;
 my $OpenedLog = 0;
-my $FileLocked = 0;
-my $FileHandle = new FileHandle;
+my $FileHandle;
 my $LogfileHandle = new FileHandle;
 
 sub ParseVersion1Record
@@ -46,27 +47,29 @@ sub ParseVersion1Record
                "keywords", "done", "forwarded", "mergedwith", "severity" );
     my $i = 0;
     my $tag;
+    my (%record, %btags);
 
     print "D2: (DBase) Record Fields:\n" if $Globals{ 'debug' } > 1;
     foreach my $line ( @data )
     {
        chop( $line );
        $tag = $fields[$i];
-       $Record{ $tag } = $line;
+       $record{ $tag } = $line;
        print "\t $tag = $line\n" if $Globals{ 'debug' } > 1;
        $i++;
-       $GTags{ "BUG_$tag" } = $line;
+       $btags{ "BUG_$tag" } = $line;
     }
+    return ( \%record, \%btags );
 }
 
 sub ParseVersion2Record
 {
     # I envision the next round of records being totally different in
     # meaning.  In order to maintain compatability, version tagging will be
-    # implemented in thenext go around and different versions will be sent
+    # implemented in the next go around and different versions will be sent
     # off to different functions to be parsed and interpreted into a format
     # that the rest of the system will understand.  All data will be saved
-    # in whatever 'new" format ixists.  The difference will be a "Version: x"
+    # in whatever 'new" format exists.  The difference will be a "Version: x"
     # at the top of the file.
 
     print "No version 2 records are understood at this time\n";
@@ -75,47 +78,97 @@ sub ParseVersion2Record
 
 sub ReadRecord
 {
-    my $record = $_[0];
-    print "V: Reading status $record\n" if $Globals{ 'verbose' };
-    if ( $record ne $LoadedRecord )
-    {
-       my @data;
+    my ($recordnum, $with_log, $new) = (shift, shift, shift);
+    my @data;
+    my $record;
+    my $btags;
 
-       seek( $FileHandle, 0, 0 );
-       @data = <$FileHandle>;
-       if ( scalar( @data ) =~ /Version: (\d*)/ )
+    #Open Status File
+    print "V: Reading status $recordnum\n" if $Globals{ 'verbose' };
+    if( $OpenedRecord != $recordnum )
+    {
+       if( defined( $FileHandle ) )
        {
-           if ( $1 == 2 )
-           { &ParseVersion2Record( @data ); }
-           else
-           { &fail( "Unknown record version: $1\n"); }
+           print "D1: Closing status $recordnum\n" if $Globals{ 'debug' };
+           $OpenedRecord = 0;
+           close $FileHandle;
+           $FileHandle = undef;
        }
-       else { &ParseVersion1Record( @data ); }
-       $LoadedRecord = $record;
+       print "D1: Opening status $recordnum\n" if $Globals{ 'debug' };
+       $FileHandle = &OpenFile( ["db", "archive"], $recordnum, ".status", "status", $new );
+       if( !defined( $FileHandle ) ) { return undef; }
     }
-    else { print "D1: (DBase) $record is already loaded\n" if $Globals{ 'debug' }; }
+    else { print "D1: Reusing status $recordnum\n" if $Globals{ 'debug' }; }
 
+    #Lock status file
+    print "D1: Locking status $recordnum\n" if $Globals{ 'debug' };
+    flock( $FileHandle, LOCK_EX ) || &fail( "Unable to lock record $recordnum\n" );
+
+    #Read in status file contents
+    print "D1: Loading status $recordnum\n" if $Globals{ 'debug' };
+    seek( $FileHandle, 0, 0 );
+    @data = <$FileHandle>;
+
+    #Parse Status File Contents
+    if ( scalar( @data ) =~ /Version: (\d*)/ )
+    {
+       if ( $1 == 2 )
+       { &ParseVersion2Record( @data ); }
+       else
+       { &fail( "Unknown record version: $1\n"); }
+    }
+    else { ($record, $btags) = &ParseVersion1Record( @data ); }
+    if( $with_log )
+    {
+       #DO READ IN LOG RECORD DATA STUFF
+    }
+    return ($record, $btags);
 }
 
 sub WriteRecord
 {
+    my ($recordnum, %record) = @_;
     my @fields = ( "originator", "date", "subject", "msgid", "package",
                "keywords", "done", "forwarded", "mergedwith", "severity" );
-    print "V: Writing status $LoadedRecord\n" if $Globals{ 'verbose' };
+
+    #Open Status File
+    print "V: Writing status $recordnum\n" if $Globals{ 'verbose' };
+    if( $OpenedRecord != $recordnum )
+    {
+       if( defined( $FileHandle ) )
+       {
+           print "D1: Closing status $recordnum\n" if $Globals{ 'debug' };
+           $OpenedRecord = 0;
+           close $FileHandle;
+           $FileHandle = undef;
+       }
+       print "D1: Opening status $recordnum\n" if $Globals{ 'debug' };
+       $FileHandle = &OpenFile( ["db", "archive"], $recordnum, ".status", "status", "old" );
+       if( !defined( $FileHandle ) ) { return undef; }
+    }
+    else { print "D1: Reusing status $recordnum\n" if $Globals{ 'debug' }; }
+
+    #Lock status file
+    print "D1: Locking status $recordnum\n" if $Globals{ 'debug' };
+    flock( $FileHandle, LOCK_EX ) || &fail( "Unable to lock record $recordnum\n" );
+
+    #Read in status file contents
+    print "D1: Saving status $recordnum\n" if $Globals{ 'debug' };
     seek( $FileHandle, 0, 0 );
     for( my $i = 0; $i < $#fields; $i++ )
     {
-       if ( defined( $fields[$i] ) )
-       { print $FileHandle $Record{ $fields[$i] } . "\n"; }
+       if ( defined( $record{ $fields[$i] } ) )
+       { print $FileHandle $record{ $fields[$i] } . "\n"; }
        else { print $FileHandle "\n"; }
     }
 }
 
-sub OpenFile
+sub GetFileName
 {
     my ($prePaths, $stub, $postPath, $desc, $new) = (shift, shift, shift, shift, shift);
+    my $path;
     foreach my $prePath (@$prePaths) {
-       my $path = "/" . $prePath . "/" . $stub . $postPath, my $handle = new FileHandle;
+       $path = "/" . $prePath . "/" . $stub . $postPath;
        print "V: Opening $desc $stub\n" if $Globals{ 'verbose' };
        print "D2: (DBase) trying $path\n" if $Globals{ 'debug' } > 1;
        if( ! -r $Globals{ "work-dir" } . $path ) {
@@ -125,33 +178,27 @@ sub OpenFile
                next if( !$new =~ "new" );
            }
        }
-       open( $handle, $Globals{ "work-dir" } . $path ) && return $handle;
-       if($new =~ "new") {
+       if( -r $Globals{ "work-dir" } . $path ) {
+           return $path;
+       }
+       if( ( ! -r $Globals{ "work-dir" } . $path ) && defined($new) && $new =~ "new") {
            my $dir = dirname( $path );
            if ( ! -d $Globals{ "work-dir" } . $dir ) {
                mkpath($Globals{ "work-dir" } . $dir);
            }
-           open( $handle, ">" . $Globals{ "work-dir" } . $path ) && return $handle;
+           return $path;
        }
     }
-    return;
-}
-sub OpenRecord
-{
-    my $record = $_[0];
-    if ( $record ne $OpenedRecord )
-    {
-       $FileHandle = OpenFile ["db", "archive"], $record, ".status", "status", $_[1];
-       flock( $FileHandle, LOCK_EX ) || &fail( "Unable to lock record $record\n" );
-       $OpenedRecord = $record;
-    }
+    return undef;
 }
 
-sub CloseRecord
+sub OpenFile
 {
-    print "V: Closing status $LoadedRecord\n" if $Globals{ 'verbose' };
-    close $FileHandle;
-    $OpenedRecord = 0;
+    my ($prePaths, $stub, $postPath, $desc, $new) = (shift, shift, shift, shift, shift);
+    my $fileName = GetFileName($prePaths, $stub, $postPath, $desc, $new);
+    my $handle = new FileHandle;
+    open( $handle, $Globals{ "work-dir" } . $fileName ) && return $handle;
+    return undef;
 }
 
 sub OpenLogfile
@@ -159,12 +206,22 @@ sub OpenLogfile
     my $record = $_[0];
     if ( $record ne $OpenedLog )
     {
-       $LogfileHandle = OpenFile("db", $record, ".log", "log");
-       seek( $FileHandle, 0, 2 );
+       $LogfileHandle = OpenFile(["db", "archive"], $record, ".log", "log");
        $OpenedLog = $record;
     }
 }
 
+sub ReadLogfile
+{
+    my $record = $_[0];
+    if ( $record eq $OpenedLog )
+    {
+       seek( $LogfileHandle, 0, 0 );
+       my $log = new Debbugs::DBase::Log;
+       $log->Load($LogfileHandle);
+    }
+}
+
 sub CloseLogfile
 {
     print "V: Closing log $OpenedLog\n" if $Globals{ 'verbose' };
@@ -215,7 +272,7 @@ sub GetBugList
                    my @files = grep { /\d*\d\d.status/ } readdir($dir);
                    close $dir;
                    foreach (@files) {
-                       next if ( -s "$prefix$_1/$_2/$_3/$_" );
+                       next if ( -s "$prefix$_1/$_2/$_3/$_" );
                        s/.status$//;
                        push @ret, $_;
 #                      print "$_ -> $_1/$_2/$_3/$_\n";