ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/Scram/ScramProjectDB.pm
Revision: 1.7.4.1
Committed: Fri Feb 27 15:34:56 2004 UTC (21 years, 2 months ago) by sashby
Content type: text/plain
Branch: SCRAM_V1_BRANCH
CVS Tags: SCRAM_V1, SCRAMV1_IMPORT
Changes since 1.7: +67 -37 lines
Log Message:
First import of new SCRAM packages into CMS cvs repos.

File Contents

# Content
1 #
2 # ScramProjectDB.pm - Keep a track of available projects
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 # -----------
8 # Stores project area information
9 #
10 # Interface
11 # ---------
12 # new(dbfile) : A new dbobject object
13 # file() : return the db file
14 # getarea(name,version) : return the object matching the name version
15 # addarea(ConfigArea) : add a project - return 0 for success 1 for abort
16 # list() : list local areas (retunns $name,$version pairs)
17 # listall() : list local and linked areas
18 # listlinks() : Show a list of links
19 # removearea(name,version) : remove the named project
20 # link(dblocation) : link with specified db
21 # unlink(dblocation) : remove link with a specified db
22
23 package Scram::ScramProjectDB;
24 use Utilities::Verbose;
25 require 5.004;
26 @ISA=qw(Utilities::Verbose);
27
28 sub new {
29 my $class=shift;
30 my $self={};
31 bless $self, $class;
32 $self->{dbfile}=shift;
33 $self->_readdbfile($self->{dbfile});
34 $self->{projectobjects}={};
35 return $self;
36 }
37
38 sub file {
39 my $self=shift;
40 return $self->{dbfile};
41 }
42
43 sub getarea
44 {
45 require Configuration::ConfigArea;
46 my $self=shift;
47 my $name=shift;
48 my $version=shift;
49 my $area=undef;
50 my $index=$self->_findlocal($name,$version);
51
52 if ( $index != -1 )
53 {
54 my $location=$self->{projects}[$index][3];
55 if ( defined $self->{projectobjects}{$location} )
56 {
57 $area=$self->{projectobjects}{$location};
58 }
59 else
60 {
61 $area=Configuration::ConfigArea->new();
62 $self->verbose("Attempt to ressurect $name $version from $location");
63 if ( $area->bootstrapfromlocation($location) == 1 )
64 {
65 undef $area;
66 $self->verbose("attempt unsuccessful");
67 }
68 else
69 {
70 $self->verbose("area found");
71 $self->{projectobjects}{$location}=$area;
72 }
73 }
74 }
75 else
76 {
77 # -- search in linked databases
78 foreach $db ( @{$self->{linkeddbs}} )
79 {
80 $self->verbose("Searching in $db->file() for $name $version");
81 $area=$db->getarea($name,$version);
82 last if (defined $area);
83 }
84 }
85 if ( ! defined $area )
86 {
87 $self->verbose("Area $name $version not found");
88 }
89
90 return $area;
91 }
92
93
94 sub addarea
95 {
96 my $self=shift;
97 my $flag=shift;
98 my $name=shift;
99 my $version=shift;
100 my $area=shift;
101
102 my $rv=1;
103 my $type="file";
104 my $url=$area->location()."/.SCRAM/InstallFile";
105
106 # -- check for duplicates
107 for ( my $index=0; $index<=$#{$self->{projects}}; $index++ )
108 {
109 if ( $self->{projects}[$index][0] eq $name )
110 {
111 if ( $self->{projects}[$index][1] eq $version )
112 {
113 if ($flag == 1)
114 {
115 $rv=0;
116 $self->{projects}[$index]=[ ($name,$version,$type,$url) ];
117 }
118 else
119 {
120 print "$name $version already exists. Overwrite? (y/n) : ";
121 if ( ! (<STDIN>=~/y/i ) )
122 {
123 print "Aborting install ...\n";
124 return 1;
125 }
126 else
127 {
128 $rv=0;
129 $self->{projects}[$index]=[ ($name,$version,$type,$url) ];
130 }
131 }
132 }
133 else
134 {
135 print "Related Project : $name ".$self->{projects}[$index][1]."\n";
136 }
137 }
138 }
139
140 if ( $rv )
141 {
142 # -- add to our list and save
143 push @{$self->{projects}}, [ ($name,$version,$type,$url) ];
144 }
145 $self->_save();
146 return 0;
147 }
148
149 sub listlinks {
150 my $self=shift;
151
152 my @dbfile=();
153 foreach $db ( @{$self->{linkeddbs}} ) {
154 push @dbfile, $db->file();
155 }
156 return @dbfile;
157 }
158
159 sub list {
160 my $self=shift;
161 return @{$self->{projects}};
162 }
163
164 sub listall {
165 my $self=shift;
166 my @list=$self->list();
167
168 foreach $db ( @{$self->{linkeddbs}} ) {
169 $self->verbose("Adding list from $db");
170 push @list, $db->listall();
171 }
172
173 return @list;
174 }
175
176 sub removearea
177 {
178 ###############################################################
179 # removearea(name,version) #
180 ###############################################################
181 # modified : Mon May 28 11:24:29 2001 / SFA #
182 # params : #
183 # : #
184 # : #
185 # : #
186 # function : Remove project area from scramdb file. #
187 # : #
188 # : #
189 ###############################################################
190 my $self=shift;
191 my $flag=shift;
192 my $name=shift;
193 my $version=shift;
194 my $vfound=0;
195 my $nfound=0;
196
197 print "\n","Going to remove $name $version from the current scram database.....","\n";
198 print "\n";
199
200 for ( my $index=0; $index<=$#{$self->{projects}}; $index++ )
201 {
202 # Look for a project with name $name:
203 if ( $self->{projects}[$index][0] eq $name )
204 {
205 $nfound=1;
206 # Check the version:
207 if ( $self->{projects}[$index][1] eq $version )
208 {
209 # We have a match for project name and version:
210 $vfound=1;
211 if ($flag == 1)
212 {
213 # Remove the project:
214 print "\n";
215 print "Removing project:\t$name\t$version","\n\n";
216 splice(@{$self->{projects}},$index,1);
217 }
218 else
219 {
220 print "Project $name Version $version exists. Remove it? (y/n): ";
221 if ( ! (<STDIN>=~/y/i ) )
222 {
223 print "\n","Aborting project removal...bye.\n\n";
224 return 1;
225 }
226 else
227 {
228 # Remove the project:
229 print "\n";
230 print "Removing project:\t$name\t$version","\n\n";
231 splice(@{$self->{projects}},$index,1);
232 }
233 }
234 }
235 }
236 }
237
238 if ( ! $nfound || ! $vfound )
239 {
240 # There was a problem finding either the
241 # named project or the desired version:
242 print "ERROR: Unable to find project $name with version $version in the database.","\n\n";
243 return 1;
244 }
245
246 print "\n";
247 # Save our new array:
248 $self->_save();
249 return 0;
250 }
251
252 sub link {
253 my $self=shift;
254 my $dbfile=shift;
255
256 my $newdb=Scram::ScramProjectDB->new($dbfile);
257 push @{$self->{linkeddbs}},$newdb;
258 $self->_save();
259 }
260
261 sub unlink {
262 my $self=shift;
263 my $file=shift;
264 my $db;
265
266 for (my $i=0; $i<=$#{$self->{linkeddbs}}; $i++ ) {
267 $db=${$self->{linkeddbs}}[$i];
268 if ( $db->file() eq $file ) {
269 $self->verbose("Removing link $file");
270 splice (@{$self->{linkeddbs}},$i,1);
271 $self->_save();
272 }
273 }
274 }
275
276 # -- Support Routines
277
278 #
279 # Search through the project list until we get a match
280 sub _findlocal {
281 my $self=shift;
282 my $name=shift;
283 my $version=shift;
284
285 my $found=-1;
286 for (my $i=0; $i<=$#{$self->{projects}}; $i++ ) {
287 if ( ( $self->{projects}[$i][0] eq $name) &&
288 ( $self->{projects}[$i][1] eq $version) ) {
289 $found=$i;
290 last;
291 }
292 }
293 return $found;
294 }
295
296 sub _save {
297 my $self=shift;
298
299 use FileHandle;
300 my $fh=FileHandle->new();
301 my $filename=$self->{dbfile};
302 open ( $fh, ">$filename" );
303 # print current links
304 foreach $db ( @{$self->{linkeddbs}} ) {
305 print $fh "\!DB ".$db->file()."\n";
306 }
307 # save project info
308 my $temp;
309 foreach $elem ( @{$self->{projects}} ) {
310 $temp=join ":", @{$elem};
311 print $fh $temp."\n";
312 }
313 undef $fh;
314 }
315
316 sub _readdbfile {
317 my $self=shift;
318 my $file=shift;
319
320 use FileHandle;
321 my $fh=FileHandle->new();
322 $self->verbose("Initialising db from $file");
323 open ( $fh, "<$file" );
324
325 my @vars;
326 my $newdb;
327 while ( $map=<$fh> ) {
328 chomp $map;
329 if ( $map=~/^\!DB (.*)/ ) { # Check for other DB files
330 my $db=$1;
331 if ( -f $db ) {
332 $self->verbose("Getting Linked DB $db");
333 $newdb=Scram::ScramProjectDB->new($db);
334 push @{$self->{linkeddbs}},$newdb;
335 }
336 next;
337 }
338 @vars = split ":", $map;
339 $self->verbose("registering project $map");
340 push @{$self->{projects}}, [ @vars ];
341 }
342 undef $fh;
343 }