Add executeQuery and executeUpdate

Names shamelessly copied from Doctrine itself.
Internally it is still using the same flow. But I added some checks
around it.

This should make static analysis a bit more happy. Which in turn makes
me more happy.

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2020-10-24 11:51:32 +02:00
parent 9b573c6bd5
commit 76a6328d10
2 changed files with 60 additions and 0 deletions

View File

@ -291,6 +291,43 @@ class QueryBuilder implements IQueryBuilder {
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.
*

View File

@ -159,9 +159,32 @@ interface IQueryBuilder {
* @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.
*