fix getAll(), refactor search by mime & search

This commit is contained in:
Jörn Friedrich Dreyer 2013-08-28 12:39:43 +02:00 committed by Victor Dubiniuk
parent 392c6b6832
commit 466fd8acda

View file

@ -230,15 +230,7 @@ class Shared_Cache extends Cache {
// normalize pattern // normalize pattern
$pattern = $this->normalize($pattern); $pattern = $this->normalize($pattern);
$ids = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL); $ids = $this->getAll();
foreach ($ids as $file) {
$folderBackend = \OCP\Share::getBackend('folder');
$children = $folderBackend->getChildren($file);
foreach ($children as $child) {
$ids[] = (int)$child['source'];
}
}
$files = array(); $files = array();
@ -248,7 +240,8 @@ class Shared_Cache extends Cache {
foreach ($chunks as $chunk) { foreach ($chunks as $chunk) {
$placeholders = join(',', array_fill(0, count($chunk), '?')); $placeholders = join(',', array_fill(0, count($chunk), '?'));
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag` $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
`encrypted`, `unencrypted_size`, `etag`
FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `fileid` IN (' . $placeholders . ')'; FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `fileid` IN (' . $placeholders . ')';
$result = \OC_DB::executeAudited($sql, array_merge(array($pattern), $chunk)); $result = \OC_DB::executeAudited($sql, array_merge(array($pattern), $chunk));
@ -280,13 +273,30 @@ class Shared_Cache extends Cache {
} }
$mimetype = $this->getMimetypeId($mimetype); $mimetype = $this->getMimetypeId($mimetype);
$ids = $this->getAll(); $ids = $this->getAll();
$placeholders = join(',', array_fill(0, count($ids), '?'));
$query = \OC_DB::prepare(' $files = array();
SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`
FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')' // divide into 1k chunks
); $chunks = array_chunk($ids, 1000);
$result = $query->execute(array_merge(array($mimetype), $ids));
return $result->fetchAll(); foreach ($chunks as $chunk) {
$placeholders = join(',', array_fill(0, count($ids), '?'));
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
`encrypted`, `unencrypted_size`, `etag`
FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')';
$result = \OC_DB::executeAudited($sql, array_merge(array($mimetype), $chunk));
while ($row = $result->fetchRow()) {
if (substr($row['path'], 0, 6)==='files/') {
$row['path'] = substr($row['path'],6); // remove 'files/' from path as it's relative to '/Shared'
$row['mimetype'] = $this->getMimetype($row['mimetype']);
$row['mimepart'] = $this->getMimetype($row['mimepart']);
$files[] = $row;
} // else skip results out of the files folder
}
}
return $files;
} }
/** /**
@ -308,7 +318,16 @@ class Shared_Cache extends Cache {
* @return int[] * @return int[]
*/ */
public function getAll() { public function getAll() {
return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL); $ids = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
$folderBackend = \OCP\Share::getBackend('folder');
foreach ($ids as $file) {
$children = $folderBackend->getChildren($file);
foreach ($children as $child) {
$ids[] = (int)$child['source'];
}
}
return $ids;
} }
/** /**