Merge pull request #4207 from owncloud/search_shared_files
add initial search in shared files
This commit is contained in:
commit
735608f513
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace OC\Files\Cache;
|
namespace OC\Files\Cache;
|
||||||
|
use OCP\Share_Backend_Collection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Metadata cache for shared files
|
* Metadata cache for shared files
|
||||||
|
@ -226,7 +227,36 @@ class Shared_Cache extends Cache {
|
||||||
* @return array of file data
|
* @return array of file data
|
||||||
*/
|
*/
|
||||||
public function search($pattern) {
|
public function search($pattern) {
|
||||||
// TODO
|
|
||||||
|
// normalize pattern
|
||||||
|
$pattern = $this->normalize($pattern);
|
||||||
|
|
||||||
|
$ids = $this->getAll();
|
||||||
|
|
||||||
|
$files = array();
|
||||||
|
|
||||||
|
// divide into 1k chunks
|
||||||
|
$chunks = array_chunk($ids, 1000);
|
||||||
|
|
||||||
|
foreach ($chunks as $chunk) {
|
||||||
|
$placeholders = join(',', array_fill(0, count($chunk), '?'));
|
||||||
|
|
||||||
|
$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 . ')';
|
||||||
|
|
||||||
|
$result = \OC_DB::executeAudited($sql, array_merge(array($pattern), $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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $files;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -244,13 +274,30 @@ class Shared_Cache extends Cache {
|
||||||
}
|
}
|
||||||
$mimetype = $this->getMimetypeId($mimetype);
|
$mimetype = $this->getMimetypeId($mimetype);
|
||||||
$ids = $this->getAll();
|
$ids = $this->getAll();
|
||||||
|
|
||||||
|
$files = array();
|
||||||
|
|
||||||
|
// divide into 1k chunks
|
||||||
|
$chunks = array_chunk($ids, 1000);
|
||||||
|
|
||||||
|
foreach ($chunks as $chunk) {
|
||||||
$placeholders = join(',', array_fill(0, count($ids), '?'));
|
$placeholders = join(',', array_fill(0, count($ids), '?'));
|
||||||
$query = \OC_DB::prepare('
|
$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
|
||||||
SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`
|
`encrypted`, `unencrypted_size`, `etag`
|
||||||
FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')'
|
FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')';
|
||||||
);
|
|
||||||
$result = $query->execute(array_merge(array($mimetype), $ids));
|
$result = \OC_DB::executeAudited($sql, array_merge(array($mimetype), $chunk));
|
||||||
return $result->fetchAll();
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $files;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -272,7 +319,20 @@ 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');
|
||||||
|
if ($folderBackend instanceof Share_Backend_Collection) {
|
||||||
|
foreach ($ids as $file) {
|
||||||
|
/** @var $folderBackend Share_Backend_Collection */
|
||||||
|
$children = $folderBackend->getChildren($file);
|
||||||
|
foreach ($children as $child) {
|
||||||
|
$ids[] = (int)$child['source'];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -760,10 +760,10 @@ class Share {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the backend class for the specified item type
|
* @brief Get the backend class for the specified item type
|
||||||
* @param string Item type
|
* @param string $itemType
|
||||||
* @return Sharing backend object
|
* @return Share_Backend
|
||||||
*/
|
*/
|
||||||
private static function getBackend($itemType) {
|
public static function getBackend($itemType) {
|
||||||
if (isset(self::$backends[$itemType])) {
|
if (isset(self::$backends[$itemType])) {
|
||||||
return self::$backends[$itemType];
|
return self::$backends[$itemType];
|
||||||
} else if (isset(self::$backendTypes[$itemType]['class'])) {
|
} else if (isset(self::$backendTypes[$itemType]['class'])) {
|
||||||
|
|
Loading…
Reference in New Issue