diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index aa0327e89d9de..83b233ac1b5fa 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -291,6 +291,43 @@ public function execute() { return new ResultAdapter($result); } + public function executeQuery(): IResult { + if ($this->getType() !== \Doctrine\DBAL\Query\QueryBuilder::SELECT) { + throw new \RuntimeException('Invalid query type, expected SELECT query'); + } + + try { + $result = $this->execute(); + } catch (\Doctrine\DBAL\Exception $e) { + throw \OC\DB\Exceptions\DbalException::wrap($e); + } + + if ($result instanceof IResult) { + return $result; + } + + throw new \RuntimeException('Invalid return type for query'); + } + + public function executeUpdate(): int { + if ($this->getType() === \Doctrine\DBAL\Query\QueryBuilder::SELECT) { + throw new \RuntimeException('Invalid query type, expected INSERT, DELETE or UPDATE query'); + } + + try { + $result = $this->execute(); + } catch (\Doctrine\DBAL\Exception $e) { + throw \OC\DB\Exceptions\DbalException::wrap($e); + } + + if (!is_int($result)) { + throw new \RuntimeException('Invalid return type for query'); + } + + return $result; + } + + /** * Gets the complete SQL string formed by the current specifications of this QueryBuilder. * diff --git a/lib/public/DB/QueryBuilder/IQueryBuilder.php b/lib/public/DB/QueryBuilder/IQueryBuilder.php index 0a5d42e48c560..91ffab02f4804 100644 --- a/lib/public/DB/QueryBuilder/IQueryBuilder.php +++ b/lib/public/DB/QueryBuilder/IQueryBuilder.php @@ -159,9 +159,32 @@ public function getState(); * @return IResult|int * @throws Exception since 21.0.0 * @since 8.2.0 + * @deprecated 22.0.0 Use executeQuery or executeUpdate */ public function execute(); + /** + * Execute for select statements + * + * @return IResult + * @since 22.0.0 + * + * @throws Exception + * @throws \RuntimeException in case of usage with non select query + */ + public function executeQuery(): IResult; + + /** + * Execute for insert, update and delete statements + * + * @return int + * @since 22.0.0 + * + * @throws Exception + * @throws \RuntimeException in case of usage with select query + */ + public function executeUpdate(): int; + /** * Gets the complete SQL string formed by the current specifications of this QueryBuilder. *