Merge pull request #5966 from nextcloud/backport-oracle

[stable12] Fix oracle db
This commit is contained in:
Morris Jobke 2017-08-08 16:34:25 +02:00 committed by GitHub
commit e11dcfcf9e
19 changed files with 209 additions and 97 deletions

View File

@ -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;
}

View File

@ -157,7 +157,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();
}

View File

@ -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;
}
/**

View File

@ -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;
@ -350,6 +351,28 @@ class ExpressionBuilder implements IExpressionBuilder {
return $this->expressionBuilder->notIn($x, $y);
}
/**
* 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.
*

View File

@ -137,6 +137,28 @@ class OCIExpressionBuilder extends ExpressionBuilder {
return $this->expressionBuilder->notIn($x, $y);
}
/**
* 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
*
@ -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\')');
}
}

View File

@ -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);
}
}

View File

@ -70,7 +70,7 @@ class QuoteHelper {
list($alias, $columnName) = explode('.', $string, 2);
if ($columnName === '*') {
return $string;
return '`' . $alias . '`.*';
}
return '`' . $alias . '`.`' . $columnName . '`';

View File

@ -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.');

View File

@ -60,17 +60,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;

View File

@ -338,6 +338,7 @@ class Share extends Constants {
}
}
}
$result->closeCursor();
}
}
@ -1461,8 +1462,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');

View File

@ -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();

View File

@ -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

View File

@ -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);
}

View File

@ -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());
}

View File

@ -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`'
],
];
}

View File

@ -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);

View File

@ -331,7 +331,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();

View File

@ -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();
}
}

View File

@ -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();