--- trunk/DBI.pm 2004/11/19 21:56:12 40 +++ trunk/DBI.pm 2004/11/28 20:20:36 53 @@ -12,8 +12,10 @@ use Carp; use Data::Dumper; +our $VERSION = '0.07'; -our $VERSION = '0.06'; +# block size for this filesystem +use constant BLOCK => 1024; =head1 NAME @@ -132,6 +134,11 @@ print Dumper($arg); + unless ($self->fuse_module_loaded) { + print STDERR "no fuse module loaded. Trying sudo modprobe fuse!\n"; + system "sudo modprobe fuse" || die "can't modprobe fuse using sudo!\n"; + } + 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'}); @@ -152,7 +159,16 @@ die "fork() failed: $!" unless defined $pid; # child will return to caller if ($pid) { - return $self; + my $counter = 4; + while ($counter && ! $self->is_mounted) { + select(undef, undef, undef, 0.5); + $counter--; + } + if ($self->is_mounted) { + return $self; + } else { + return undef; + } } } @@ -192,6 +208,32 @@ }; +=head2 is_mounted + +Check if fuse filesystem is mounted + + if ($mnt->is_mounted) { ... } + +=cut + +sub is_mounted { + my $self = shift; + + my $mounted = 0; + my $mount = $self->{'mount'} || confess "can't find mount point!"; + if (open(MTAB, "/etc/mtab")) { + while() { + $mounted = 1 if (/ $mount fuse /i); + } + close(MTAB); + } else { + warn "can't open /etc/mtab: $!"; + } + + return $mounted; +} + + =head2 umount Unmount your database as filesystem. @@ -206,25 +248,16 @@ sub umount { my $self = shift; - if ($self->{'mount'}) { - if (open(MTAB, "/etc/mtab")) { - my $mounted = 0; - my $mount = $self->{'mount'}; - while() { - $mounted = 1 if (/ $mount fuse /i); - } - close(MTAB); - - if ($mounted) { - system "fusermount -u ".$self->{'mount'}." 2>&1 >/dev/null" || return 0; - return 1; - } - - } else { - warn "can't open /etc/mtab: $!"; + if ($self->{'mount'} && $self->is_mounted) { + system "( fusermount -u ".$self->{'mount'}." 2>&1 ) >/dev/null"; + if ($self->is_mounted) { + system "sudo umount ".$self->{'mount'} || return 0; } + return 1; } + + return 0; } $SIG{'INT'} = sub { @@ -268,7 +301,6 @@ } my %files; -my %dirs; sub read_filenames { my $self = shift; @@ -308,7 +340,6 @@ # first, entry is assumed to be file if ($d) { $files{$d} = { - size => $dirs{$d}++, mode => 0755, type => 0040 }; @@ -326,7 +357,7 @@ } } - print "found ",scalar(keys %files)-scalar(keys %dirs)," files, ",scalar(keys %dirs), " dirs\n"; + print "found ",scalar(keys %files)," files\n"; } @@ -342,8 +373,8 @@ $file =~ s,^/,,; $file = '.' unless length($file); return -ENOENT() unless exists($files{$file}); - my ($size) = $files{$file}{size} || 1; - my ($dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize) = (0,0,0,1,0,0,1,1024); + my ($size) = $files{$file}{size} || BLOCK; + my ($dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize) = (0,0,0,int(($size+BLOCK-1)/BLOCK),0,0,1,BLOCK); my ($atime, $ctime, $mtime); $atime = $ctime = $mtime = $files{$file}{ctime} || $ctime_start; @@ -351,7 +382,7 @@ # 2 possible types of return values: #return -ENOENT(); # or any other error you care to - #print(join(",",($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)),"\n"); + #print "getattr($file) ",join(",",($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)),"\n"; return ($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks); } @@ -516,17 +547,37 @@ return 0; } -sub e_statfs { return 255, 1, 1, 1, 1, 2 } +sub e_statfs { + + my $size = 0; + my $inodes = 0; + + foreach my $f (keys %files) { + if ($f !~ /(^|\/)\.\.?$/) { + $size += $files{$f}{size} || 0; + $inodes++; + } + print "$inodes: $f [$size]\n"; + } + + $size = int(($size+BLOCK-1)/BLOCK); + + my @ret = (255, $inodes, 1, $size, $size-1, BLOCK); + + #print "statfs: ",join(",",@ret),"\n"; + + return @ret; +} sub e_unlink { my $file = filename_fixup(shift); - if (exists( $dirs{$file} )) { - print "unlink '$file' will re-read template names\n"; - print Dumper($fuse_self); - $$fuse_self->{'read_filenames'}->(); - return 0; - } elsif (exists( $files{$file} )) { +# if (exists( $dirs{$file} )) { +# print "unlink '$file' will re-read template names\n"; +# print Dumper($fuse_self); +# $$fuse_self->{'read_filenames'}->(); +# return 0; + if (exists( $files{$file} )) { print "unlink '$file' will invalidate cache\n"; read_content($file,$files{$file}{id}); return 0;