From b5545b81c6c4a74d06f73299b906e099dcff9cdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= <jfd@butonic.de> Date: Thu, 3 Jul 2014 19:01:00 +0200 Subject: [PATCH] make search case insensitive on postgres and oracle --- lib/private/files/cache/cache.php | 24 +++++++++++++++++++++--- tests/lib/files/cache/cache.php | 6 ++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 48c57e2e43..72af474adf 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -458,9 +458,27 @@ class Cache { // normalize pattern $pattern = $this->normalize($pattern); - $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions` - FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `storage` = ?'; - $result = \OC_DB::executeAudited($sql, array($pattern, $this->getNumericStorageId())); + + $sql = ' + SELECT `fileid`, `storage`, `path`, `parent`, `name`, + `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, + `unencrypted_size`, `etag`, `permissions` + FROM `*PREFIX*filecache` + WHERE `storage` = ? AND '; + $dbtype = \OC_Config::getValue( 'dbtype', 'sqlite' ); + if($dbtype === 'oci') { + //remove starting and ending % from the pattern + $pattern = '^'.str_replace('%', '.*', $pattern).'$'; + $sql .= 'REGEXP_LIKE(`name`, ?, \'i\')'; + } else if($dbtype === 'pgsql') { + $sql .= '`name` ILIKE ?'; + } else { + $sql .= '`name` LIKE ?'; + } + $result = \OC_DB::executeAudited($sql, + array($this->getNumericStorageId(), $pattern) + ); + $files = array(); while ($row = $result->fetchRow()) { $row['mimetype'] = $this->getMimetype($row['mimetype']); diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php index 8ed2ecabd9..bf17f7a162 100644 --- a/tests/lib/files/cache/cache.php +++ b/tests/lib/files/cache/cache.php @@ -239,6 +239,12 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertEquals(1, count($this->cache->search('folder%'))); $this->assertEquals(3, count($this->cache->search('%'))); + // case insensitive search should match the same files + $this->assertEquals(2, count($this->cache->search('%Foo%'))); + $this->assertEquals(1, count($this->cache->search('Foo'))); + $this->assertEquals(1, count($this->cache->search('%Folder%'))); + $this->assertEquals(1, count($this->cache->search('Folder%'))); + $this->assertEquals(3, count($this->cache->searchByMime('foo'))); $this->assertEquals(2, count($this->cache->searchByMime('foo/file'))); } -- GitLab