]> git.donarmstrong.com Git - debbugs.git/blob - Debbugs/DBase.pm
[project @ 2000-03-23 05:05:51 by gecko]
[debbugs.git] / Debbugs / DBase.pm
1 package Debbugs::DBase;  # assumes Some/Module.pm
2
3 use strict;
4
5 BEGIN {
6         use Exporter   ();
7         use vars       qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
8
9         # set the version for version checking
10         $VERSION     = 1.00;
11
12         @ISA         = qw(Exporter);
13         @EXPORT      = qw( %Record );
14         %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
15
16         # your exported package globals go here,
17         # as well as any optionally exported functions
18         @EXPORT_OK   = qw( %Record );
19 }
20
21 use vars      @EXPORT_OK;
22 use Fcntl ':flock';
23 use Debbugs::Config;
24 use Debbugs::Email;
25 use Debbugs::Common;
26 use FileHandle;
27
28 %Record = ();
29
30 my $LoadedRecord = 0;
31 my $FileLocked = 0;
32 my $FileHandle = new FileHandle;
33
34 sub ParseVersion1Record
35 {
36     my @data = @_;
37     my @fields = ( "originator", "date", "subject", "msgid", "package",
38                 "keywords", "done", "forwarded", "mergedwith", "severity" );
39     my $i = 0;
40     my $tag;
41
42     print "D2: (DBase) Record Fields:\n" if $Globals{ 'debug' } > 1;
43     foreach my $line ( @data )
44     {
45         chop( $line );
46         $tag = $fields[$i];
47         $Record{ $tag } = $line;
48         print "\t $tag = $line\n" if $Globals{ 'debug' } > 1;
49         $i++;
50         $GTags{ "BUG_$tag" } = $line;
51     }
52 }
53
54 sub ParseVersion2Record
55 {
56     # I envision the next round of records being totally different in
57     # meaning.  In order to maintain compatability, version tagging will be
58     # implemented in thenext go around and different versions will be sent
59     # off to different functions to be parsed and interpreted into a format
60     # that the rest of the system will understand.  All data will be saved
61     # in whatever 'new" format ixists.  The difference will be a "Version: x"
62     # at the top of the file.
63
64     print "No version 2 records are understood at this time\n";
65     exit 1;
66 }
67
68 sub ReadRecord
69 {
70     my $record = $_[0];
71     print "V: Reading $record\n" if $Globals{ 'verbose' };
72     if ( $record ne $LoadedRecord )
73     {
74         my $path = '';
75         my @data;
76
77         print "D1: (DBase) $record is being loaded\n" if $Globals{ 'debug' }; 
78         
79         #find proper directory to store in
80         #later, this will be for tree'd data directory the way
81         #expire is now,..
82         $path = "/db/".$record.".status";
83         print "D2: (DBase) $path found as data path\n" if $Globals{ 'debug' } > 1;
84     
85         open( $FileHandle, $Globals{ "work-dir" } . $path ) 
86             || &fail( "Unable to open record: ".$Globals{ "work-dir" }."$path\n");
87         flock( $FileHandle, LOCK_EX ) || &fail( "Unable to lock record $record\n" );
88         @data = <$FileHandle>;
89         if ( scalar( @data ) =~ /Version: (\d*)/ )
90         {
91             if ( $1 == 2 )
92             { &ParseVersion2Record( @data ); }
93             else
94             { &fail( "Unknown record version: $1\n"); }
95         }
96         else { &ParseVersion1Record( @data ); }
97         $LoadedRecord = $record;
98     }
99     else { print "D1: (DBase) $record is already loaded\n" if $Globals{ 'debug' }; }
100
101 }
102
103 sub WriteRecord
104 {
105     my @fields = ( "originator", "date", "subject", "msgid", "package",
106                 "keywords", "done", "forwarded", "mergedwith", "severity" );
107     seek( $FileHandle, 0, 0 );
108     for( my $i = 0; $i < $#fields; $i++ )
109     {
110         if ( defined( $fields[$i] ) )
111         { print $FileHandle $Record{ $fields[$i] } . "\n"; }
112         else { print $FileHandle "\n"; }
113     }
114     close $FileHandle;
115     $LoadedRecord = 0;
116 }
117
118 1;
119
120 END { }       # module clean-up code here (global destructor)