aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorJoas Schilling <213943+nickvergessen@users.noreply.github.com>2024-07-19 16:40:49 +0200
committerGitHub <noreply@github.com>2024-07-19 16:40:49 +0200
commit7395211c1a5bf435e3be66d7a021f6cbb99ab1ab (patch)
treec958695ffa44082bf971b2f223f3a81606b1f738 /lib/private
parent8f975cda34b4b4f181646a54c15f7c511d6e8491 (diff)
parentb656edc47c50376140971e11d1325147cb1e49c9 (diff)
downloadnextcloud-server-7395211c1a5bf435e3be66d7a021f6cbb99ab1ab.tar.gz
nextcloud-server-7395211c1a5bf435e3be66d7a021f6cbb99ab1ab.zip
Merge pull request #46605 from nextcloud/bugfix/noid/test-more-oracle-versions
fix(deps): Deprecate functionality deprecated by doctrine and test on more oracle versions
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/AllConfig.php5
-rw-r--r--lib/private/BackgroundJob/JobList.php11
-rw-r--r--lib/private/DB/Connection.php51
-rw-r--r--lib/private/DB/ConnectionAdapter.php28
-rw-r--r--lib/private/DB/MigrationService.php9
-rw-r--r--lib/private/DB/OracleConnection.php4
-rw-r--r--lib/private/DB/PgSqlTools.php2
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php19
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php12
-rw-r--r--lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php3
-rw-r--r--lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php3
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php119
-rw-r--r--lib/private/DB/ResultAdapter.php17
-rw-r--r--lib/private/Repair/Collation.php3
-rw-r--r--lib/private/TaskProcessing/Db/TaskMapper.php10
15 files changed, 170 insertions, 126 deletions
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index d05fe440202..58eee772fbf 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -6,7 +6,6 @@
*/
namespace OC;
-use Doctrine\DBAL\Platforms\OraclePlatform;
use OCP\Cache\CappedMemoryCache;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IConfig;
@@ -470,7 +469,7 @@ class AllConfig implements IConfig {
$this->fixDIInit();
$qb = $this->connection->getQueryBuilder();
- $configValueColumn = ($this->connection->getDatabasePlatform() instanceof OraclePlatform)
+ $configValueColumn = ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE)
? $qb->expr()->castColumn('configvalue', IQueryBuilder::PARAM_STR)
: 'configvalue';
$result = $qb->select('userid')
@@ -509,7 +508,7 @@ class AllConfig implements IConfig {
}
$qb = $this->connection->getQueryBuilder();
- $configValueColumn = ($this->connection->getDatabasePlatform() instanceof OraclePlatform)
+ $configValueColumn = ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE)
? $qb->expr()->castColumn('configvalue', IQueryBuilder::PARAM_STR)
: 'configvalue';
diff --git a/lib/private/BackgroundJob/JobList.php b/lib/private/BackgroundJob/JobList.php
index 201263320e3..b09124281ea 100644
--- a/lib/private/BackgroundJob/JobList.php
+++ b/lib/private/BackgroundJob/JobList.php
@@ -7,7 +7,6 @@
*/
namespace OC\BackgroundJob;
-use Doctrine\DBAL\Platforms\MySQLPlatform;
use OCP\AppFramework\QueryException;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\AutoloadNotAllowedException;
@@ -98,7 +97,7 @@ class JobList implements IJobList {
// Add galera safe delete chunking if using mysql
// Stops us hitting wsrep_max_ws_rows when large row counts are deleted
- if ($this->connection->getDatabasePlatform() instanceof MySQLPlatform) {
+ if ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_MYSQL) {
// Then use chunked delete
$max = IQueryBuilder::MAX_ROW_DELETION;
@@ -204,12 +203,12 @@ class JobList implements IJobList {
$query->andWhere($query->expr()->eq('time_sensitive', $query->createNamedParameter(IJob::TIME_SENSITIVE, IQueryBuilder::PARAM_INT)));
}
- if ($jobClasses !== null && count($jobClasses) > 0) {
- $orClasses = $query->expr()->orx();
+ if (!empty($jobClasses)) {
+ $orClasses = [];
foreach ($jobClasses as $jobClass) {
- $orClasses->add($query->expr()->eq('class', $query->createNamedParameter($jobClass, IQueryBuilder::PARAM_STR)));
+ $orClasses[] = $query->expr()->eq('class', $query->createNamedParameter($jobClass, IQueryBuilder::PARAM_STR));
}
- $query->andWhere($orClasses);
+ $query->andWhere($query->expr()->orX(...$orClasses));
}
$result = $query->executeQuery();
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index c886cb20235..e584690f95d 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -13,10 +13,12 @@ use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connections\PrimaryReadReplicaConnection;
use Doctrine\DBAL\Driver;
+use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Exception\ConnectionLost;
use Doctrine\DBAL\Platforms\MySQLPlatform;
use Doctrine\DBAL\Platforms\OraclePlatform;
+use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Result;
use Doctrine\DBAL\Schema\Schema;
@@ -25,6 +27,7 @@ use OC\DB\QueryBuilder\QueryBuilder;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Diagnostics\IEventLogger;
+use OCP\IDBConnection;
use OCP\IRequestId;
use OCP\PreConditionNotMetException;
use OCP\Profiler\IProfiler;
@@ -318,10 +321,7 @@ class Connection extends PrimaryReadReplicaConnection {
* @throws Exception
*/
public function executeUpdate(string $sql, array $params = [], array $types = []): int {
- $sql = $this->finishQuery($sql);
- $this->queriesExecuted++;
- $this->logQueryToFile($sql);
- return parent::executeUpdate($sql, $params, $types);
+ return $this->executeStatement($sql, $params, $types);
}
/**
@@ -472,22 +472,22 @@ class Connection extends PrimaryReadReplicaConnection {
foreach ($values as $name => $value) {
$updateQb->set($name, $updateQb->createNamedParameter($value, $this->getType($value)));
}
- $where = $updateQb->expr()->andX();
+ $where = [];
$whereValues = array_merge($keys, $updatePreconditionValues);
foreach ($whereValues as $name => $value) {
if ($value === '') {
- $where->add($updateQb->expr()->emptyString(
+ $where[] = $updateQb->expr()->emptyString(
$name
- ));
+ );
} else {
- $where->add($updateQb->expr()->eq(
+ $where[] = $updateQb->expr()->eq(
$name,
$updateQb->createNamedParameter($value, $this->getType($value)),
$this->getType($value)
- ));
+ );
}
}
- $updateQb->where($where);
+ $updateQb->where($updateQb->expr()->andX(...$where));
$affected = $updateQb->executeStatement();
if ($affected === 0 && !empty($updatePreconditionValues)) {
@@ -561,7 +561,7 @@ class Connection extends PrimaryReadReplicaConnection {
*/
public function dropTable($table) {
$table = $this->tablePrefix . trim($table);
- $schema = $this->getSchemaManager();
+ $schema = $this->createSchemaManager();
if ($schema->tablesExist([$table])) {
$schema->dropTable($table);
}
@@ -577,7 +577,7 @@ class Connection extends PrimaryReadReplicaConnection {
*/
public function tableExists($table) {
$table = $this->tablePrefix . trim($table);
- $schema = $this->getSchemaManager();
+ $schema = $this->createSchemaManager();
return $schema->tablesExist([$table]);
}
@@ -732,4 +732,31 @@ class Connection extends PrimaryReadReplicaConnection {
private function getConnectionName(): string {
return $this->isConnectedToPrimary() ? 'primary' : 'replica';
}
+
+ /**
+ * @return IDBConnection::PLATFORM_MYSQL|IDBConnection::PLATFORM_ORACLE|IDBConnection::PLATFORM_POSTGRES|IDBConnection::PLATFORM_SQLITE
+ */
+ public function getDatabaseProvider(): string {
+ $platform = $this->getDatabasePlatform();
+ if ($platform instanceof MySQLPlatform) {
+ return IDBConnection::PLATFORM_MYSQL;
+ } elseif ($platform instanceof OraclePlatform) {
+ return IDBConnection::PLATFORM_ORACLE;
+ } elseif ($platform instanceof PostgreSQLPlatform) {
+ return IDBConnection::PLATFORM_POSTGRES;
+ } elseif ($platform instanceof SqlitePlatform) {
+ return IDBConnection::PLATFORM_SQLITE;
+ } else {
+ throw new \Exception('Database ' . $platform::class . ' not supported');
+ }
+ }
+
+ /**
+ * @internal Should only be used inside the QueryBuilder, ExpressionBuilder and FunctionBuilder
+ * All apps and API code should not need this and instead use provided functionality from the above.
+ */
+ public function getServerVersion(): string {
+ /** @var ServerInfoAwareConnection $this->_conn */
+ return $this->_conn->getServerVersion();
+ }
}
diff --git a/lib/private/DB/ConnectionAdapter.php b/lib/private/DB/ConnectionAdapter.php
index 86a901a7de3..b7225169e4c 100644
--- a/lib/private/DB/ConnectionAdapter.php
+++ b/lib/private/DB/ConnectionAdapter.php
@@ -10,10 +10,6 @@ namespace OC\DB;
use Doctrine\DBAL\Exception;
use Doctrine\DBAL\Platforms\AbstractPlatform;
-use Doctrine\DBAL\Platforms\MySQLPlatform;
-use Doctrine\DBAL\Platforms\OraclePlatform;
-use Doctrine\DBAL\Platforms\PostgreSQLPlatform;
-use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Schema\Schema;
use OC\DB\Exceptions\DbalException;
use OCP\DB\IPreparedStatement;
@@ -230,18 +226,18 @@ class ConnectionAdapter implements IDBConnection {
return $this->inner;
}
+ /**
+ * @return self::PLATFORM_MYSQL|self::PLATFORM_ORACLE|self::PLATFORM_POSTGRES|self::PLATFORM_SQLITE
+ */
public function getDatabaseProvider(): string {
- $platform = $this->inner->getDatabasePlatform();
- if ($platform instanceof MySQLPlatform) {
- return IDBConnection::PLATFORM_MYSQL;
- } elseif ($platform instanceof OraclePlatform) {
- return IDBConnection::PLATFORM_ORACLE;
- } elseif ($platform instanceof PostgreSQLPlatform) {
- return IDBConnection::PLATFORM_POSTGRES;
- } elseif ($platform instanceof SqlitePlatform) {
- return IDBConnection::PLATFORM_SQLITE;
- } else {
- throw new \Exception('Database ' . $platform::class . ' not supported');
- }
+ return $this->inner->getDatabaseProvider();
+ }
+
+ /**
+ * @internal Should only be used inside the QueryBuilder, ExpressionBuilder and FunctionBuilder
+ * All apps and API code should not need this and instead use provided functionality from the above.
+ */
+ public function getServerVersion(): string {
+ return $this->inner->getServerVersion();
}
}
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php
index 19d1b240736..0a3b0d1dcc7 100644
--- a/lib/private/DB/MigrationService.php
+++ b/lib/private/DB/MigrationService.php
@@ -6,20 +6,19 @@
*/
namespace OC\DB;
-use Doctrine\DBAL\Platforms\OraclePlatform;
-use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
use Doctrine\DBAL\Schema\Index;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Schema\Sequence;
use Doctrine\DBAL\Schema\Table;
-use Doctrine\DBAL\Types\Types;
use OC\App\InfoParser;
use OC\IntegrityCheck\Helpers\AppLocator;
use OC\Migration\SimpleOutput;
use OCP\AppFramework\App;
use OCP\AppFramework\QueryException;
use OCP\DB\ISchemaWrapper;
+use OCP\DB\Types;
+use OCP\IDBConnection;
use OCP\Migration\IMigrationStep;
use OCP\Migration\IOutput;
use OCP\Server;
@@ -599,7 +598,7 @@ class MigrationService {
$indexName = strtolower($primaryKey->getName());
$isUsingDefaultName = $indexName === 'primary';
- if ($this->connection->getDatabasePlatform() instanceof PostgreSQL94Platform) {
+ if ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_POSTGRES) {
$defaultName = $table->getName() . '_pkey';
$isUsingDefaultName = strtolower($defaultName) === $indexName;
@@ -609,7 +608,7 @@ class MigrationService {
return $sequence->getName() !== $sequenceName;
});
}
- } elseif ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
+ } elseif ($this->connection->getDatabaseProvider() === IDBConnection::PLATFORM_ORACLE) {
$defaultName = $table->getName() . '_seq';
$isUsingDefaultName = strtolower($defaultName) === $indexName;
}
diff --git a/lib/private/DB/OracleConnection.php b/lib/private/DB/OracleConnection.php
index abfb69f129b..5ffb65d801d 100644
--- a/lib/private/DB/OracleConnection.php
+++ b/lib/private/DB/OracleConnection.php
@@ -68,7 +68,7 @@ class OracleConnection extends Connection {
public function dropTable($table) {
$table = $this->tablePrefix . trim($table);
$table = $this->quoteIdentifier($table);
- $schema = $this->getSchemaManager();
+ $schema = $this->createSchemaManager();
if ($schema->tablesExist([$table])) {
$schema->dropTable($table);
}
@@ -83,7 +83,7 @@ class OracleConnection extends Connection {
public function tableExists($table) {
$table = $this->tablePrefix . trim($table);
$table = $this->quoteIdentifier($table);
- $schema = $this->getSchemaManager();
+ $schema = $this->createSchemaManager();
return $schema->tablesExist([$table]);
}
}
diff --git a/lib/private/DB/PgSqlTools.php b/lib/private/DB/PgSqlTools.php
index 35e8016191c..d529cb26b09 100644
--- a/lib/private/DB/PgSqlTools.php
+++ b/lib/private/DB/PgSqlTools.php
@@ -43,7 +43,7 @@ class PgSqlTools {
return preg_match($filterExpression, $asset) !== false;
});
- foreach ($conn->getSchemaManager()->listSequences() as $sequence) {
+ foreach ($conn->createSchemaManager()->listSequences() as $sequence) {
$sequenceName = $sequence->getName();
$sqlInfo = 'SELECT table_schema, table_name, column_name
FROM information_schema.columns
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
index c4ac350dee5..b70e20e4d0d 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
@@ -21,6 +21,7 @@ use OCP\DB\QueryBuilder\IParameter;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\IDBConnection;
+use Psr\Log\LoggerInterface;
class ExpressionBuilder implements IExpressionBuilder {
/** @var \Doctrine\DBAL\Query\Expression\ExpressionBuilder */
@@ -32,17 +33,15 @@ class ExpressionBuilder implements IExpressionBuilder {
/** @var IDBConnection */
protected $connection;
+ /** @var LoggerInterface */
+ protected $logger;
+
/** @var FunctionBuilder */
protected $functionBuilder;
- /**
- * Initializes a new <tt>ExpressionBuilder</tt>.
- *
- * @param ConnectionAdapter $connection
- * @param IQueryBuilder $queryBuilder
- */
- public function __construct(ConnectionAdapter $connection, IQueryBuilder $queryBuilder) {
+ public function __construct(ConnectionAdapter $connection, IQueryBuilder $queryBuilder, LoggerInterface $logger) {
$this->connection = $connection;
+ $this->logger = $logger;
$this->helper = new QuoteHelper();
$this->expressionBuilder = new DoctrineExpressionBuilder($connection->getInner());
$this->functionBuilder = $queryBuilder->func();
@@ -63,6 +62,9 @@ class ExpressionBuilder implements IExpressionBuilder {
* @return \OCP\DB\QueryBuilder\ICompositeExpression
*/
public function andX(...$x): ICompositeExpression {
+ if (empty($x)) {
+ $this->logger->debug('Calling ' . IQueryBuilder::class . '::' . __FUNCTION__ . ' without parameters is deprecated and will throw soon.', ['exception' => new \Exception('No parameters in call to ' . __METHOD__)]);
+ }
return new CompositeExpression(CompositeExpression::TYPE_AND, $x);
}
@@ -81,6 +83,9 @@ class ExpressionBuilder implements IExpressionBuilder {
* @return \OCP\DB\QueryBuilder\ICompositeExpression
*/
public function orX(...$x): ICompositeExpression {
+ if (empty($x)) {
+ $this->logger->debug('Calling ' . IQueryBuilder::class . '::' . __FUNCTION__ . ' without parameters is deprecated and will throw soon.', ['exception' => new \Exception('No parameters in call to ' . __METHOD__)]);
+ }
return new CompositeExpression(CompositeExpression::TYPE_OR, $x);
}
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php
index cd2fb5a5cc3..7216fd8807b 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/MySqlExpressionBuilder.php
@@ -11,17 +11,13 @@ use OC\DB\ConnectionAdapter;
use OC\DB\QueryBuilder\QueryFunction;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
+use Psr\Log\LoggerInterface;
class MySqlExpressionBuilder extends ExpressionBuilder {
- /** @var string */
- protected $collation;
+ protected string $collation;
- /**
- * @param ConnectionAdapter $connection
- * @param IQueryBuilder $queryBuilder
- */
- public function __construct(ConnectionAdapter $connection, IQueryBuilder $queryBuilder) {
- parent::__construct($connection, $queryBuilder);
+ public function __construct(ConnectionAdapter $connection, IQueryBuilder $queryBuilder, LoggerInterface $logger) {
+ parent::__construct($connection, $queryBuilder, $logger);
$params = $connection->getInner()->getParams();
$this->collation = $params['collation'] ?? (($params['charset'] ?? 'utf8') . '_general_ci');
diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php
index b168d2c1a84..2466493c1fa 100644
--- a/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php
+++ b/lib/private/DB/QueryBuilder/FunctionBuilder/FunctionBuilder.php
@@ -5,6 +5,7 @@
*/
namespace OC\DB\QueryBuilder\FunctionBuilder;
+use OC\DB\Connection;
use OC\DB\QueryBuilder\QueryFunction;
use OC\DB\QueryBuilder\QuoteHelper;
use OCP\DB\QueryBuilder\IFunctionBuilder;
@@ -13,7 +14,7 @@ use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\IDBConnection;
class FunctionBuilder implements IFunctionBuilder {
- /** @var IDBConnection */
+ /** @var IDBConnection|Connection */
protected $connection;
/** @var IQueryBuilder */
diff --git a/lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php b/lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php
index d0258eafea8..a8dc4d8cf14 100644
--- a/lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php
+++ b/lib/private/DB/QueryBuilder/FunctionBuilder/OCIFunctionBuilder.php
@@ -12,6 +12,9 @@ use OCP\DB\QueryBuilder\IQueryFunction;
class OCIFunctionBuilder extends FunctionBuilder {
public function md5($input): IQueryFunction {
+ if (version_compare($this->connection->getServerVersion(), '20', '>=')) {
+ return new QueryFunction('LOWER(STANDARD_HASH(' . $this->helper->quoteColumnName($input) . ", 'MD5'))");
+ }
return new QueryFunction('LOWER(DBMS_OBFUSCATION_TOOLKIT.md5 (input => UTL_RAW.cast_to_raw(' . $this->helper->quoteColumnName($input) .')))');
}
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index 82127078d06..0ea223cd89c 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -7,14 +7,9 @@
*/
namespace OC\DB\QueryBuilder;
-use Doctrine\DBAL\Platforms\MySQLPlatform;
-use Doctrine\DBAL\Platforms\OraclePlatform;
-use Doctrine\DBAL\Platforms\PostgreSQL94Platform;
-use Doctrine\DBAL\Platforms\SqlitePlatform;
use Doctrine\DBAL\Query\QueryException;
use OC\DB\ConnectionAdapter;
use OC\DB\Exceptions\DbalException;
-use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\MySqlExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\OCIExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder;
@@ -50,6 +45,7 @@ class QueryBuilder implements IQueryBuilder {
/** @var bool */
private $automaticTablePrefix = true;
+ private bool $nonEmptyWhere = false;
/** @var string */
protected $lastInsertedTable;
@@ -96,20 +92,12 @@ class QueryBuilder implements IQueryBuilder {
* @return \OCP\DB\QueryBuilder\IExpressionBuilder
*/
public function expr() {
- if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
- return new OCIExpressionBuilder($this->connection, $this);
- }
- if ($this->connection->getDatabasePlatform() instanceof PostgreSQL94Platform) {
- return new PgSqlExpressionBuilder($this->connection, $this);
- }
- if ($this->connection->getDatabasePlatform() instanceof MySQLPlatform) {
- return new MySqlExpressionBuilder($this->connection, $this);
- }
- if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
- return new SqliteExpressionBuilder($this->connection, $this);
- }
-
- return new ExpressionBuilder($this->connection, $this);
+ return match($this->connection->getDatabaseProvider()) {
+ IDBConnection::PLATFORM_ORACLE => new OCIExpressionBuilder($this->connection, $this, $this->logger),
+ IDBConnection::PLATFORM_POSTGRES => new PgSqlExpressionBuilder($this->connection, $this, $this->logger),
+ IDBConnection::PLATFORM_MYSQL => new MySqlExpressionBuilder($this->connection, $this, $this->logger),
+ IDBConnection::PLATFORM_SQLITE => new SqliteExpressionBuilder($this->connection, $this, $this->logger),
+ };
}
/**
@@ -129,17 +117,12 @@ class QueryBuilder implements IQueryBuilder {
* @return \OCP\DB\QueryBuilder\IFunctionBuilder
*/
public function func() {
- if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
- return new OCIFunctionBuilder($this->connection, $this, $this->helper);
- }
- if ($this->connection->getDatabasePlatform() instanceof SqlitePlatform) {
- return new SqliteFunctionBuilder($this->connection, $this, $this->helper);
- }
- if ($this->connection->getDatabasePlatform() instanceof PostgreSQL94Platform) {
- return new PgSqlFunctionBuilder($this->connection, $this, $this->helper);
- }
-
- return new FunctionBuilder($this->connection, $this, $this->helper);
+ return match($this->connection->getDatabaseProvider()) {
+ IDBConnection::PLATFORM_ORACLE => new OCIFunctionBuilder($this->connection, $this, $this->helper),
+ IDBConnection::PLATFORM_POSTGRES => new PgSqlFunctionBuilder($this->connection, $this, $this->helper),
+ IDBConnection::PLATFORM_MYSQL => new FunctionBuilder($this->connection, $this, $this->helper),
+ IDBConnection::PLATFORM_SQLITE => new SqliteFunctionBuilder($this->connection, $this, $this->helper),
+ };
}
/**
@@ -163,9 +146,12 @@ class QueryBuilder implements IQueryBuilder {
/**
* Gets the state of this query builder instance.
*
- * @return integer Either QueryBuilder::STATE_DIRTY or QueryBuilder::STATE_CLEAN.
+ * @return int Always returns 0 which is former `QueryBuilder::STATE_DIRTY`
+ * @deprecated 30.0.0 This function is going to be removed with the next Doctrine/DBAL update
+ * and we can not fix this in our wrapper.
*/
public function getState() {
+ $this->logger->debug(IQueryBuilder::class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.', ['exception' => new \Exception('Deprecated call to ' . __METHOD__)]);
return $this->queryBuilder->getState();
}
@@ -200,24 +186,24 @@ class QueryBuilder implements IQueryBuilder {
}
}
- if (!empty($this->getQueryPart('select'))) {
- $select = $this->getQueryPart('select');
- $hasSelectAll = array_filter($select, static function ($s) {
- return $s === '*';
- });
- $hasSelectSpecific = array_filter($select, static function ($s) {
- return $s !== '*';
- });
-
- if (empty($hasSelectAll) === empty($hasSelectSpecific)) {
- $exception = new QueryException('Query is selecting * and specific values in the same query. This is not supported in Oracle.');
- $this->logger->error($exception->getMessage(), [
- 'query' => $this->getSQL(),
- 'app' => 'core',
- 'exception' => $exception,
- ]);
- }
- }
+ // if (!empty($this->getQueryPart('select'))) {
+ // $select = $this->getQueryPart('select');
+ // $hasSelectAll = array_filter($select, static function ($s) {
+ // return $s === '*';
+ // });
+ // $hasSelectSpecific = array_filter($select, static function ($s) {
+ // return $s !== '*';
+ // });
+
+ // if (empty($hasSelectAll) === empty($hasSelectSpecific)) {
+ // $exception = new QueryException('Query is selecting * and specific values in the same query. This is not supported in Oracle.');
+ // $this->logger->error($exception->getMessage(), [
+ // 'query' => $this->getSQL(),
+ // 'app' => 'core',
+ // 'exception' => $exception,
+ // ]);
+ // }
+ // }
$numberOfParameters = 0;
$hasTooLargeArrayParameter = false;
@@ -583,8 +569,13 @@ class QueryBuilder implements IQueryBuilder {
* @param string $alias The table alias used in the constructed query.
*
* @return $this This QueryBuilder instance.
+ * @since 30.0.0 Alias is deprecated and will no longer be used with the next Doctrine/DBAL update
*/
public function delete($delete = null, $alias = null) {
+ if ($alias !== null) {
+ $this->logger->debug('DELETE queries with alias are no longer supported and the provided alias is ignored', ['exception' => new \InvalidArgumentException('Table alias provided for DELETE query')]);
+ }
+
$this->queryBuilder->delete(
$this->getTableName($delete),
$alias
@@ -608,8 +599,13 @@ class QueryBuilder implements IQueryBuilder {
* @param string $alias The table alias used in the constructed query.
*
* @return $this This QueryBuilder instance.
+ * @since 30.0.0 Alias is deprecated and will no longer be used with the next Doctrine/DBAL update
*/
public function update($update = null, $alias = null) {
+ if ($alias !== null) {
+ $this->logger->debug('UPDATE queries with alias are no longer supported and the provided alias is ignored', ['exception' => new \InvalidArgumentException('Table alias provided for UPDATE query')]);
+ }
+
$this->queryBuilder->update(
$this->getTableName($update),
$alias
@@ -820,9 +816,10 @@ class QueryBuilder implements IQueryBuilder {
* // You can optionally programmatically build and/or expressions
* $qb = $conn->getQueryBuilder();
*
- * $or = $qb->expr()->orx();
- * $or->add($qb->expr()->eq('u.id', 1));
- * $or->add($qb->expr()->eq('u.id', 2));
+ * $or = $qb->expr()->orx(
+ * $qb->expr()->eq('u.id', 1),
+ * $qb->expr()->eq('u.id', 2),
+ * );
*
* $qb->update('users', 'u')
* ->set('u.password', md5('password'))
@@ -834,12 +831,14 @@ class QueryBuilder implements IQueryBuilder {
* @return $this This QueryBuilder instance.
*/
public function where(...$predicates) {
- if ($this->getQueryPart('where') !== null && $this->systemConfig->getValue('debug', false)) {
+ if ($this->nonEmptyWhere && $this->systemConfig->getValue('debug', false)) {
// Only logging a warning, not throwing for now.
$e = new QueryException('Using where() on non-empty WHERE part, please verify it is intentional to not call andWhere() or orWhere() instead. Otherwise consider creating a new query builder object or call resetQueryPart(\'where\') first.');
$this->logger->warning($e->getMessage(), ['exception' => $e]);
}
+ $this->nonEmptyWhere = true;
+
call_user_func_array(
[$this->queryBuilder, 'where'],
$predicates
@@ -867,6 +866,7 @@ class QueryBuilder implements IQueryBuilder {
* @see where()
*/
public function andWhere(...$where) {
+ $this->nonEmptyWhere = true;
call_user_func_array(
[$this->queryBuilder, 'andWhere'],
$where
@@ -894,6 +894,7 @@ class QueryBuilder implements IQueryBuilder {
* @see where()
*/
public function orWhere(...$where) {
+ $this->nonEmptyWhere = true;
call_user_func_array(
[$this->queryBuilder, 'orWhere'],
$where
@@ -1104,8 +1105,11 @@ class QueryBuilder implements IQueryBuilder {
* @param string $queryPartName
*
* @return mixed
+ * @deprecated 30.0.0 This function is going to be removed with the next Doctrine/DBAL update
+ * and we can not fix this in our wrapper. Please track the details you need, outside the object.
*/
public function getQueryPart($queryPartName) {
+ $this->logger->debug(IQueryBuilder::class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.', ['exception' => new \Exception('Deprecated call to ' . __METHOD__)]);
return $this->queryBuilder->getQueryPart($queryPartName);
}
@@ -1113,8 +1117,11 @@ class QueryBuilder implements IQueryBuilder {
* Gets all query parts.
*
* @return array
+ * @deprecated 30.0.0 This function is going to be removed with the next Doctrine/DBAL update
+ * and we can not fix this in our wrapper. Please track the details you need, outside the object.
*/
public function getQueryParts() {
+ $this->logger->debug(IQueryBuilder::class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.', ['exception' => new \Exception('Deprecated call to ' . __METHOD__)]);
return $this->queryBuilder->getQueryParts();
}
@@ -1124,8 +1131,11 @@ class QueryBuilder implements IQueryBuilder {
* @param array|null $queryPartNames
*
* @return $this This QueryBuilder instance.
+ * @deprecated 30.0.0 This function is going to be removed with the next Doctrine/DBAL update
+ * and we can not fix this in our wrapper. Please create a new IQueryBuilder instead.
*/
public function resetQueryParts($queryPartNames = null) {
+ $this->logger->debug(IQueryBuilder::class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.', ['exception' => new \Exception('Deprecated call to ' . __METHOD__)]);
$this->queryBuilder->resetQueryParts($queryPartNames);
return $this;
@@ -1137,8 +1147,11 @@ class QueryBuilder implements IQueryBuilder {
* @param string $queryPartName
*
* @return $this This QueryBuilder instance.
+ * @deprecated 30.0.0 This function is going to be removed with the next Doctrine/DBAL update
+ * and we can not fix this in our wrapper. Please create a new IQueryBuilder instead.
*/
public function resetQueryPart($queryPartName) {
+ $this->logger->debug(IQueryBuilder::class . '::' . __FUNCTION__ . ' is deprecated and will be removed soon.', ['exception' => new \Exception('Deprecated call to ' . __METHOD__)]);
$this->queryBuilder->resetQueryPart($queryPartName);
return $this;
diff --git a/lib/private/DB/ResultAdapter.php b/lib/private/DB/ResultAdapter.php
index 8b004d471ec..95a7620e0ff 100644
--- a/lib/private/DB/ResultAdapter.php
+++ b/lib/private/DB/ResultAdapter.php
@@ -30,14 +30,21 @@ class ResultAdapter implements IResult {
}
public function fetch(int $fetchMode = PDO::FETCH_ASSOC) {
- return $this->inner->fetch($fetchMode);
+ return match ($fetchMode) {
+ PDO::FETCH_ASSOC => $this->inner->fetchAssociative(),
+ PDO::FETCH_NUM => $this->inner->fetchNumeric(),
+ PDO::FETCH_COLUMN => $this->inner->fetchOne(),
+ default => throw new \Exception('Fetch mode needs to be assoc, num or column.'),
+ };
}
public function fetchAll(int $fetchMode = PDO::FETCH_ASSOC): array {
- if ($fetchMode !== PDO::FETCH_ASSOC && $fetchMode !== PDO::FETCH_NUM && $fetchMode !== PDO::FETCH_COLUMN) {
- throw new \Exception('Fetch mode needs to be assoc, num or column.');
- }
- return $this->inner->fetchAll($fetchMode);
+ return match ($fetchMode) {
+ PDO::FETCH_ASSOC => $this->inner->fetchAllAssociative(),
+ PDO::FETCH_NUM => $this->inner->fetchAllNumeric(),
+ PDO::FETCH_COLUMN => $this->inner->fetchFirstColumn(),
+ default => throw new \Exception('Fetch mode needs to be assoc, num or column.'),
+ };
}
public function fetchColumn($columnIndex = 0) {
diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php
index 0affb3b1ca9..a01a684151b 100644
--- a/lib/private/Repair/Collation.php
+++ b/lib/private/Repair/Collation.php
@@ -8,7 +8,6 @@
namespace OC\Repair;
use Doctrine\DBAL\Exception\DriverException;
-use Doctrine\DBAL\Platforms\MySQLPlatform;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
@@ -50,7 +49,7 @@ class Collation implements IRepairStep {
* Fix mime types
*/
public function run(IOutput $output) {
- if (!$this->connection->getDatabasePlatform() instanceof MySQLPlatform) {
+ if ($this->connection->getDatabaseProvider() !== IDBConnection::PLATFORM_MYSQL) {
$output->info('Not a mysql database -> nothing to do');
return;
}
diff --git a/lib/private/TaskProcessing/Db/TaskMapper.php b/lib/private/TaskProcessing/Db/TaskMapper.php
index 86b2a2fcc59..da3910dcb3d 100644
--- a/lib/private/TaskProcessing/Db/TaskMapper.php
+++ b/lib/private/TaskProcessing/Db/TaskMapper.php
@@ -59,16 +59,16 @@ class TaskMapper extends QBMapper {
->setMaxResults(1)
->orderBy('last_updated', 'ASC');
- if (count($taskTypes) > 0) {
- $filter = $qb->expr()->orX();
+ if (!empty($taskTypes)) {
+ $filter = [];
foreach ($taskTypes as $taskType) {
- $filter->add($qb->expr()->eq('type', $qb->createPositionalParameter($taskType)));
+ $filter[] = $qb->expr()->eq('type', $qb->createPositionalParameter($taskType));
}
- $qb->andWhere($filter);
+ $qb->andWhere($qb->expr()->orX(...$filter));
}
- if (count($taskIdsToIgnore) > 0) {
+ if (!empty($taskIdsToIgnore)) {
$qb->andWhere($qb->expr()->notIn('id', $qb->createNamedParameter($taskIdsToIgnore, IQueryBuilder::PARAM_INT_ARRAY)));
}