/[fuse_dbi]/fuse-couchdb/DBI.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /fuse-couchdb/DBI.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 36 by dpavlin, Tue Nov 16 15:34:25 2004 UTC revision 51 by dpavlin, Sat Nov 27 14:02:18 2004 UTC
# Line 13  use Carp; Line 13  use Carp;
13  use Data::Dumper;  use Data::Dumper;
14    
15    
16  our $VERSION = '0.05';  our $VERSION = '0.07';
17    
18  =head1 NAME  =head1 NAME
19    
# Line 132  sub mount { Line 132  sub mount {
132    
133          print Dumper($arg);          print Dumper($arg);
134    
135            unless ($self->fuse_module_loaded) {
136                    print STDERR "no fuse module loaded. Trying sudo modprobe fuse!\n";
137                    system "sudo modprobe fuse" || die "can't modprobe fuse using sudo!\n";
138            }
139    
140          carp "mount needs 'dsn' to connect to (e.g. dsn => 'DBI:Pg:dbname=test')" unless ($arg->{'dsn'});          carp "mount needs 'dsn' to connect to (e.g. dsn => 'DBI:Pg:dbname=test')" unless ($arg->{'dsn'});
141          carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'});          carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'});
142    
# Line 148  sub mount { Line 153  sub mount {
153    
154          my $pid;          my $pid;
155          if ($arg->{'fork'}) {          if ($arg->{'fork'}) {
                 $self->{'mounted'} = 1;  
156                  $pid = fork();                  $pid = fork();
157                  die "fork() failed: $!" unless defined $pid;                  die "fork() failed: $!" unless defined $pid;
158                  # child will return to caller                  # child will return to caller
159                  if ($pid) {                  if ($pid) {
160                          return $self;                          my $counter = 4;
161                            while ($counter && ! $self->is_mounted) {
162                                    select(undef, undef, undef, 0.5);
163                                    $counter--;
164                            }
165                            if ($self->is_mounted) {
166                                    return $self;
167                            } else {
168                                    return undef;
169                            }
170                  }                  }
171          }          }
172    
# Line 170  sub mount { Line 183  sub mount {
183          $self->{'read_filenames'} = sub { $self->read_filenames };          $self->{'read_filenames'} = sub { $self->read_filenames };
184          $self->read_filenames;          $self->read_filenames;
185    
         $self->{'mounted'} = 1 unless ($arg->{'fork'});  
   
186          $fuse_self = \$self;          $fuse_self = \$self;
187    
188          Fuse::main(          Fuse::main(
# Line 189  sub mount { Line 200  sub mount {
200                  debug=>0,                  debug=>0,
201          );          );
202                    
         $self->{'mounted'} = 0;  
   
203          exit(0) if ($arg->{'fork'});          exit(0) if ($arg->{'fork'});
204    
205          return 1;          return 1;
206    
207  };  };
208    
209    =head2 is_mounted
210    
211    Check if fuse filesystem is mounted
212    
213      if ($mnt->is_mounted) { ... }
214    
215    =cut
216    
217    sub is_mounted {
218            my $self = shift;
219    
220            my $mounted = 0;
221            my $mount = $self->{'mount'} || confess "can't find mount point!";
222            if (open(MTAB, "/etc/mtab")) {
223                    while(<MTAB>) {
224                            $mounted = 1 if (/ $mount fuse /i);
225                    }
226                    close(MTAB);
227            } else {
228                    warn "can't open /etc/mtab: $!";
229            }
230    
231            return $mounted;
232    }
233    
234    
235  =head2 umount  =head2 umount
236    
237  Unmount your database as filesystem.  Unmount your database as filesystem.
# Line 211  database to filesystem. Line 246  database to filesystem.
246  sub umount {  sub umount {
247          my $self = shift;          my $self = shift;
248    
249          if ($self->{'mounted'}) {          if ($self->{'mount'} && $self->is_mounted) {
250                  system "fusermount -u ".$self->{'mount'} || warn "umount error: $!" && return 0;                  system "fusermount -u ".$self->{'mount'}." 2>&1 >/dev/null" ||
251                            system "sudo umount ".$self->{'mount'} ||
252                            return 0;
253                    return 1;
254          }          }
255    
256          return 1;          return 0;
257  }  }
258    
259  $SIG{'INT'} = sub {  $SIG{'INT'} = sub {
260          print STDERR "umount called by SIG INT\n";          if ($fuse_self && $$fuse_self->umount) {
261          umount;                  print STDERR "umount called by SIG INT\n";
262            }
263    };
264    
265    $SIG{'QUIT'} = sub {
266            if ($fuse_self && $$fuse_self->umount) {
267                    print STDERR "umount called by SIG QUIT\n";
268            }
269  };  };
270    
271  sub DESTROY {  sub DESTROY {
272          my $self = shift;          my $self = shift;
273          return if (! $self->{'mounted'});          if ($self->umount) {
274          print STDERR "umount called by DESTROY\n";                  print STDERR "umount called by DESTROY\n";
275          $self->umount;          }
276  }  }
277    
278  =head2 fuse_module_loaded  =head2 fuse_module_loaded
# Line 252  sub fuse_module_loaded { Line 297  sub fuse_module_loaded {
297  }  }
298    
299  my %files;  my %files;
 my %dirs;  
300    
301  sub read_filenames {  sub read_filenames {
302          my $self = shift;          my $self = shift;
# Line 265  sub read_filenames { Line 309  sub read_filenames {
309                          type => 0040,                          type => 0040,
310                          mode => 0755,                          mode => 0755,
311                  },                  },
312                    '..' => {
313                            type => 0040,
314                            mode => 0755,
315                    },
316          #       a => {          #       a => {
317          #               cont => "File 'a'.\n",          #               cont => "File 'a'.\n",
318          #               type => 0100,          #               type => 0100,
# Line 288  sub read_filenames { Line 336  sub read_filenames {
336                          # first, entry is assumed to be file                          # first, entry is assumed to be file
337                          if ($d) {                          if ($d) {
338                                  $files{$d} = {                                  $files{$d} = {
                                                 size => $dirs{$d}++,  
339                                                  mode => 0755,                                                  mode => 0755,
340                                                  type => 0040                                                  type => 0040
341                                  };                                  };
# Line 306  sub read_filenames { Line 353  sub read_filenames {
353                  }                  }
354          }          }
355    
356          print "found ",scalar(keys %files)-scalar(keys %dirs)," files, ",scalar(keys %dirs), " dirs\n";          print "found ",scalar(keys %files)," files\n";
357  }  }
358    
359    
# Line 322  sub e_getattr { Line 369  sub e_getattr {
369          $file =~ s,^/,,;          $file =~ s,^/,,;
370          $file = '.' unless length($file);          $file = '.' unless length($file);
371          return -ENOENT() unless exists($files{$file});          return -ENOENT() unless exists($files{$file});
372          my ($size) = $files{$file}{size} || 1;          my ($size) = $files{$file}{size} || 1024;
373          my ($dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize) = (0,0,0,1,0,0,1,1024);          my ($dev, $ino, $rdev, $blocks, $gid, $uid, $nlink, $blksize) = (0,0,0,int(($size+1023)/1024),0,0,1,1024);
374          my ($atime, $ctime, $mtime);          my ($atime, $ctime, $mtime);
375          $atime = $ctime = $mtime = $files{$file}{ctime} || $ctime_start;          $atime = $ctime = $mtime = $files{$file}{ctime} || $ctime_start;
376    
# Line 331  sub e_getattr { Line 378  sub e_getattr {
378    
379          # 2 possible types of return values:          # 2 possible types of return values:
380          #return -ENOENT(); # or any other error you care to          #return -ENOENT(); # or any other error you care to
381          #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";
382          return ($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks);          return ($dev,$ino,$modes,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks);
383  }  }
384    
# Line 496  sub e_utime { Line 543  sub e_utime {
543          return 0;          return 0;
544  }  }
545    
546  sub e_statfs { return 255, 1, 1, 1, 1, 2 }  sub e_statfs {
547    
548            my $size = 0;
549            my $inodes = 0;
550    
551            foreach my $f (keys %files) {
552                    if ($f !~ /(^|\/)\.\.?$/) {
553                            $size += $files{$f}{size} || 0;
554                            $inodes++;
555                    }
556                    print "$inodes: $f [$size]\n";
557            }
558    
559            $size = int(($size+1023)/1024);
560    
561            my @ret = (255, $inodes+1000, $inodes, $size, $size-10, 1024);
562    
563            print "statfs: ",join(",",@ret),"\n";
564    
565            return @ret;
566    }
567    
568  sub e_unlink {  sub e_unlink {
569          my $file = filename_fixup(shift);          my $file = filename_fixup(shift);
570    
571          if (exists( $dirs{$file} )) {  #       if (exists( $dirs{$file} )) {
572                  print "unlink '$file' will re-read template names\n";  #               print "unlink '$file' will re-read template names\n";
573                  print Dumper($fuse_self);  #               print Dumper($fuse_self);
574                  $$fuse_self->{'read_filenames'}->();  #               $$fuse_self->{'read_filenames'}->();
575                  return 0;  #               return 0;
576          } elsif (exists( $files{$file} )) {          if (exists( $files{$file} )) {
577                  print "unlink '$file' will invalidate cache\n";                  print "unlink '$file' will invalidate cache\n";
578                  read_content($file,$files{$file}{id});                  read_content($file,$files{$file}{id});
579                  return 0;                  return 0;
# Line 521  __END__ Line 588  __END__
588    
589  Nothing.  Nothing.
590    
591    =head1 BUGS
592    
593    Size information (C<ls -s>) is wrong. It's a problem in upstream Fuse module
594    (for which I'm to blame lately), so when it gets fixes, C<Fuse::DBI> will
595    automagically pick it up.
596    
597  =head1 SEE ALSO  =head1 SEE ALSO
598    
599  C<FUSE (Filesystem in USErspace)> website  C<FUSE (Filesystem in USErspace)> website

Legend:
Removed from v.36  
changed lines
  Added in v.51

  ViewVC Help
Powered by ViewVC 1.1.26