Fixed deleteAll function for deleting all old versions of files (expireAll)

Added new readdir() method to all storage classes and handlers (only working implementation in local.php)
remotes/origin/stable45
Sam Tuke 2012-06-19 19:42:40 +07:00
parent f11e4d7cd6
commit 28a72e0e3c
7 changed files with 58 additions and 22 deletions

@ -49,6 +49,7 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{
OC_FakeDirStream::$dirs[$id]=$content;
return opendir('fakedir://'.$id);
}
public function readdir($path){}
public function stat($path){
$ctime=filectime($this->path);
$path=$this->stripPath($path);

@ -139,6 +139,8 @@ class OC_Filestorage_Shared extends OC_Filestorage {
}
}
public function readdir( $path ) {}
public function is_dir($path) {
if ($path == "" || $path == "/") {
return true;

@ -303,66 +303,88 @@ class Storage {
*/
public static function expireAll() {
function deleteAll($directory, $empty = false) {
function deleteAll( $directory, $empty = false ) {
if(substr($directory,-1) == "/") {
$directory = substr($directory,0,-1);
// strip leading slash
if( substr( $directory, 0, 1 ) == "/" ) {
$directory = substr( $directory, 1 );
}
// strip trailing slash
if( substr( $directory, -1) == "/" ) {
$directory = substr( $directory, 0, -1 );
}
if(!file_exists($directory) || !is_dir($directory)) {
$view = new \OC_FilesystemView('');
if ( !$view->file_exists( $directory ) || !$view->is_dir( $directory ) ) {
return false;
} elseif(!is_readable($directory)) {
} elseif( !$view->is_readable( $directory ) ) {
return false;
} else {
$directoryHandle = opendir($directory);
$foldername = \OCP\Config::getSystemValue('datadirectory') .'/' . \OCP\USER::getUser() .'/' . $directory; // have to set an absolute path for use with PHP's opendir as OC version doesn't work
$directoryHandle = opendir( $foldername );
while ($contents = readdir($directoryHandle)) {
while ( $contents = $view->readdir( $directoryHandle ) ) {
if( $contents != '.' && $contents != '..') {
if ( $contents != '.' && $contents != '..') {
$path = $directory . "/" . $contents;
if( is_dir($path) ) {
if ( $view->is_dir( $path ) ) {
deleteAll($path);
deleteAll( $path );
} else {
unlink($path);
$view->unlink( \OCP\USER::getUser() .'/' . $path ); // TODO: make unlink use same system path as is_dir
}
}
}
closedir( $directoryHandle );
//$view->closedir( $directoryHandle ); // TODO: implement closedir in OC_FSV
if( $empty == false ) {
if ( $empty == false ) {
if(!rmdir($directory)) {
if ( !$view->rmdir( $directory ) ) {
return false;
}
}
}
return true;
}
}
$dir = \OCP\Config::getSystemValue('files_versionsfolder', Storage::DEFAULTFOLDER);
deleteAll( $dir, true );
// if ( deleteAll( $dir, 1 ) ) {
//
// echo "<h1>deleted ok</h1>";
//
// } else {
//
// echo "<h1>not deleted</h1>";
//
// }
/*
// FIXME: make this path dynamic
$dir = '/home/samtuke/owncloud/git/oc5/data/admin/versions';
( deleteAll( $dir, 1 ) ? return true : return false );
*/
}

@ -28,6 +28,7 @@ abstract class OC_Filestorage{
abstract public function mkdir($path);
abstract public function rmdir($path);
abstract public function opendir($path);
abstract public function readdir($path);
abstract public function is_dir($path);
abstract public function is_file($path);
abstract public function stat($path);

@ -20,6 +20,9 @@ class OC_Filestorage_Local extends OC_Filestorage{
public function opendir($path){
return opendir($this->datadir.$path);
}
public function readdir($handle){
return readdir($handle);
}
public function is_dir($path){
if(substr($path,-1)=='/'){
$path=substr($path,0,-1);

@ -399,6 +399,9 @@ class OC_Filesystem{
static public function opendir($path){
return self::$defaultInstance->opendir($path);
}
static public function readdir($path){
return self::$defaultInstance->readdir($path);
}
static public function is_dir($path){
return self::$defaultInstance->is_dir($path);
}

@ -158,6 +158,10 @@ class OC_FilesystemView {
public function opendir($path){
return $this->basicOperation('opendir',$path,array('read'));
}
public function readdir($handle){
$fsLocal= new OC_Filestorage_Local( array( 'datadir' => '/' ) );
return $fsLocal->readdir( $handle );
}
public function is_dir($path){
if($path=='/'){
return true;