Skip to content
Snippets Groups Projects
Commit 21cfd101 authored by Robin Appelman's avatar Robin Appelman
Browse files

Repair broken parent link in the scanner

parent ecc41fe0
Branches
No related tags found
No related merge requests found
......@@ -100,19 +100,20 @@ class Scanner extends BasicEmitter {
\OC_Hook::emit('\OC\Files\Cache\Scanner', 'scan_file', array('path' => $file, 'storage' => $this->storageId));
$data = $this->getData($file);
if ($data) {
if ($file and !$parentExistsInCache) {
$parent = dirname($file);
if ($parent === '.' or $parent === '/') {
$parent = '';
}
if (!$this->cache->inCache($parent)) {
$this->scanFile($parent);
$parentId = $this->cache->getId($parent);
if ($file and $parentId === -1) {
$parentData = $this->scanFile($parent);
$parentId = $parentData['fileid'];
}
if ($parent) {
$data['parent'] = $parentId;
}
$newData = $data;
$cacheData = $this->cache->get($file);
if ($cacheData) {
if ($reuseExisting) {
if ($cacheData and $reuseExisting) {
// prevent empty etag
if (empty($cacheData['etag'])) {
$etag = $data['etag'];
......@@ -138,7 +139,8 @@ class Scanner extends BasicEmitter {
"!!! No reuse of etag for '$file' !!! \ncache: $cacheDataString \ndata: $dataString",
\OCP\Util::DEBUG);
}
}
} else {
$newData = $data;
}
if (!empty($newData)) {
$data['fileid'] = $this->addToCache($file, $newData);
......
......@@ -32,7 +32,6 @@ class Scanner extends \PHPUnit_Framework_TestCase {
function tearDown() {
if ($this->cache) {
$ids = $this->cache->getAll();
$this->cache->clear();
}
}
......@@ -233,4 +232,52 @@ class Scanner extends \PHPUnit_Framework_TestCase {
$this->assertInternalType('string', $newData0['etag']);
$this->assertNotEmpty($newData0['etag']);
}
public function testRepairParent() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$oldFolderId = $this->cache->getId('folder');
// delete the folder without removing the childs
$sql = 'DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?';
\OC_DB::executeAudited($sql, array($oldFolderId));
$cachedData = $this->cache->get('folder/bar.txt');
$this->assertEquals($oldFolderId, $cachedData['parent']);
$this->assertFalse($this->cache->inCache('folder'));
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('folder'));
$newFolderId = $this->cache->getId('folder');
$this->assertNotEquals($oldFolderId, $newFolderId);
$cachedData = $this->cache->get('folder/bar.txt');
$this->assertEquals($newFolderId, $cachedData['parent']);
}
public function testRepairParentShallow() {
$this->fillTestFolders();
$this->scanner->scan('');
$this->assertTrue($this->cache->inCache('folder/bar.txt'));
$oldFolderId = $this->cache->getId('folder');
// delete the folder without removing the childs
$sql = 'DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?';
\OC_DB::executeAudited($sql, array($oldFolderId));
$cachedData = $this->cache->get('folder/bar.txt');
$this->assertEquals($oldFolderId, $cachedData['parent']);
$this->assertFalse($this->cache->inCache('folder'));
$this->scanner->scan('folder', \OC\Files\Cache\Scanner::SCAN_SHALLOW);
$this->assertTrue($this->cache->inCache('folder'));
$newFolderId = $this->cache->getId('folder');
$this->assertNotEquals($oldFolderId, $newFolderId);
$cachedData = $this->cache->get('folder/bar.txt');
$this->assertEquals($newFolderId, $cachedData['parent']);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment