use Fuse::DBI;
Fuse::DBI->mount( ... );
-See L<run> below for examples how to set parametars.
+See C<run> below for examples how to set parametars.
=head1 DESCRIPTION
-This module will use L<Fuse> module, part of C<FUSE (Filesystem in USErspace)>
+This module will use C<Fuse> module, part of C<FUSE (Filesystem in USErspace)>
available at L<http://sourceforge.net/projects/avf> to mount
your database as file system.
sub read_filenames;
sub fuse_module_loaded;
+# evil, evil way to solve this. It makes this module non-reentrant. But, since
+# fuse calls another copy of this script for each mount anyway, this shouldn't
+# be a problem.
+my $fuse_self;
+
sub mount {
my $class = shift;
my $self = {};
carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'});
# save (some) arguments in self
- $self->{$_} = $arg->{$_} foreach (qw(mount));
+ foreach (qw(mount invalidate)) {
+ $self->{$_} = $arg->{$_};
+ $fuse_self->{$_} = $arg->{$_};
+ }
foreach (qw(filenames read update)) {
carp "mount needs '$_' SQL" unless ($arg->{$_});
$ctime_start = time();
+ my $pid;
if ($arg->{'fork'}) {
- my $pid = fork();
+ $pid = fork();
die "fork() failed: $!" unless defined $pid;
# child will return to caller
if ($pid) {
- $self ? return $self : return undef;
+ return $self;
}
}
$self->read_filenames;
- my $mount = Fuse::main(
+ Fuse::main(
mountpoint=>$arg->{'mount'},
getattr=>\&e_getattr,
getdir=>\&e_getdir,
debug=>0,
);
- if (! $mount) {
- warn "mount on ",$arg->{'mount'}," failed!\n";
- return undef;
- }
+ exit(0) if ($arg->{'fork'});
+
+ return 1;
+
};
=head2 umount
return 1;
}
+#$SIG{'INT'} = sub {
+# print STDERR "umount called by SIG INT\n";
+# umount;
+#};
+
+sub DESTROY {
+ my $self = shift;
+ print STDERR "umount called by DESTROY\n";
+ $self->umount;
+}
+
=head2 fuse_module_loaded
Checks if C<fuse> module is loaded in kernel.
return 0;
}
print "updated '$file' [",$files{$file}{id},"]\n";
+
+ $fuse_self->{'invalidate'}->() if (ref $fuse_self->{'invalidate'});
}
return 1;
}