diff options
author | Jörn Friedrich Dreyer <jfd@butonic.de> | 2014-07-30 13:46:02 +0200 |
---|---|---|
committer | Jörn Friedrich Dreyer <jfd@butonic.de> | 2014-07-31 12:05:29 +0200 |
commit | a7b4cd77b1ea9657dca1929561afdb1ebeb161de (patch) | |
tree | fa094dbf778fe99862c1bcbb921254a2f770949d /apps/files_sharing | |
parent | 54d5d0327134c958c1610528d737aadef4f418ff (diff) | |
download | nextcloud-server-a7b4cd77b1ea9657dca1929561afdb1ebeb161de.tar.gz nextcloud-server-a7b4cd77b1ea9657dca1929561afdb1ebeb161de.zip |
traverse folders in php to search in shared files
Diffstat (limited to 'apps/files_sharing')
-rw-r--r-- | apps/files_sharing/lib/cache.php | 85 |
1 files changed, 26 insertions, 59 deletions
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 209aa49dfa4..7f7197307bd 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -275,12 +275,34 @@ class Shared_Cache extends Cache { */ public function search($pattern) { - $where = '`name` LIKE ? AND '; + $pattern = trim($pattern,'%'); - // normalize pattern - $value = $this->normalize($pattern); + $normalizedPattern = $this->normalize($pattern); - return $this->searchWithWhere($where, $value); + $result = array(); + $exploreDirs = array(''); + while (count($exploreDirs) > 0) { + $dir = array_pop($exploreDirs); + $files = $this->getFolderContents($dir); + // no results? + if (!$files) { + // maybe it's a single shared file + $file = $this->get(''); + if ($normalizedPattern === '' || stristr($file['name'], $normalizedPattern) !== false) { + $result[] = $file; + } + continue; + } + foreach ($files as $file) { + if ($normalizedPattern === '' || stristr($file['name'], $normalizedPattern) !== false) { + $result[] = $file; + } + if ($file['mimetype'] === 'httpd/unix-directory') { + $exploreDirs[] = ltrim($dir . '/' . $file['name'], '/'); + } + } + } + return $result; } @@ -297,10 +319,6 @@ class Shared_Cache extends Cache { $mimetype = null; } - // note: searchWithWhere is currently broken as it doesn't - // recurse into subdirs nor returns the correct - // file paths, so using getFolderContents() for now - $result = array(); $exploreDirs = array(''); while (count($exploreDirs) > 0) { @@ -327,57 +345,6 @@ class Shared_Cache extends Cache { } /** - * The maximum number of placeholders that can be used in an SQL query. - * Value MUST be <= 1000 for oracle: - * see ORA-01795 maximum number of expressions in a list is 1000 - * FIXME we should get this from doctrine as other DBs allow a lot more placeholders - */ - const MAX_SQL_CHUNK_SIZE = 1000; - - /** - * search for files with a custom where clause and value - * the $wherevalue will be array_merge()d with the file id chunks - * - * @param string $sqlwhere - * @param string $wherevalue - * @return array - */ - private function searchWithWhere($sqlwhere, $wherevalue, $chunksize = self::MAX_SQL_CHUNK_SIZE) { - - $ids = $this->getAll(); - - $files = array(); - - // divide into chunks - $chunks = array_chunk($ids, $chunksize); - - 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 ' . $sqlwhere . ' `fileid` IN (' . $placeholders . ')'; - - $stmt = \OC_DB::prepare($sql); - - $result = $stmt->execute(array_merge(array($wherevalue), $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']); - if ($row['encrypted'] or ($row['unencrypted_size'] > 0 and $row['mimetype'] === 'httpd/unix-directory')) { - $row['encrypted_size'] = $row['size']; - $row['size'] = $row['unencrypted_size']; - } - $files[] = $row; - } - } - return $files; - } - - /** * get the size of a folder and set it in the cache * * @param string $path |