From: Ian Beckwith Date: Mon, 11 Oct 2010 22:43:54 +0000 (+0100) Subject: fix pruning deleted files X-Git-Tag: debian/1.0-1~105 X-Git-Url: http://erislabs.net/gitweb/?p=id3fs.git;a=commitdiff_plain;h=8452f6a2f8603a378c41f333087ab98d15e7bd5b fix pruning deleted files --- diff --git a/bin/id3fs-index b/bin/id3fs-index index af8fee3..88959f7 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -88,7 +88,10 @@ sub wanted sub prune { my $dir=shift; + $dir=Cwd::abs_path($dir); return unless(opendir(DIR, $dir)); + my $base=Cwd::abs_path($db->base_dir()); + $dir=~s/^$base\/?//; my @oldfiles=$db->files_in($dir); my @newfiles=grep { !/^\.\.?$/; } readdir(DIR); closedir(DIR); @@ -100,9 +103,8 @@ sub prune { unless(exists($hash{$file})) { - # FIXME: add path, rebasify $files_pruned=1; - $db->unindex($file); + $db->unindex($dir, $file); } } } diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 3e91bdd..c1d6cd6 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -85,6 +85,11 @@ sub find_db $base=$fallbackdir; } } + else + { + print "$self->{me}: $fallbackdir: not a directory\n"; + return undef; + } if(!-f $file && !$init) { print "$self->{me}: db not found at $file\n"; @@ -217,7 +222,7 @@ sub relativise sub add { my($self,$path)=@_; - my $relpath=$path; + my $relpath=Cwd::abs_path($path); $relpath =~ s/^\Q$self->{base}\E\/?//; my($filepart,$pathpart); if($relpath !~ /\//) @@ -333,14 +338,24 @@ sub add_relation sub files_in { my ($self, $dir)=@_; - $dir=~s/^$self->{base}\/?//; my $sql=("SELECT files.name FROM files\n" . "INNER JOIN paths ON files.paths_id=paths.id\n" . "WHERE paths.name=?\n"); - my $files=$self->cmd_rows($sql, $dir); - return(map { $_->[0]; } @$files); +# print "files_in: SQL: $sql\n"; + return($self->cmd_firstcol($sql, $dir)); } +sub unindex +{ + my($self, $path, $file)=@_; + my $sql=("DELETE FROM files WHERE id IN (" . + "\tSELECT files.id FROM files\n" . + "\tINNER JOIN paths ON paths.id=files.paths_id\n" . + "\tWHERE paths.name=? and files.name=? )\n"); + $self->cmd_rows($sql, $path, $file); +} + + sub prune_directories { my($self)=@_; @@ -366,7 +381,7 @@ sub prune_paths return unless(@ids); my $sql=("DELETE FROM files WHERE paths_id IN (\n\t" . join(', ', map { "\"$_\""; } @ids). "\n\t)"); - print "SQL: \n", $sql, "\n"; +# print "SQL: \n", $sql, "\n"; $self->cmd($sql); } @@ -401,7 +416,7 @@ sub remove_unused VACUUM EOT - print "SQL: $sql\n"; +# print "SQL: $sql\n"; my @sql=split(/\n\n/, $sql); $self->cmd($_) for (@sql); }