diff --git a/lib/filecache.php b/lib/filecache.php index 8d0f3c84f93..7b7a2fac3ea 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -84,19 +84,28 @@ class OC_FileCache{ if($root=='/'){ $root=''; } - $path=$root.$path; - $parent=self::getParentId($path); - $id=self::getFileId($path); - if(isset(OC_FileCache::$savedData[$path])){ - $data=array_merge(OC_FileCache::$savedData[$path],$data); - unset(OC_FileCache::$savedData[$path]); + $fullpath=$root.$path; + $parent=self::getParentId($fullpath); + $id=self::getFileId($fullpath); + if(isset(OC_FileCache::$savedData[$fullpath])){ + $data=array_merge(OC_FileCache::$savedData[$fullpath],$data); + unset(OC_FileCache::$savedData[$fullpath]); } + + // add parent directory to the file cache if it does not exist yet. + if ($parent == -1 && $fullpath != $root) { + $parentDir = substr(dirname($path), 0, strrpos(dirname($path), DIRECTORY_SEPARATOR)); + self::scanFile($parentDir); + $parent = self::getParentId($fullpath); + } + if($id!=-1){ self::update($id,$data); return; } + if(!isset($data['size']) or !isset($data['mtime'])){//save incomplete data for the next time we write it - self::$savedData[$path]=$data; + self::$savedData[$fullpath]=$data; return; } if(!isset($data['encrypted'])){ @@ -113,9 +122,9 @@ class OC_FileCache{ $data['versioned']=(int)$data['versioned']; $user=OC_User::getUser(); $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, path_hash, size, mtime, ctime, mimetype, mimepart,`user`,writable,encrypted,versioned) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)'); - $result=$query->execute(array($parent,basename($path),$path,md5($path),$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$user,$data['writable'],$data['encrypted'],$data['versioned'])); + $result=$query->execute(array($parent,basename($fullpath),$fullpath,md5($fullpath),$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$user,$data['writable'],$data['encrypted'],$data['versioned'])); if(OC_DB::isError($result)){ - OC_Log::write('files','error while writing file('.$path.') to cache',OC_Log::ERROR); + OC_Log::write('files','error while writing file('.$fullpath.') to cache',OC_Log::ERROR); } }