X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FBaseRepository.php;h=3e67cd5b20f5368133f1f4534ca8c57ec7cc5a56;hb=122ad0af14f046c2462a03fe33967dc41abfc8b5;hp=9f43d8fe144437adb62ee5c311667cb45833eb50;hpb=2ea1c95e3d5feed7d6fb88c9eb8f625b40208fe8;p=friendica.git diff --git a/src/BaseRepository.php b/src/BaseRepository.php index 9f43d8fe14..3e67cd5b20 100644 --- a/src/BaseRepository.php +++ b/src/BaseRepository.php @@ -1,4 +1,23 @@ . + * + */ namespace Friendica; @@ -78,37 +97,52 @@ abstract class BaseRepository extends BaseFactory * Populates the collection according to the condition. Retrieves a limited subset of models depending on the boundaries * and the limit. The total count of rows matching the condition is stored in the collection. * + * max_id and min_id are susceptible to the query order: + * - min_id alone only reliably works with ASC order + * - max_id alone only reliably works with DESC order + * If the wrong order is detected in either case, we inverse the query order and we reverse the model array after the query + * * Chainable. * * @param array $condition * @param array $params - * @param int? $max_id - * @param int? $since_id + * @param int? $min_id Retrieve models with an id no fewer than this, as close to it as possible + * @param int? $max_id Retrieve models with an id no greater than this, as close to it as possible * @param int $limit * @return BaseCollection * @throws \Exception */ - public function selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT) + public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT) { - $condition = DBA::collapseCondition($condition); + $totalCount = DBA::count(static::$table_name, $condition); $boundCondition = $condition; - if (isset($max_id)) { - $boundCondition[0] .= " AND `id` < ?"; - $boundCondition[] = $max_id; + $reverseModels = false; + + if (isset($min_id)) { + $boundCondition = DBA::mergeConditions($boundCondition, ['`id` > ?', $min_id]); + if (!isset($max_id) && isset($params['order']['id']) && ($params['order']['id'] === true || $params['order']['id'] === 'DESC')) { + $reverseModels = true; + $params['order']['id'] = 'ASC'; + } } - if (isset($since_id)) { - $boundCondition[0] .= " AND `id` > ?"; - $boundCondition[] = $since_id; + if (isset($max_id)) { + $boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $max_id]); + if (!isset($min_id) && (!isset($params['order']['id']) || $params['order']['id'] === false || $params['order']['id'] === 'ASC')) { + $reverseModels = true; + $params['order']['id'] = 'DESC'; + } } $params['limit'] = $limit; $models = $this->selectModels($boundCondition, $params); - $totalCount = DBA::count(static::$table_name, $condition); + if ($reverseModels) { + $models = array_reverse($models); + } return new static::$collection_class($models, $totalCount); } @@ -122,7 +156,12 @@ abstract class BaseRepository extends BaseFactory */ public function update(BaseModel $model) { - return $this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], true); + if ($this->dba->update(static::$table_name, $model->toArray(), ['id' => $model->id], $model->getOriginalData())) { + $model->resetOriginalData(); + return true; + } + + return false; } /** @@ -136,11 +175,13 @@ abstract class BaseRepository extends BaseFactory { $return = $this->dba->insert(static::$table_name, $fields); - if ($return) { - $fields['id'] = $this->dba->lastInsertId(); - $return = $this->create($fields); + if (!$return) { + throw new HTTPException\InternalServerErrorException('Unable to insert new row in table "' . static::$table_name . '"'); } + $fields['id'] = $this->dba->lastInsertId(); + $return = $this->create($fields); + return $return; } @@ -195,6 +236,16 @@ abstract class BaseRepository extends BaseFactory } } + $this->dba->close($result); + return $models; } + + /** + * @param BaseCollection $collection + */ + public function saveCollection(BaseCollection $collection) + { + $collection->map([$this, 'update']); + } }