diff options
20 files changed, 215 insertions, 98 deletions
diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php index fa6262d24ad..342614236d7 100644 --- a/core/Command/Maintenance/Install.php +++ b/core/Command/Maintenance/Install.php @@ -61,6 +61,7 @@ class Install extends Command { ->addOption('database-user', null, InputOption::VALUE_REQUIRED, 'User name to connect to the database') ->addOption('database-pass', null, InputOption::VALUE_OPTIONAL, 'Password of the database user', null) ->addOption('database-table-prefix', null, InputOption::VALUE_OPTIONAL, 'Prefix for all tables (default: oc_)', null) + ->addOption('database-table-space', null, InputOption::VALUE_OPTIONAL, 'Table space of the database (oci only)', null) ->addOption('admin-user', null, InputOption::VALUE_REQUIRED, 'User name of the admin account', 'admin') ->addOption('admin-pass', null, InputOption::VALUE_REQUIRED, 'Password of the admin account') ->addOption('data-dir', null, InputOption::VALUE_REQUIRED, 'Path to data directory', \OC::$SERVERROOT."/data"); @@ -171,6 +172,9 @@ class Install extends Command { 'adminpass' => $adminPassword, 'directory' => $dataDir ]; + if ($db === 'oci') { + $options['dbtablespace'] = $input->getParameterOption('--database-table-space', ''); + } return $options; } diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index a23be624542..35bb83b85f4 100644 --- a/lib/private/Authentication/Token/DefaultTokenMapper.php +++ b/lib/private/Authentication/Token/DefaultTokenMapper.php @@ -156,7 +156,7 @@ class DefaultTokenMapper extends Mapper { public function deleteByName($name) { $qb = $this->db->getQueryBuilder(); $qb->delete('authtoken') - ->where($qb->expr()->eq('name', $qb->createNamedParameter($name))); + ->where($qb->expr()->eq('name', $qb->createNamedParameter($name), IQueryBuilder::PARAM_STR)); $qb->execute(); } diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php index 4645adc6c5b..078e1eef4d3 100644 --- a/lib/private/Comments/Manager.php +++ b/lib/private/Comments/Manager.php @@ -411,9 +411,12 @@ class Manager implements ICommentsManager { */ public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user) { $qb = $this->dbConn->getQueryBuilder(); - $query = $qb->select('fileid', $qb->createFunction( - 'COUNT(' . $qb->getColumnName('c.id') . ')') - )->from('comments', 'c') + $query = $qb->select('f.fileid') + ->selectAlias( + $qb->createFunction('COUNT(' . $qb->getColumnName('c.id') . ')'), + 'num_ids' + ) + ->from('comments', 'c') ->innerJoin('c', 'filecache', 'f', $qb->expr()->andX( $qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')), $qb->expr()->eq('f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT)) @@ -431,9 +434,13 @@ class Manager implements ICommentsManager { ->groupBy('f.fileid'); $resultStatement = $query->execute(); - return array_map(function ($count) { - return (int)$count; - }, $resultStatement->fetchAll(\PDO::FETCH_KEY_PAIR)); + + $results = []; + while ($row = $resultStatement->fetch()) { + $results[$row['fileid']] = (int) $row['num_ids']; + } + $resultStatement->closeCursor(); + return $results; } /** diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php index f172260df79..a32ae4a1827 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php @@ -31,6 +31,7 @@ use OC\DB\QueryBuilder\QueryFunction; use OC\DB\QueryBuilder\QuoteHelper; use OCP\DB\QueryBuilder\IExpressionBuilder; use OCP\DB\QueryBuilder\ILiteral; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryFunction; use OCP\IDBConnection; @@ -351,6 +352,28 @@ class ExpressionBuilder implements IExpressionBuilder { } /** + * Creates a $x = '' statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function emptyString($x) { + return $this->eq($x, $this->literal('', IQueryBuilder::PARAM_STR)); + } + + /** + * Creates a `$x <> ''` statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function nonEmptyString($x) { + return $this->neq($x, $this->literal('', IQueryBuilder::PARAM_STR)); + } + + /** * Binary AND Operator copies a bit to the result if it exists in both operands. * * @param string|ILiteral $x The field or value to check diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php index 179ce72e8e1..693d2faecff 100644 --- a/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php +++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/OCIExpressionBuilder.php @@ -138,6 +138,28 @@ class OCIExpressionBuilder extends ExpressionBuilder { } /** + * Creates a $x = '' statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function emptyString($x) { + return $this->isNull($x); + } + + /** + * Creates a `$x <> ''` statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function nonEmptyString($x) { + return $this->isNotNull($x); + } + + /** * Returns a IQueryFunction that casts the column to the given type * * @param string $column @@ -166,6 +188,6 @@ class OCIExpressionBuilder extends ExpressionBuilder { public function iLike($x, $y, $type = null) { $x = $this->helper->quoteColumnName($x); $y = $this->helper->quoteColumnName($y); - return new QueryFunction('REGEXP_LIKE('.$x.', \'^\' || REPLACE('.$y.', \'%\', \'.*\') || \'$\', \'i\')'); + return new QueryFunction('REGEXP_LIKE(' . $x . ', \'^\' || REPLACE(REPLACE(' . $y . ', \'%\', \'.*\'), \'_\', \'.\') || \'$\', \'i\')'); } } diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index 217789ce728..3fc827c9680 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -560,7 +560,7 @@ class QueryBuilder implements IQueryBuilder { public function from($from, $alias = null) { $this->queryBuilder->from( $this->getTableName($from), - $alias + $this->quoteAlias($alias) ); return $this; @@ -585,9 +585,9 @@ class QueryBuilder implements IQueryBuilder { */ public function join($fromAlias, $join, $alias, $condition = null) { $this->queryBuilder->join( - $fromAlias, + $this->quoteAlias($fromAlias), $this->getTableName($join), - $alias, + $this->quoteAlias($alias), $condition ); @@ -613,9 +613,9 @@ class QueryBuilder implements IQueryBuilder { */ public function innerJoin($fromAlias, $join, $alias, $condition = null) { $this->queryBuilder->innerJoin( - $fromAlias, + $this->quoteAlias($fromAlias), $this->getTableName($join), - $alias, + $this->quoteAlias($alias), $condition ); @@ -641,9 +641,9 @@ class QueryBuilder implements IQueryBuilder { */ public function leftJoin($fromAlias, $join, $alias, $condition = null) { $this->queryBuilder->leftJoin( - $fromAlias, + $this->quoteAlias($fromAlias), $this->getTableName($join), - $alias, + $this->quoteAlias($alias), $condition ); @@ -669,9 +669,9 @@ class QueryBuilder implements IQueryBuilder { */ public function rightJoin($fromAlias, $join, $alias, $condition = null) { $this->queryBuilder->rightJoin( - $fromAlias, + $this->quoteAlias($fromAlias), $this->getTableName($join), - $alias, + $this->quoteAlias($alias), $condition ); @@ -1193,4 +1193,18 @@ class QueryBuilder implements IQueryBuilder { return $this->helper->quoteColumnName($tableAlias . $column); } + + /** + * Returns the column name quoted and with table alias prefix as needed by the implementation + * + * @param string $alias + * @return string + */ + public function quoteAlias($alias) { + if ($alias === '' || $alias === null) { + return $alias; + } + + return $this->helper->quoteColumnName($alias); + } } diff --git a/lib/private/DB/QueryBuilder/QuoteHelper.php b/lib/private/DB/QueryBuilder/QuoteHelper.php index 705c3a89712..8821863ed07 100644 --- a/lib/private/DB/QueryBuilder/QuoteHelper.php +++ b/lib/private/DB/QueryBuilder/QuoteHelper.php @@ -70,7 +70,7 @@ class QuoteHelper { list($alias, $columnName) = explode('.', $string, 2); if ($columnName === '*') { - return $string; + return '`' . $alias . '`.*'; } return '`' . $alias . '`.`' . $columnName . '`'; diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php index 7ecad6e8cfb..9466aaf6c89 100644 --- a/lib/private/Files/Config/UserMountCache.php +++ b/lib/private/Files/Config/UserMountCache.php @@ -365,6 +365,11 @@ class UserMountCache implements IUserMountCache { $result = $query->execute(); - return $result->fetchAll(\PDO::FETCH_KEY_PAIR); + $results = []; + while ($row = $result->fetch()) { + $results[$row['user_id']] = $row['size']; + } + $result->closeCursor(); + return $results; } } diff --git a/lib/private/Repair/NC12/UpdateLanguageCodes.php b/lib/private/Repair/NC12/UpdateLanguageCodes.php index 891473f51a7..f4a1204543b 100644 --- a/lib/private/Repair/NC12/UpdateLanguageCodes.php +++ b/lib/private/Repair/NC12/UpdateLanguageCodes.php @@ -23,6 +23,7 @@ namespace OC\Repair\NC12; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IConfig; use OCP\IDBConnection; use OCP\Migration\IOutput; @@ -80,7 +81,7 @@ class UpdateLanguageCodes implements IRepairStep { ->set('configvalue', $qb->createNamedParameter($newCode)) ->where($qb->expr()->eq('appid', $qb->createNamedParameter('core'))) ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang'))) - ->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($oldCode))) + ->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($oldCode), IQueryBuilder::PARAM_STR)) ->execute(); $output->info('Changed ' . $affectedRows . ' setting(s) from "' . $oldCode . '" to "' . $newCode . '" in preferences table.'); diff --git a/lib/private/Repair/NC13/RepairInvalidPaths.php b/lib/private/Repair/NC13/RepairInvalidPaths.php index 5a4187949a7..29a0e1ed157 100644 --- a/lib/private/Repair/NC13/RepairInvalidPaths.php +++ b/lib/private/Repair/NC13/RepairInvalidPaths.php @@ -64,17 +64,19 @@ class RepairInvalidPaths implements IRepairStep { ); //select f.path, f.parent,p.path from oc_filecache f inner join oc_filecache p on f.parent=p.fileid and p.path!='' where f.path != p.path || '/' || f.name; - $query = $builder->select('f.fileid', 'f.path', 'p.path AS parent_path', 'f.name', 'f.parent', 'f.storage', 'p.storage as parent_storage') + $builder->select('f.fileid', 'f.path', 'f.name', 'f.parent', 'f.storage') + ->selectAlias('p.path', 'parent_path') + ->selectAlias('p.storage', 'parent_storage') ->from('filecache', 'f') ->innerJoin('f', 'filecache', 'p', $builder->expr()->andX( $builder->expr()->eq('f.parent', 'p.fileid'), - $builder->expr()->neq('p.name', $builder->createNamedParameter('')) + $builder->expr()->nonEmptyString('p.name') )) ->where($builder->expr()->neq('f.path', $computedPath)) ->setMaxResults(self::MAX_ROWS); do { - $result = $query->execute(); + $result = $builder->execute(); $rows = $result->fetchAll(); foreach ($rows as $row) { yield $row; diff --git a/lib/private/Share/Share.php b/lib/private/Share/Share.php index 8938c6f3066..93117bf3c7e 100644 --- a/lib/private/Share/Share.php +++ b/lib/private/Share/Share.php @@ -338,6 +338,7 @@ class Share extends Constants { } } } + $result->closeCursor(); } } @@ -1460,8 +1461,9 @@ class Share extends Constants { ->from('share') ->where($qb->expr()->eq('id', $qb->createParameter('shareId'))) ->setParameter(':shareId', $shareId); - $result = $qb->execute(); - $result = $result->fetch(); + $dbResult = $qb->execute(); + $result = $dbResult->fetch(); + $dbResult->closeCursor(); if (empty($result)) { throw new \Exception('Share not found'); diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index ded807a223b..8f3c98d4b5e 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -34,6 +34,7 @@ namespace OC\User; use OC\Hooks\PublicEmitter; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IUser; use OCP\IUserBackend; use OCP\IUserManager; @@ -436,7 +437,7 @@ class Manager extends PublicEmitter implements IUserManager { ->from('preferences') ->where($queryBuilder->expr()->eq('appid', $queryBuilder->createNamedParameter('core'))) ->andWhere($queryBuilder->expr()->eq('configkey', $queryBuilder->createNamedParameter('enabled'))) - ->andWhere($queryBuilder->expr()->eq('configvalue', $queryBuilder->createNamedParameter('false'))); + ->andWhere($queryBuilder->expr()->eq('configvalue', $queryBuilder->createNamedParameter('false'), IQueryBuilder::PARAM_STR)); $query = $queryBuilder->execute(); diff --git a/lib/public/DB/QueryBuilder/IExpressionBuilder.php b/lib/public/DB/QueryBuilder/IExpressionBuilder.php index c123875b803..eab93b52f8a 100644 --- a/lib/public/DB/QueryBuilder/IExpressionBuilder.php +++ b/lib/public/DB/QueryBuilder/IExpressionBuilder.php @@ -305,6 +305,24 @@ interface IExpressionBuilder { */ public function notIn($x, $y, $type = null); + /** + * Creates a $x = '' statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function emptyString($x); + + /** + * Creates a `$x <> ''` statement, because Oracle needs a different check + * + * @param string $x The field in string format to be inspected by the comparison. + * @return string + * @since 13.0.0 + */ + public function nonEmptyString($x); + /** * Creates a bitwise AND comparison diff --git a/tests/lib/Comments/ManagerTest.php b/tests/lib/Comments/ManagerTest.php index 24c634be137..b04f3bd567e 100644 --- a/tests/lib/Comments/ManagerTest.php +++ b/tests/lib/Comments/ManagerTest.php @@ -307,29 +307,9 @@ class ManagerTest extends TestCase { } public function testGetNumberOfUnreadCommentsForFolder() { - // 2 comment for 1111 with 1 before read marker - // 2 comments for 1112 with no read marker - // 1 comment for 1113 before read marker - // 1 comment for 1114 with no read marker - $this->addDatabaseEntry(0, 0, null, null, '1112'); - for ($i = 1; $i < 5; $i++) { - $this->addDatabaseEntry(0, 0, null, null, '111' . $i); - } - $this->addDatabaseEntry(0, 0, (new \DateTime())->modify('-2 days'), null, '1111'); - $user = $this->createMock(IUser::class); - $user->expects($this->any()) - ->method('getUID') - ->will($this->returnValue('comment_test')); - - $manager = $this->getManager(); - - $manager->setReadMark('files', '1111', (new \DateTime())->modify('-1 days'), $user); - $manager->setReadMark('files', '1113', (new \DateTime()), $user); - $query = $this->connection->getQueryBuilder(); $query->insert('filecache') ->values([ - 'fileid' => $query->createParameter('fileid'), 'parent' => $query->createNamedParameter(1000), 'size' => $query->createNamedParameter(10), 'mtime' => $query->createNamedParameter(10), @@ -338,17 +318,37 @@ class ManagerTest extends TestCase { 'path_hash' => $query->createParameter('path'), ]); - for ($i = 1111; $i < 1115; $i++) { + $fileIds = []; + for ($i = 0; $i < 4; $i++) { $query->setParameter('path', 'path_' . $i); - $query->setParameter('fileid', $i); $query->execute(); + $fileIds[] = $query->getLastInsertId(); } + // 2 comment for 1111 with 1 before read marker + // 2 comments for 1112 with no read marker + // 1 comment for 1113 before read marker + // 1 comment for 1114 with no read marker + $this->addDatabaseEntry(0, 0, null, null, $fileIds[1]); + for ($i = 0; $i < 4; $i++) { + $this->addDatabaseEntry(0, 0, null, null, $fileIds[$i]); + } + $this->addDatabaseEntry(0, 0, (new \DateTime())->modify('-2 days'), null, $fileIds[0]); + $user = $this->createMock(IUser::class); + $user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue('comment_test')); + + $manager = $this->getManager(); + + $manager->setReadMark('files', (string) $fileIds[0], (new \DateTime())->modify('-1 days'), $user); + $manager->setReadMark('files', (string) $fileIds[2], (new \DateTime()), $user); + $amount = $manager->getNumberOfUnreadCommentsForFolder(1000, $user); $this->assertEquals([ - '1111' => 1, - '1112' => 2, - '1114' => 1, + $fileIds[0] => 1, + $fileIds[1] => 2, + $fileIds[3] => 1, ], $amount); } diff --git a/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php b/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php index c270e105fc1..e89da0fbc92 100644 --- a/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php +++ b/tests/lib/DB/QueryBuilder/FunctionBuilderTest.php @@ -44,6 +44,8 @@ class FunctionBuilderTest extends TestCase { $query = $this->connection->getQueryBuilder(); $query->select($query->func()->concat($query->createNamedParameter('foo'), new Literal("'bar'"))); + $query->from('appconfig') + ->setMaxResults(1); $this->assertEquals('foobar', $query->execute()->fetchColumn()); } @@ -52,6 +54,8 @@ class FunctionBuilderTest extends TestCase { $query = $this->connection->getQueryBuilder(); $query->select($query->func()->md5($query->createNamedParameter('foobar'))); + $query->from('appconfig') + ->setMaxResults(1); $this->assertEquals(md5('foobar'), $query->execute()->fetchColumn()); } @@ -60,6 +64,8 @@ class FunctionBuilderTest extends TestCase { $query = $this->connection->getQueryBuilder(); $query->select($query->func()->substring($query->createNamedParameter('foobar'), new Literal(2), $query->createNamedParameter(2))); + $query->from('appconfig') + ->setMaxResults(1); $this->assertEquals('oo', $query->execute()->fetchColumn()); } @@ -68,6 +74,8 @@ class FunctionBuilderTest extends TestCase { $query = $this->connection->getQueryBuilder(); $query->select($query->func()->substring($query->createNamedParameter('foobar'), new Literal(2))); + $query->from('appconfig') + ->setMaxResults(1); $this->assertEquals('oobar', $query->execute()->fetchColumn()); } diff --git a/tests/lib/DB/QueryBuilder/QueryBuilderTest.php b/tests/lib/DB/QueryBuilder/QueryBuilderTest.php index 150c772b26c..e264fde6ec7 100644 --- a/tests/lib/DB/QueryBuilder/QueryBuilderTest.php +++ b/tests/lib/DB/QueryBuilder/QueryBuilderTest.php @@ -472,15 +472,15 @@ class QueryBuilderTest extends \Test\TestCase { public function dataFrom() { return [ ['data', null, null, null, [['table' => '`*PREFIX*data`', 'alias' => null]], '`*PREFIX*data`'], - ['data', 't', null, null, [['table' => '`*PREFIX*data`', 'alias' => 't']], '`*PREFIX*data` t'], + ['data', 't', null, null, [['table' => '`*PREFIX*data`', 'alias' => '`t`']], '`*PREFIX*data` `t`'], ['data1', null, 'data2', null, [ ['table' => '`*PREFIX*data1`', 'alias' => null], ['table' => '`*PREFIX*data2`', 'alias' => null] ], '`*PREFIX*data1`, `*PREFIX*data2`'], ['data', 't1', 'data', 't2', [ - ['table' => '`*PREFIX*data`', 'alias' => 't1'], - ['table' => '`*PREFIX*data`', 'alias' => 't2'] - ], '`*PREFIX*data` t1, `*PREFIX*data` t2'], + ['table' => '`*PREFIX*data`', 'alias' => '`t1`'], + ['table' => '`*PREFIX*data`', 'alias' => '`t2`'] + ], '`*PREFIX*data` `t1`, `*PREFIX*data` `t2`'], ]; } @@ -515,18 +515,18 @@ class QueryBuilderTest extends \Test\TestCase { return [ [ 'd1', 'data2', null, null, - ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], - '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` ON ' + ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` ON ' ], [ 'd1', 'data2', 'd2', null, - ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]], - '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` d2 ON ' + ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` `d2` ON ' ], [ - 'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`', - ['d1' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]], - '`*PREFIX*data1` d1 INNER JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`' + 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`', + ['`d1`' => [['joinType' => 'inner', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]], + '`*PREFIX*data1` `d1` INNER JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`' ], ]; @@ -596,18 +596,18 @@ class QueryBuilderTest extends \Test\TestCase { return [ [ 'd1', 'data2', null, null, - ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], - '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` ON ' + ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` ON ' ], [ 'd1', 'data2', 'd2', null, - ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]], - '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` d2 ON ' + ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` `d2` ON ' ], [ - 'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`', - ['d1' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]], - '`*PREFIX*data1` d1 LEFT JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`' + 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`', + ['`d1`' => [['joinType' => 'left', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]], + '`*PREFIX*data1` `d1` LEFT JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`' ], ]; } @@ -646,18 +646,18 @@ class QueryBuilderTest extends \Test\TestCase { return [ [ 'd1', 'data2', null, null, - ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], - '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` ON ' + ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => null, 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` ON ' ], [ 'd1', 'data2', 'd2', null, - ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => null]]], - '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` d2 ON ' + ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => null]]], + '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` `d2` ON ' ], [ - 'd1', 'data2', 'd2', 'd1.`field1` = d2.`field2`', - ['d1' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => 'd2', 'joinCondition' => 'd1.`field1` = d2.`field2`']]], - '`*PREFIX*data1` d1 RIGHT JOIN `*PREFIX*data2` d2 ON d1.`field1` = d2.`field2`' + 'd1', 'data2', 'd2', '`d1`.`field1` = `d2`.`field2`', + ['`d1`' => [['joinType' => 'right', 'joinTable' => '`*PREFIX*data2`', 'joinAlias' => '`d2`', 'joinCondition' => '`d1`.`field1` = `d2`.`field2`']]], + '`*PREFIX*data1` `d1` RIGHT JOIN `*PREFIX*data2` `d2` ON `d1`.`field1` = `d2`.`field2`' ], ]; } diff --git a/tests/lib/Files/Cache/QuerySearchHelperTest.php b/tests/lib/Files/Cache/QuerySearchHelperTest.php index f458ef039e1..850cee066a1 100644 --- a/tests/lib/Files/Cache/QuerySearchHelperTest.php +++ b/tests/lib/Files/Cache/QuerySearchHelperTest.php @@ -129,6 +129,8 @@ class QuerySearchHelperTest extends TestCase { $builder->insert('filecache') ->values($values) ->execute(); + + return $builder->getLastInsertId(); } private function search(ISearchOperator $operator) { @@ -139,34 +141,34 @@ class QuerySearchHelperTest extends TestCase { public function comparisonProvider() { return [ - [new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN, 'mtime', 125), [1002]], - [new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), [1001]], + [new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN, 'mtime', 125), [1]], + [new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), [0]], [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 125), []], - [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 50), [1001, 1002]], - [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'name', 'foobar'), [1001]], - [new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', 'foo%'), [1001, 1002]], - [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', 'image/jpg'), [1001]], - [new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', 'image/%'), [1001, 1002]], + [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 50), [0, 1]], + [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'name', 'foobar'), [0]], + [new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', 'foo%'), [0, 1]], + [new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mimetype', 'image/jpg'), [0]], + [new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', 'image/%'), [0, 1]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_AND, [ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'size', 50), - new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), [1001] - ]), [1001]], + new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), [0] + ]), [0]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_OR, [ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mtime', 100), new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mtime', 150), - ]), [1001, 1002]], + ]), [0, 1]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_NOT, [ new SearchComparison(ISearchComparison::COMPARE_EQUAL, 'mtime', 150), - ]), [1001]], + ]), [0]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_NOT, [ new SearchComparison(ISearchComparison::COMPARE_GREATER_THAN, 'mtime', 125), - ]), [1001]], + ]), [0]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_NOT, [ new SearchComparison(ISearchComparison::COMPARE_LESS_THAN, 'mtime', 125), - ]), [1002]], + ]), [1]], [new SearchBinaryOperator(ISearchBinaryOperator::OPERATOR_NOT, [ new SearchComparison(ISearchComparison::COMPARE_LIKE, 'name', '%bar'), - ]), [1002]], + ]), [1]], ]; } @@ -178,22 +180,25 @@ class QuerySearchHelperTest extends TestCase { * @param array $fileIds */ public function testComparison(ISearchOperator $operator, array $fileIds) { - $this->addCacheEntry([ + $fileId = []; + $fileId[] = $this->addCacheEntry([ 'path' => 'foobar', - 'fileid' => 1001, 'mtime' => 100, 'size' => 50, 'mimetype' => 'image/jpg' ]); - $this->addCacheEntry([ + $fileId[] = $this->addCacheEntry([ 'path' => 'fooasd', - 'fileid' => 1002, 'mtime' => 150, 'size' => 50, 'mimetype' => 'image/png' ]); + $fileIds = array_map(function($i) use ($fileId) { + return $fileId[$i]; + }, $fileIds); + $results = $this->search($operator); sort($fileIds); diff --git a/tests/lib/Files/Config/UserMountCacheTest.php b/tests/lib/Files/Config/UserMountCacheTest.php index f455dc987af..a96b385fcbf 100644 --- a/tests/lib/Files/Config/UserMountCacheTest.php +++ b/tests/lib/Files/Config/UserMountCacheTest.php @@ -332,7 +332,7 @@ class UserMountCacheTest extends TestCase { $id = (int)$this->connection->lastInsertId('*PREFIX*filecache'); $this->fileIds[] = $id; } else { - $sql = 'SELECT fileid FROM *PREFIX*filecache WHERE `storage` = ? AND `path_hash` =?'; + $sql = 'SELECT `fileid` FROM `*PREFIX*filecache` WHERE `storage` = ? AND `path_hash` =?'; $query = $this->connection->prepare($sql); $query->execute([$storageId, md5($internalPath)]); return (int)$query->fetchColumn(); diff --git a/tests/lib/Repair/NC12/UpdateLanguageCodesTest.php b/tests/lib/Repair/NC12/UpdateLanguageCodesTest.php index 4379d1ba589..46422589541 100644 --- a/tests/lib/Repair/NC12/UpdateLanguageCodesTest.php +++ b/tests/lib/Repair/NC12/UpdateLanguageCodesTest.php @@ -24,6 +24,7 @@ namespace Test\Repair\NC12; use OC\Repair\NC12\UpdateLanguageCodes; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IConfig; use OCP\Migration\IOutput; use Test\TestCase; @@ -152,7 +153,7 @@ class UpdateLanguageCodesTest extends TestCase { ->where($qb->expr()->eq('userid', $qb->createNamedParameter($user['userid']))) ->andWhere($qb->expr()->eq('appid', $qb->createNamedParameter('core'))) ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang'))) - ->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($user['configvalue']))) + ->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($user['configvalue']), IQueryBuilder::PARAM_STR)) ->execute(); } } diff --git a/tests/lib/Share/ShareTest.php b/tests/lib/Share/ShareTest.php index 40e88d597a4..4ce40a2accd 100644 --- a/tests/lib/Share/ShareTest.php +++ b/tests/lib/Share/ShareTest.php @@ -1246,7 +1246,9 @@ class ShareTest extends \Test\TestCase { ->setParameter('owner', $this->user1->getUID()) ->setParameter('share_type', \OCP\Share::SHARE_TYPE_LINK); - $res = $qb->execute()->fetchAll(); + $result = $qb->execute(); + $res = $result->fetchAll(); + $result->closeCursor(); $this->assertCount(1, $res); $id = $res[0]['id']; @@ -1260,7 +1262,9 @@ class ShareTest extends \Test\TestCase { ->from('share') ->where($qb->expr()->eq('id', $qb->createParameter('id'))) ->setParameter('id', $id); - $hash = $qb->execute()->fetch()['share_with']; + $result = $qb->execute(); + $hash = $result->fetch()['share_with']; + $result->closeCursor(); $hasher = \OC::$server->getHasher(); |