13 |
use Data::Dumper; |
use Data::Dumper; |
14 |
|
|
15 |
|
|
16 |
our $VERSION = '0.04'; |
our $VERSION = '0.05'; |
17 |
|
|
18 |
=head1 NAME |
=head1 NAME |
19 |
|
|
29 |
=head1 DESCRIPTION |
=head1 DESCRIPTION |
30 |
|
|
31 |
This module will use C<Fuse> module, part of C<FUSE (Filesystem in USErspace)> |
This module will use C<Fuse> module, part of C<FUSE (Filesystem in USErspace)> |
32 |
available at L<http://sourceforge.net/projects/avf> to mount |
available at L<http://fuse.sourceforge.net/> to mount |
33 |
your database as file system. |
your database as file system. |
34 |
|
|
35 |
That will give you possibility to use normal file-system tools (cat, grep, vi) |
That will give you possibility to use normal file-system tools (cat, grep, vi) |
148 |
|
|
149 |
my $pid; |
my $pid; |
150 |
if ($arg->{'fork'}) { |
if ($arg->{'fork'}) { |
151 |
|
$self->{'mounted'} = 1; |
152 |
$pid = fork(); |
$pid = fork(); |
153 |
die "fork() failed: $!" unless defined $pid; |
die "fork() failed: $!" unless defined $pid; |
154 |
# child will return to caller |
# child will return to caller |
170 |
$self->{'read_filenames'} = sub { $self->read_filenames }; |
$self->{'read_filenames'} = sub { $self->read_filenames }; |
171 |
$self->read_filenames; |
$self->read_filenames; |
172 |
|
|
173 |
$self->{'mounted'} = 1; |
$self->{'mounted'} = 1 unless ($arg->{'fork'}); |
174 |
|
|
175 |
$fuse_self = \$self; |
$fuse_self = \$self; |
176 |
|
|
212 |
my $self = shift; |
my $self = shift; |
213 |
|
|
214 |
if ($self->{'mounted'}) { |
if ($self->{'mounted'}) { |
215 |
system "fusermount -u ".$self->{'mount'} || croak "umount error: $!"; |
system "fusermount -u ".$self->{'mount'} || warn "umount error: $!" && return 0; |
216 |
} |
} |
217 |
|
|
218 |
return 1; |
return 1; |
343 |
my %out; |
my %out; |
344 |
foreach my $f (sort keys %files) { |
foreach my $f (sort keys %files) { |
345 |
if ($dirname) { |
if ($dirname) { |
346 |
if ($f =~ s/^\E$dirname\Q\///) { |
if ($f =~ s/^\Q$dirname\E\///) { |
347 |
$out{$f}++ if ($f =~ /^[^\/]+$/); |
$out{$f}++ if ($f =~ /^[^\/]+$/); |
348 |
} |
} |
349 |
} else { |
} else { |
365 |
|
|
366 |
$sth->{'read'}->execute($id) || die $sth->{'read'}->errstr; |
$sth->{'read'}->execute($id) || die $sth->{'read'}->errstr; |
367 |
$files{$file}{cont} = $sth->{'read'}->fetchrow_array; |
$files{$file}{cont} = $sth->{'read'}->fetchrow_array; |
368 |
$files{$file}{ctime} = time(); |
# I should modify ctime only if content in database changed |
369 |
|
#$files{$file}{ctime} = time() unless ($files{$file}{ctime}); |
370 |
print "file '$file' content [",length($files{$file}{cont})," bytes] read in cache\n"; |
print "file '$file' content [",length($files{$file}{cont})," bytes] read in cache\n"; |
371 |
} |
} |
372 |
|
|
412 |
print "invalidate all cached content\n"; |
print "invalidate all cached content\n"; |
413 |
foreach my $f (keys %files) { |
foreach my $f (keys %files) { |
414 |
delete $files{$f}{cont}; |
delete $files{$f}{cont}; |
415 |
|
delete $files{$f}{ctime}; |
416 |
} |
} |
417 |
print "begin new transaction\n"; |
print "begin new transaction\n"; |
418 |
#$dbh->begin_work || die $dbh->errstr; |
#$dbh->begin_work || die $dbh->errstr; |
524 |
=head1 SEE ALSO |
=head1 SEE ALSO |
525 |
|
|
526 |
C<FUSE (Filesystem in USErspace)> website |
C<FUSE (Filesystem in USErspace)> website |
527 |
L<http://sourceforge.net/projects/avf> |
L<http://fuse.sourceforge.net/> |
528 |
|
|
529 |
Example for WebGUI which comes with this distribution in |
Example for WebGUI which comes with this distribution in |
530 |
directory L<examples/webgui.pl>. It also contains a lot of documentation |
directory C<examples/webgui.pl>. It also contains a lot of documentation |
531 |
about design of this module, usage and limitations. |
about design of this module, usage and limitations. |
532 |
|
|
533 |
=head1 AUTHOR |
=head1 AUTHOR |