reworked DB::new et al *again*
authorIan Beckwith <ianb@erislabs.net>
Mon, 18 Oct 2010 09:54:22 +0000 (10:54 +0100)
committerIan Beckwith <ianb@erislabs.net>
Mon, 18 Oct 2010 09:54:22 +0000 (10:54 +0100)
bin/id3fs-index
lib/ID3FS/DB.pm
sbin/id3fsd

index 88959f7..22cdf79 100755 (executable)
@@ -30,15 +30,27 @@ my $optret=GetOptions(
     "list|l"         => \$list,
     );
 
+if($list && !@ARGV)
+{
+    push(@ARGV, ".");
+}
 usage() if(!@ARGV || !$optret || $help);
 $init=1 unless($list);
 
-if(@ARGV > 1 && !defined($basedir))
+unless(defined($basedir) && defined($dbpath))
 {
-    die("$me: --basedir must be specified if multiple paths are supplied\n");
+    $basedir=ID3FS::DB::find_db($me, $init, @ARGV);
+    exit unless($basedir);
+    my $absbase=Cwd::abs_path($basedir);
+    for my $dir (@ARGV)
+    {
+       if(Cwd::abs_path($dir) !~ /^\Q$absbase\E/)
+       {
+           die("$me: $dir: must be under basedir $absbase - use --basedir to specify\n");
+       }
+    }
 }
-
-my $db=ID3FS::DB->new($me, $verbose, $init, $dbpath, $basedir, $ARGV[0]);
+my $db=ID3FS::DB->new($me, $verbose, $init, $basedir, $dbpath);
 exit unless($db);
 
 if($list)
index 246cd92..6b3cd99 100644 (file)
@@ -19,12 +19,8 @@ sub new
     $self->{me}=shift;
     $self->{verbose}=shift;
     my $init=shift;
-    my $dbpath=shift;
     $self->{base}=shift;
-    my $fallbackdir=shift;
-
-    $self->{dbpath}=$self->find_db($init, $dbpath, $fallbackdir);
-    return undef unless($self->{dbpath});
+    $self->{dbpath}=shift || ($self->{base} . "/" . $dbfile);
     $self->{absbase}=Cwd::abs_path($self->{base});
 
     my $connectstr="dbi:SQLite:dbname=$self->{dbpath}";
@@ -50,46 +46,36 @@ sub new
 
 sub find_db
 {
-    my($self, $init, $dbpath, $fallbackdir)=@_;
-    my $file=undef;
+    # class method
+    shift if(ref($_[0]) eq "ID3FS::DB");
+
+    my($me, $init, @dirs)=@_;
     my $base=undef;
-    if(defined($dbpath))
-    {
-       $file=$dbpath;
-    }
-    if(defined ($self->{base}))
-    {
-       $file="$self->{base}/$dbfile" unless defined($file);
-       $base=$self->{base};
-    }
-    elsif(defined($fallbackdir) && -d $fallbackdir)
+    for my $dir (@dirs)
     {
-       my $path=Cwd::abs_path($fallbackdir);
+       my $path=Cwd::abs_path($dir);
        do
        {
-           $file="$path/$dbfile";
            $base=$path;
            $path=~s/(.*)\/.*/$1/;
        }
-       while(! -f $file && length($path) && -d $path);
-       if(! -f $file)
+       while(! -f "$base/$dbfile" && length($path) && -d $path);
+       if(-f "$base/$dbfile")
        {
-           $file="$fallbackdir/$dbfile";
-           $base=$fallbackdir;
+           return $base;
        }
     }
-    else
-    {
-       print "$self->{me}: $fallbackdir: not a directory\n";
-       return undef;
-    }
-    if(!-f $file && !$init)
+    if(!-f "$base/$dbfile")
     {
-       print "$self->{me}: db not found at $file\n";
-       return undef;
+       unless($init)
+       {
+           print "$me: db not found at $base/$dbfile\n";
+           return undef;
+       }
+       $base=$dirs[0];
+
     }
-    $self->{base}=$base;
-    return $file;
+    return $base;
 }
 
 sub base_dir { return shift->{base}; }
index b46706a..1c36e66 100755 (executable)
@@ -29,7 +29,7 @@ usage() if(scalar(@ARGV) != 2 || !$optret || $help);
 my $source=shift;
 my $mountpoint=shift;
 
-my $db=ID3FS::DB->new($me, $verbose, 0, $dbpath, $source);
+my $db=ID3FS::DB->new($me, $verbose, 0, $source, $dbpath);
 exit unless($db);
 
 my $fuse=ID3FS::Fuse->new($db, $source, $mountpoint, $verbose, $tagdepth);