use POSIX qw(ENOENT EISDIR EINVAL ENOSYS O_RDWR);
use Fuse;
use DBI;
use POSIX qw(ENOENT EISDIR EINVAL ENOSYS O_RDWR);
use Fuse;
use DBI;
+use Carp;
+use Proc::Simple;
+use Data::Dumper;
+
=head1 SYNOPSIS
use Fuse::DBI;
=head1 SYNOPSIS
use Fuse::DBI;
+ Fuse::DBI->mount( ... );
See L<run> below for examples how to set parametars.
See L<run> below for examples how to set parametars.
Mount your database as filesystem.
Mount your database as filesystem.
+ my $mnt = Fuse::DBI->mount({
filenames => 'select name from filenamefilenames,
read => 'sql read',
update => 'sql update',
filenames => 'select name from filenamefilenames,
read => 'sql read',
update => 'sql update',
my $sth;
my $ctime_start;
my $sth;
my $ctime_start;
-sub run {
- my $self = shift
+sub read_filenames;
+
+sub mount {
+ my $class = shift;
+ my $self = {};
+ bless($self, $class);
- carp "run needs 'dsn' to connect to (e.g. dsn => 'DBI:Pg:dbname=test')" unless ($arg->{'dsn'});
- carp "run needs 'mount' as mountpoint" unless ($arg->{'mount'});
+ print Dumper($arg);
+
+ carp "mount needs 'dsn' to connect to (e.g. dsn => 'DBI:Pg:dbname=test')" unless ($arg->{'dsn'});
+ carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'});
foreach (qw(filenames read update)) {
foreach (qw(filenames read update)) {
- carp "run needs '$_' SQL" unless ($arg->{$_});
+ carp "mount needs '$_' SQL" unless ($arg->{$_});
}
$dbh = DBI->connect($arg->{'dsn'},$arg->{'user'},$arg->{'password'}, { AutoCommit => 0 }) || die $DBI::errstr;
}
$dbh = DBI->connect($arg->{'dsn'},$arg->{'user'},$arg->{'password'}, { AutoCommit => 0 }) || die $DBI::errstr;
- Fuse::main(
- mountpoint=>$arg->{'mount'},
- getattr=>\&e_getattr,
- getdir=>\&e_getdir,
- open=>\&e_open,
- statfs=>\&e_statfs,
- read=>\&e_read,
- write=>\&e_write,
- utime=>\&e_utime,
- truncate=>\&e_truncate,
- debug=>0,
- );
+ $self->{'proc'} = Proc::Simple->new();
+ $self->{'proc'}->kill_on_destroy(1);
+
+ $self->{'proc'}->start( sub {
+ Fuse::main(
+ mountpoint=>$arg->{'mount'},
+ getattr=>\&e_getattr,
+ getdir=>\&e_getdir,
+ open=>\&e_open,
+ statfs=>\&e_statfs,
+ read=>\&e_read,
+ write=>\&e_write,
+ utime=>\&e_utime,
+ truncate=>\&e_truncate,
+ debug=>0,
+ );
+ } );
+
+ $self ? return $self : return undef;
+=head2 umount
+
+Unmount your database as filesystem.
+
+ $mnt->umount;
+
+This will also kill background process which is translating
+database to filesystem.
+
+=cut
+
+sub umount {
+ my $self = shift;
+
+ confess "no process running?" unless ($self->{'proc'});
+ $self->{'proc'}->kill;
+}
+
+
my %files;
my %dirs;
sub read_filenames {
my %files;
my %dirs;
sub read_filenames {
# create empty filesystem
(%files) = (
'.' => {
# create empty filesystem
(%files) = (
'.' => {
NAME => 'Fuse::DBI',
VERSION_FROM => 'DBI.pm', # finds $VERSION
PREREQ_PM => {
NAME => 'Fuse::DBI',
VERSION_FROM => 'DBI.pm', # finds $VERSION
PREREQ_PM => {
+ Fuse => 0,
+ DBI => 0,
+ Carp => 0,
}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
- (ABSTRACT_FROM => 'lib/Fuse/DBI.pm', # retrieve abstract from module
+ (ABSTRACT_FROM => 'DBI.pm', # retrieve abstract from module
AUTHOR => 'Dobrica Pavlinusic <dpavlin@rot13.org>') : ()),
);
AUTHOR => 'Dobrica Pavlinusic <dpavlin@rot13.org>') : ()),
);
--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+use blib;
+use Fuse::DBI;
+
+my $sql_filenames = q{
+ select
+ oid as id,
+ namespace||'/'||name||' ['||oid||']' as filename,
+ length(template) as size,
+ iseditable as writable
+ from template ;
+};
+
+my $sql_read = q{
+ select template
+ from template
+ where oid = ?;
+};
+
+my $sql_update = q{
+ update template
+ set template = ?
+ where oid = ?;
+};
+
+Fuse::DBI->run({
+ filenames => $sql_filenames,
+ read => $sql_read,
+ update => $sql_update,
+ dsn => 'DBI:Pg:dbname=webgui',
+});
--- /dev/null
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+use Test::More tests => 3;
+use blib;
+
+use_ok('Fuse::DBI');
+
+my $sql_filenames = q{
+ select
+ oid as id,
+ namespace||'/'||name||' ['||oid||']' as filename,
+ length(template) as size,
+ iseditable as writable
+ from template ;
+};
+
+my $sql_read = q{
+ select template
+ from template
+ where oid = ?;
+};
+
+my $sql_update = q{
+ update template
+ set template = ?
+ where oid = ?;
+};
+
+my $mnt = Fuse::DBI->mount({
+ filenames => $sql_filenames,
+ read => $sql_read,
+ update => $sql_update,
+ dsn => 'DBI:Pg:dbname=webgui',
+ mount => '/mnt2',
+});
+
+ok($mnt, "mount");
+
+diag "mounted sleeping for 5 sec";
+system "ls -lR /mnt2";
+sleep(5);
+
+ok($mnt->umount,"umount");