Browse Source

Remove long depreated AppFramework/Db/Mapper

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Roeland Jago Douma 1 year ago
parent
commit
60ee874485

+ 0 - 1
lib/composer/composer/autoload_classmap.php

@@ -31,7 +31,6 @@ return array(
     'OCP\\AppFramework\\Db\\DoesNotExistException' => $baseDir . '/lib/public/AppFramework/Db/DoesNotExistException.php',
     'OCP\\AppFramework\\Db\\Entity' => $baseDir . '/lib/public/AppFramework/Db/Entity.php',
     'OCP\\AppFramework\\Db\\IMapperException' => $baseDir . '/lib/public/AppFramework/Db/IMapperException.php',
-    'OCP\\AppFramework\\Db\\Mapper' => $baseDir . '/lib/public/AppFramework/Db/Mapper.php',
     'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => $baseDir . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php',
     'OCP\\AppFramework\\Db\\QBMapper' => $baseDir . '/lib/public/AppFramework/Db/QBMapper.php',
     'OCP\\AppFramework\\Db\\TTransactional' => $baseDir . '/lib/public/AppFramework/Db/TTransactional.php',

+ 0 - 1
lib/composer/composer/autoload_static.php

@@ -64,7 +64,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OCP\\AppFramework\\Db\\DoesNotExistException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/DoesNotExistException.php',
         'OCP\\AppFramework\\Db\\Entity' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/Entity.php',
         'OCP\\AppFramework\\Db\\IMapperException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/IMapperException.php',
-        'OCP\\AppFramework\\Db\\Mapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/Mapper.php',
         'OCP\\AppFramework\\Db\\MultipleObjectsReturnedException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/MultipleObjectsReturnedException.php',
         'OCP\\AppFramework\\Db\\QBMapper' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/QBMapper.php',
         'OCP\\AppFramework\\Db\\TTransactional' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Db/TTransactional.php',

+ 0 - 370
lib/public/AppFramework/Db/Mapper.php

@@ -1,370 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OCP\AppFramework\Db;
-
-use OCP\IDBConnection;
-
-/**
- * Simple parent class for inheriting your data access layer from. This class
- * may be subject to change in the future
- * @since 7.0.0
- * @deprecated 14.0.0 Move over to QBMapper
- */
-abstract class Mapper {
-	protected $tableName;
-	protected $entityClass;
-	protected $db;
-
-	/**
-	 * @param IDBConnection $db Instance of the Db abstraction layer
-	 * @param string $tableName the name of the table. set this to allow entity
-	 * @param string $entityClass the name of the entity that the sql should be
-	 * mapped to queries without using sql
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	public function __construct(IDBConnection $db, $tableName, $entityClass = null) {
-		$this->db = $db;
-		$this->tableName = '*PREFIX*' . $tableName;
-
-		// if not given set the entity name to the class without the mapper part
-		// cache it here for later use since reflection is slow
-		if ($entityClass === null) {
-			$this->entityClass = str_replace('Mapper', '', get_class($this));
-		} else {
-			$this->entityClass = $entityClass;
-		}
-	}
-
-
-	/**
-	 * @return string the table name
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	public function getTableName() {
-		return $this->tableName;
-	}
-
-
-	/**
-	 * Deletes an entity from the table
-	 * @param Entity $entity the entity that should be deleted
-	 * @return Entity the deleted entity
-	 * @since 7.0.0 - return value added in 8.1.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	public function delete(Entity $entity) {
-		$sql = 'DELETE FROM `' . $this->tableName . '` WHERE `id` = ?';
-		$stmt = $this->execute($sql, [$entity->getId()]);
-		$stmt->closeCursor();
-		return $entity;
-	}
-
-
-	/**
-	 * Creates a new entry in the db from an entity
-	 * @param Entity $entity the entity that should be created
-	 * @return Entity the saved entity with the set id
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	public function insert(Entity $entity) {
-		// get updated fields to save, fields have to be set using a setter to
-		// be saved
-		$properties = $entity->getUpdatedFields();
-		$values = '';
-		$columns = '';
-		$params = [];
-
-		// build the fields
-		$i = 0;
-		foreach ($properties as $property => $updated) {
-			$column = $entity->propertyToColumn($property);
-			$getter = 'get' . ucfirst($property);
-
-			$columns .= '`' . $column . '`';
-			$values .= '?';
-
-			// only append colon if there are more entries
-			if ($i < count($properties) - 1) {
-				$columns .= ',';
-				$values .= ',';
-			}
-
-			$params[] = $entity->$getter();
-			$i++;
-		}
-
-		$sql = 'INSERT INTO `' . $this->tableName . '`(' .
-				$columns . ') VALUES(' . $values . ')';
-
-		$stmt = $this->execute($sql, $params);
-
-		$entity->setId((int) $this->db->lastInsertId($this->tableName));
-
-		$stmt->closeCursor();
-
-		return $entity;
-	}
-
-
-
-	/**
-	 * Updates an entry in the db from an entity
-	 * @throws \InvalidArgumentException if entity has no id
-	 * @param Entity $entity the entity that should be created
-	 * @return Entity the saved entity with the set id
-	 * @since 7.0.0 - return value was added in 8.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	public function update(Entity $entity) {
-		// if entity wasn't changed it makes no sense to run a db query
-		$properties = $entity->getUpdatedFields();
-		if (count($properties) === 0) {
-			return $entity;
-		}
-
-		// entity needs an id
-		$id = $entity->getId();
-		if ($id === null) {
-			throw new \InvalidArgumentException(
-				'Entity which should be updated has no id');
-		}
-
-		// get updated fields to save, fields have to be set using a setter to
-		// be saved
-		// do not update the id field
-		unset($properties['id']);
-
-		$columns = '';
-		$params = [];
-
-		// build the fields
-		$i = 0;
-		foreach ($properties as $property => $updated) {
-			$column = $entity->propertyToColumn($property);
-			$getter = 'get' . ucfirst($property);
-
-			$columns .= '`' . $column . '` = ?';
-
-			// only append colon if there are more entries
-			if ($i < count($properties) - 1) {
-				$columns .= ',';
-			}
-
-			$params[] = $entity->$getter();
-			$i++;
-		}
-
-		$sql = 'UPDATE `' . $this->tableName . '` SET ' .
-				$columns . ' WHERE `id` = ?';
-		$params[] = $id;
-
-		$stmt = $this->execute($sql, $params);
-		$stmt->closeCursor();
-
-		return $entity;
-	}
-
-	/**
-	 * Checks if an array is associative
-	 * @param array $array
-	 * @return bool true if associative
-	 * @since 8.1.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	private function isAssocArray(array $array) {
-		return array_values($array) !== $array;
-	}
-
-	/**
-	 * Returns the correct PDO constant based on the value type
-	 * @param $value
-	 * @return int PDO constant
-	 * @since 8.1.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	private function getPDOType($value) {
-		switch (gettype($value)) {
-			case 'integer':
-				return \PDO::PARAM_INT;
-			case 'boolean':
-				return \PDO::PARAM_BOOL;
-			default:
-				return \PDO::PARAM_STR;
-		}
-	}
-
-
-	/**
-	 * Runs an sql query
-	 * @param string $sql the prepare string
-	 * @param array $params the params which should replace the ? in the sql query
-	 * @param int $limit the maximum number of rows
-	 * @param int $offset from which row we want to start
-	 * @return \PDOStatement the database query result
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	protected function execute($sql, array $params = [], $limit = null, $offset = null) {
-		$query = $this->db->prepare($sql, $limit, $offset);
-
-		if ($this->isAssocArray($params)) {
-			foreach ($params as $key => $param) {
-				$pdoConstant = $this->getPDOType($param);
-				$query->bindValue($key, $param, $pdoConstant);
-			}
-		} else {
-			$index = 1;  // bindParam is 1 indexed
-			foreach ($params as $param) {
-				$pdoConstant = $this->getPDOType($param);
-				$query->bindValue($index, $param, $pdoConstant);
-				$index++;
-			}
-		}
-
-		$query->execute();
-
-		return $query;
-	}
-
-	/**
-	 * Returns an db result and throws exceptions when there are more or less
-	 * results
-	 * @see findEntity
-	 * @param string $sql the sql query
-	 * @param array $params the parameters of the sql query
-	 * @param int $limit the maximum number of rows
-	 * @param int $offset from which row we want to start
-	 * @throws DoesNotExistException if the item does not exist
-	 * @throws MultipleObjectsReturnedException if more than one item exist
-	 * @return array the result as row
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	protected function findOneQuery($sql, array $params = [], $limit = null, $offset = null) {
-		$stmt = $this->execute($sql, $params, $limit, $offset);
-		$row = $stmt->fetch();
-
-		if ($row === false || $row === null) {
-			$stmt->closeCursor();
-			$msg = $this->buildDebugMessage(
-				'Did expect one result but found none when executing', $sql, $params, $limit, $offset
-			);
-			throw new DoesNotExistException($msg);
-		}
-		$row2 = $stmt->fetch();
-		$stmt->closeCursor();
-		//MDB2 returns null, PDO and doctrine false when no row is available
-		if (! ($row2 === false || $row2 === null)) {
-			$msg = $this->buildDebugMessage(
-				'Did not expect more than one result when executing', $sql, $params, $limit, $offset
-			);
-			throw new MultipleObjectsReturnedException($msg);
-		} else {
-			return $row;
-		}
-	}
-
-	/**
-	 * Builds an error message by prepending the $msg to an error message which
-	 * has the parameters
-	 * @see findEntity
-	 * @param string $sql the sql query
-	 * @param array $params the parameters of the sql query
-	 * @param int $limit the maximum number of rows
-	 * @param int $offset from which row we want to start
-	 * @return string formatted error message string
-	 * @since 9.1.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	private function buildDebugMessage($msg, $sql, array $params = [], $limit = null, $offset = null) {
-		return $msg .
-					': query "' .	$sql . '"; ' .
-					'parameters ' . print_r($params, true) . '; ' .
-					'limit "' . $limit . '"; '.
-					'offset "' . $offset . '"';
-	}
-
-
-	/**
-	 * Creates an entity from a row. Automatically determines the entity class
-	 * from the current mapper name (MyEntityMapper -> MyEntity)
-	 * @param array $row the row which should be converted to an entity
-	 * @return Entity the entity
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	protected function mapRowToEntity($row) {
-		return call_user_func($this->entityClass .'::fromRow', $row);
-	}
-
-
-	/**
-	 * Runs a sql query and returns an array of entities
-	 * @param string $sql the prepare string
-	 * @param array $params the params which should replace the ? in the sql query
-	 * @param int $limit the maximum number of rows
-	 * @param int $offset from which row we want to start
-	 * @return array all fetched entities
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	protected function findEntities($sql, array $params = [], $limit = null, $offset = null) {
-		$stmt = $this->execute($sql, $params, $limit, $offset);
-
-		$entities = [];
-
-		while ($row = $stmt->fetch()) {
-			$entities[] = $this->mapRowToEntity($row);
-		}
-
-		$stmt->closeCursor();
-
-		return $entities;
-	}
-
-
-	/**
-	 * Returns an db result and throws exceptions when there are more or less
-	 * results
-	 * @param string $sql the sql query
-	 * @param array $params the parameters of the sql query
-	 * @param int $limit the maximum number of rows
-	 * @param int $offset from which row we want to start
-	 * @throws DoesNotExistException if the item does not exist
-	 * @throws MultipleObjectsReturnedException if more than one item exist
-	 * @return Entity the entity
-	 * @since 7.0.0
-	 * @deprecated 14.0.0 Move over to QBMapper
-	 */
-	protected function findEntity($sql, array $params = [], $limit = null, $offset = null) {
-		return $this->mapRowToEntity($this->findOneQuery($sql, $params, $limit, $offset));
-	}
-}

+ 0 - 300
tests/lib/AppFramework/Db/MapperTest.php

@@ -1,300 +0,0 @@
-<?php
-
-/**
- * ownCloud - App Framework
- *
- * @author Bernhard Posselt
- * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace Test\AppFramework\Db;
-
-use OCP\AppFramework\Db\DoesNotExistException;
-use OCP\AppFramework\Db\Entity;
-use OCP\AppFramework\Db\Mapper;
-use OCP\AppFramework\Db\MultipleObjectsReturnedException;
-use OCP\IDBConnection;
-
-/**
- * @method integer getId()
- * @method void setId(integer $id)
- * @method string getEmail()
- * @method void setEmail(string $email)
- * @method string getPreName()
- * @method void setPreName(string $preName)
- */
-class Example extends Entity {
-	protected $preName;
-	protected $email;
-};
-
-
-class ExampleMapper extends Mapper {
-	public function __construct(IDBConnection $db) {
-		parent::__construct($db, 'table');
-	}
-	public function find($table, $id) {
-		return $this->findOneQuery($table, $id);
-	}
-	public function findOneEntity($table, $id) {
-		return $this->findEntity($table, $id);
-	}
-	public function findAllEntities($table) {
-		return $this->findEntities($table);
-	}
-	public function mapRow($row) {
-		return $this->mapRowToEntity($row);
-	}
-	public function execSql($sql, $params) {
-		return $this->execute($sql, $params);
-	}
-}
-
-
-class MapperTest extends MapperTestUtility {
-
-	/**
-	 * @var Mapper
-	 */
-	private $mapper;
-
-	protected function setUp(): void {
-		parent::setUp();
-		$this->mapper = new ExampleMapper($this->db);
-	}
-
-
-	public function testMapperShouldSetTableName() {
-		$this->assertEquals('*PREFIX*table', $this->mapper->getTableName());
-	}
-
-
-	public function testFindQuery() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [
-			['hi']
-		];
-		$this->setMapperResult($sql, $params, $rows);
-		$this->mapper->find($sql, $params);
-	}
-
-	public function testFindEntity() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [
-			['pre_name' => 'hi']
-		];
-		$this->setMapperResult($sql, $params, $rows, null, null, true);
-		$this->mapper->findOneEntity($sql, $params);
-	}
-
-	public function testFindNotFound() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [];
-		$this->setMapperResult($sql, $params, $rows);
-		$this->expectException(DoesNotExistException::class);
-		$this->mapper->find($sql, $params);
-	}
-
-	public function testFindEntityNotFound() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [];
-		$this->setMapperResult($sql, $params, $rows, null, null, true);
-		$this->expectException(DoesNotExistException::class);
-		$this->mapper->findOneEntity($sql, $params);
-	}
-
-	public function testFindMultiple() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [
-			['jo'], ['ho']
-		];
-		$this->setMapperResult($sql, $params, $rows, null, null, true);
-		$this->expectException(MultipleObjectsReturnedException::class);
-		$this->mapper->find($sql, $params);
-	}
-
-	public function testFindEntityMultiple() {
-		$sql = 'hi';
-		$params = ['jo'];
-		$rows = [
-			['jo'], ['ho']
-		];
-		$this->setMapperResult($sql, $params, $rows, null, null, true);
-		$this->expectException(MultipleObjectsReturnedException::class);
-		$this->mapper->findOneEntity($sql, $params);
-	}
-
-
-	public function testDelete() {
-		$sql = 'DELETE FROM `*PREFIX*table` WHERE `id` = ?';
-		$params = [2];
-
-		$this->setMapperResult($sql, $params, [], null, null, true);
-		$entity = new Example();
-		$entity->setId($params[0]);
-
-		$this->mapper->delete($entity);
-	}
-
-
-	public function testCreate() {
-		$this->db->expects($this->once())
-			->method('lastInsertId')
-			->with($this->equalTo('*PREFIX*table'))
-			->willReturn(3);
-		$this->mapper = new ExampleMapper($this->db);
-
-		$sql = 'INSERT INTO `*PREFIX*table`(`pre_name`,`email`) ' .
-				'VALUES(?,?)';
-		$params = ['john', 'my@email'];
-		$entity = new Example();
-		$entity->setPreName($params[0]);
-		$entity->setEmail($params[1]);
-
-		$this->setMapperResult($sql, $params, [], null, null, true);
-
-		$this->mapper->insert($entity);
-	}
-
-
-	public function testCreateShouldReturnItemWithCorrectInsertId() {
-		$this->db->expects($this->once())
-			->method('lastInsertId')
-			->with($this->equalTo('*PREFIX*table'))
-			->willReturn(3);
-		$this->mapper = new ExampleMapper($this->db);
-
-		$sql = 'INSERT INTO `*PREFIX*table`(`pre_name`,`email`) ' .
-				'VALUES(?,?)';
-		$params = ['john', 'my@email'];
-		$entity = new Example();
-		$entity->setPreName($params[0]);
-		$entity->setEmail($params[1]);
-
-		$this->setMapperResult($sql, $params);
-
-		$result = $this->mapper->insert($entity);
-
-		$this->assertEquals(3, $result->getId());
-	}
-
-
-	public function testAssocParameters() {
-		$sql = 'test';
-		$params = [':test' => 1, ':a' => 2];
-
-		$this->setMapperResult($sql, $params);
-		$this->mapper->execSql($sql, $params);
-	}
-
-
-	public function testUpdate() {
-		$sql = 'UPDATE `*PREFIX*table` ' .
-				'SET ' .
-				'`pre_name` = ?,'.
-				'`email` = ? ' .
-				'WHERE `id` = ?';
-
-		$params = ['john', 'my@email', 1];
-		$entity = new Example();
-		$entity->setPreName($params[0]);
-		$entity->setEmail($params[1]);
-		$entity->setId($params[2]);
-
-		$this->setMapperResult($sql, $params, [], null, null, true);
-
-		$this->mapper->update($entity);
-	}
-
-
-	public function testUpdateNoId() {
-		$params = ['john', 'my@email'];
-		$entity = new Example();
-		$entity->setPreName($params[0]);
-		$entity->setEmail($params[1]);
-
-		$this->expectException(\InvalidArgumentException::class);
-
-		$this->mapper->update($entity);
-	}
-
-
-	public function testUpdateNothingChangedNoQuery() {
-		$params = ['john', 'my@email'];
-		$entity = new Example();
-		$entity->setId(3);
-		$entity->setEmail($params[1]);
-		$entity->resetUpdatedFields();
-
-		$this->db->expects($this->never())
-			->method('prepare');
-
-		$this->mapper->update($entity);
-	}
-
-
-	public function testMapRowToEntity() {
-		$entity1 = $this->mapper->mapRow(['pre_name' => 'test1', 'email' => 'test2']);
-		$entity2 = new Example();
-		$entity2->setPreName('test1');
-		$entity2->setEmail('test2');
-		$entity2->resetUpdatedFields();
-		$this->assertEquals($entity2, $entity1);
-	}
-
-	public function testFindEntities() {
-		$sql = 'hi';
-		$rows = [
-			['pre_name' => 'hi']
-		];
-		$entity = new Example();
-		$entity->setPreName('hi');
-		$entity->resetUpdatedFields();
-		$this->setMapperResult($sql, [], $rows, null, null, true);
-		$result = $this->mapper->findAllEntities($sql);
-		$this->assertEquals([$entity], $result);
-	}
-
-	public function testFindEntitiesNotFound() {
-		$sql = 'hi';
-		$rows = [];
-		$this->setMapperResult($sql, [], $rows);
-		$result = $this->mapper->findAllEntities($sql);
-		$this->assertEquals([], $result);
-	}
-
-	public function testFindEntitiesMultiple() {
-		$sql = 'hi';
-		$rows = [
-			['pre_name' => 'jo'], ['email' => 'ho']
-		];
-		$entity1 = new Example();
-		$entity1->setPreName('jo');
-		$entity1->resetUpdatedFields();
-		$entity2 = new Example();
-		$entity2->setEmail('ho');
-		$entity2->resetUpdatedFields();
-		$this->setMapperResult($sql, [], $rows);
-		$result = $this->mapper->findAllEntities($sql);
-		$this->assertEquals([$entity1, $entity2], $result);
-	}
-}

+ 0 - 206
tests/lib/AppFramework/Db/MapperTestUtility.php

@@ -1,206 +0,0 @@
-<?php
-
-/**
- * ownCloud - App Framework
- *
- * @author Bernhard Posselt
- * @copyright 2012 Bernhard Posselt dev@bernhard-posselt.com
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace Test\AppFramework\Db;
-
-use OCP\DB\IPreparedStatement;
-use OCP\DB\IResult;
-
-/**
- * Simple utility class for testing mappers
- */
-abstract class MapperTestUtility extends \Test\TestCase {
-	protected $db;
-	private $statement;
-	private $queryAt;
-	private $prepareAt;
-	private $fetchAt;
-	private $iterators;
-
-
-	/**
-	 * Run this function before the actual test to either set or initialize the
-	 * db. After this the db can be accessed by using $this->db
-	 */
-	protected function setUp(): void {
-		parent::setUp();
-
-		$this->db = $this->getMockBuilder(
-			'\OCP\IDBConnection')
-			->disableOriginalConstructor()
-			->getMock();
-
-		$this->statement = $this->createMock(IPreparedStatement::class);
-		$this->queryAt = 0;
-		$this->prepareAt = 0;
-		$this->iterators = [];
-		$this->fetchAt = 0;
-	}
-
-	/**
-	 * Checks if an array is associative
-	 * @param array $array
-	 * @return bool true if associative
-	 */
-	private function isAssocArray(array $array) {
-		return array_values($array) !== $array;
-	}
-
-	/**
-	 * Returns the correct PDO constant based on the value type
-	 * @param $value
-	 * @return int PDO constant
-	 */
-	private function getPDOType($value) {
-		switch (gettype($value)) {
-			case 'integer':
-				return \PDO::PARAM_INT;
-			case 'boolean':
-				return \PDO::PARAM_BOOL;
-			default:
-				return \PDO::PARAM_STR;
-		}
-	}
-
-	/**
-	 * Create mocks and set expected results for database queries
-	 * @param string $sql the sql query that you expect to receive
-	 * @param array $arguments the expected arguments for the prepare query
-	 * method
-	 * @param array $returnRows the rows that should be returned for the result
-	 * of the database query. If not provided, it wont be assumed that fetch
-	 * will be called on the result
-	 */
-	protected function setMapperResult($sql, $arguments = [], $returnRows = [],
-		$limit = null, $offset = null, $expectClose = false) {
-		if ($limit === null && $offset === null) {
-			$this->db->expects($this->at($this->prepareAt))
-				->method('prepare')
-				->with($this->equalTo($sql))
-				->will(($this->returnValue($this->statement)));
-		} elseif ($limit !== null && $offset === null) {
-			$this->db->expects($this->at($this->prepareAt))
-				->method('prepare')
-				->with($this->equalTo($sql), $this->equalTo($limit))
-				->will(($this->returnValue($this->statement)));
-		} elseif ($limit === null && $offset !== null) {
-			$this->db->expects($this->at($this->prepareAt))
-				->method('prepare')
-				->with($this->equalTo($sql),
-					$this->equalTo(null),
-					$this->equalTo($offset))
-				->will(($this->returnValue($this->statement)));
-		} else {
-			$this->db->expects($this->at($this->prepareAt))
-				->method('prepare')
-				->with($this->equalTo($sql),
-					$this->equalTo($limit),
-					$this->equalTo($offset))
-				->will(($this->returnValue($this->statement)));
-		}
-
-		$this->iterators[] = new ArgumentIterator($returnRows);
-
-		$iterators = $this->iterators;
-		$fetchAt = $this->fetchAt;
-
-		$this->statement->expects($this->any())
-			->method('fetch')
-			->willReturnCallback(
-				function () use ($iterators, $fetchAt) {
-					$iterator = $iterators[$fetchAt];
-					$result = $iterator->next();
-
-					if ($result === false) {
-						$fetchAt++;
-					}
-
-					$this->queryAt++;
-
-					return $result;
-				}
-			);
-
-		if ($this->isAssocArray($arguments)) {
-			foreach ($arguments as $key => $argument) {
-				$pdoConstant = $this->getPDOType($argument);
-				$this->statement->expects($this->at($this->queryAt))
-					->method('bindValue')
-					->with($this->equalTo($key),
-						$this->equalTo($argument),
-						$this->equalTo($pdoConstant));
-				$this->queryAt++;
-			}
-		} else {
-			$index = 1;
-			foreach ($arguments as $argument) {
-				$pdoConstant = $this->getPDOType($argument);
-				$this->statement->expects($this->at($this->queryAt))
-					->method('bindValue')
-					->with($this->equalTo($index),
-						$this->equalTo($argument),
-						$this->equalTo($pdoConstant));
-				$index++;
-				$this->queryAt++;
-			}
-		}
-
-		$this->statement->expects($this->at($this->queryAt))
-			->method('execute')
-			->willReturnCallback(function ($sql, $p = null, $o = null, $s = null) {
-				return $this->createMock(IResult::class);
-			});
-		$this->queryAt++;
-
-
-
-		if ($expectClose) {
-			$closing = $this->at($this->queryAt);
-		} else {
-			$closing = $this->any();
-		}
-		$this->statement->expects($closing)->method('closeCursor');
-		$this->queryAt++;
-
-		$this->prepareAt++;
-		$this->fetchAt++;
-	}
-}
-
-
-class ArgumentIterator {
-	private $arguments;
-
-	public function __construct($arguments) {
-		$this->arguments = $arguments;
-	}
-
-	public function next() {
-		$result = array_shift($this->arguments);
-		if ($result === null) {
-			return false;
-		} else {
-			return $result;
-		}
-	}
-}