]> git.p6c8.net - devedit.git/blob - modules/File/UseList.pm
Initial version
[devedit.git] / modules / File / UseList.pm
1 package File::UseList;
2
3 #
4 # File::UseList
5 #
6 # Fuehren einer Liste mit Dateien, auf die zur Zeit zugegriffen wird
7 # (basiert auf Filing::UseList von Roland Bluethgen <calocybe@web.de>)
8 #
9 # Autor: Patrick Canterino <patshaping@gmx.net>
10 # Letzte Aenderung: 20.9.2003
11 #
12
13 use strict;
14
15 use Carp qw(croak);
16
17 our $VERSION = '1.0';
18
19 # new()
20 #
21 # Konstruktor
22 #
23 # Parameter: Hash: listfile => Datei mit der Liste der benutzten Dateien
24 # lockfile => Lock-Datei
25 # timeout => Lock-Timeout in Sekunden (Standard: 10)
26 #
27 # Rueckgabe: File::UseList-Objekt
28
29 sub new(%)
30 {
31 my ($class,%args) = @_;
32
33 # Pruefen, ob wir alle Informationen erhalten haben
34
35 croak "Missing path of list file" unless($args{'listfile'});
36 croak "Missing path of lockfile" unless($args{'lockfile'});
37 $args{'timeout'} = 10 unless($args{'timeout'}); # Standard-Timeout
38
39 my $self = \%args;
40 $self->{'files'} = [];
41
42 return bless($self,$class);
43 }
44
45 # lock()
46 #
47 # Datei mit Liste sperren
48 # (Lock-Datei loeschen)
49 #
50 # Parameter: -keine-
51 #
52 # Rueckgabe: Status-Code (Boolean)
53
54 sub lock
55 {
56 my $self = shift;
57 my $lockfile = $self->{'lockfile'};
58 my $timeout = $self->{'timeout'};
59
60 # Versuche, einmal pro Sekunde die Datei zu loeschen
61 # bis das Timeout erreicht ist
62
63 for(my $x=$timeout;$x>=0;$x--)
64 {
65 unlink($lockfile) and return 1;
66 sleep(1);
67 }
68
69 # Timeout
70
71 return;
72 }
73
74 # unlock()
75 #
76 # Datei mit Liste freigeben
77 # (Lock-Datei anlegen)
78 #
79 # Parameter: -keine-
80 #
81 # Rueckgabe: Status-Code (Boolean)
82
83 sub unlock
84 {
85 my $self = shift;
86 my $lockfile = $self->{'lockfile'};
87 local *LOCKFILE;
88
89 return 1 if(-f $lockfile); # Hmmm...
90
91 open(LOCKFILE,">",$lockfile) or return;
92 close(LOCKFILE) or return;
93
94 return 1;
95 }
96
97 # load()
98 #
99 # Liste mit Dateien laden
100 #
101 # Parameter: -keine-
102 #
103 # Rueckgabe: Status-Code (Boolean)
104
105 sub load
106 {
107 my $self = shift;
108 my $file = $self->{'listfile'};
109 local *FILE;
110
111 # Datei auslesen und zeilenweise aufteilen
112
113 open(FILE,"<".$file) or return;
114 read(FILE, my $content, -s $file);
115 close(FILE) or return;
116
117 my @files = split(/\015\012|\012|\015/,$content);
118
119 # Unbrauchbare Zeilen entfernen
120
121 for(my $x=0;$x<@files;$x++)
122 {
123 if($files[$x] eq "" || $files[$x] =~ /^\s+$/)
124 {
125 splice(@files,$x,1);
126 $x--; # <-- sehr wichtig!
127 }
128 }
129
130 $self->{'files'} = \@files;
131 return 1;
132 }
133
134 # save()
135 #
136 # Liste mit Dateien speichern
137 #
138 # Parameter: -keine-
139 #
140 # Rueckgabe: Status-Code (Boolean)
141
142 sub save
143 {
144 my $self = shift;
145 my $file = $self->{'listfile'};
146 my $temp = $file.".temp";
147 my $files = $self->{'files'};
148 local *FILE;
149
150 my $data = (@$files) ? join("\n",@$files)."\n" : '';
151
152 open(FILE,">",$temp) or return;
153 print FILE $data;
154 close(FILE) or return;
155
156 rename($temp,$file) and return 1;
157
158 # Mist
159
160 return;
161 }
162
163 # add_file()
164 #
165 # Datei zur Liste hinzufuegen
166 #
167 # Parameter: Datei
168
169 sub add_file($)
170 {
171 my ($self,$file) = @_;
172 my $files = $self->{'files'};
173
174 # Pruefen, ob die Datei nicht schon in der Liste vorhanden ist
175
176 return if($self->in_use($file));
177
178 push(@$files,$file);
179 }
180
181 # remove_file()
182 #
183 # Datei aus der Liste entfernen
184 #
185 # Parameter: Datei
186
187 sub remove_file($)
188 {
189 my ($self,$file) = @_;
190 my $files = $self->{'files'};
191
192 # Pruefen, ob die Datei ueberhaupt in der Liste vorhanden ist
193
194 return if($self->unused($file));
195
196 # Datei entfernen
197
198 for(my $x=0;$x<@$files;$x++)
199 {
200 if($files->[$x] eq $file)
201 {
202 splice(@$files,$x,1);
203 last;
204 }
205 }
206 }
207
208 # in_use()
209 #
210 # Pruefen, ob eine Datei in der Liste vorhanden ist
211 #
212 # Parameter: Zu pruefende Datei
213 #
214 # Rueckgabe: Status-Code (Boolean)
215
216 sub in_use($)
217 {
218 my ($self,$file) = @_;
219 my $files = $self->{'files'};
220
221 foreach(@$files)
222 {
223 return 1 if($_ eq $file);
224 }
225
226 return;
227 }
228
229 # unused()
230 #
231 # Pruefen, ob eine Datei nicht in der Liste vorhanden ist
232 #
233 # Parameter: Zu pruefende Datei
234 #
235 # Rueckgabe: Status-Code (Boolean)
236
237 sub unused($)
238 {
239 return not shift->in_use(shift);
240 }
241
242 # it's true, baby ;-)
243
244 1;
245
246 #
247 ### Ende ###

patrick-canterino.de