From 8ca6cc32b2c789a3149861159ad258f2cb9491e3 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 14:39:39 +0200 Subject: Adding upstream version 2.11.4. Signed-off-by: Daniel Baumann --- library/vendor/Zend/Paginator/Adapter/Array.php | 80 ++++++ library/vendor/Zend/Paginator/Adapter/DbSelect.php | 285 +++++++++++++++++++++ .../Zend/Paginator/Adapter/DbTableSelect.php | 47 ++++ .../vendor/Zend/Paginator/Adapter/Interface.php | 40 +++ library/vendor/Zend/Paginator/Adapter/Iterator.php | 99 +++++++ library/vendor/Zend/Paginator/Adapter/Null.php | 79 ++++++ library/vendor/Zend/Paginator/AdapterAggregate.php | 40 +++ library/vendor/Zend/Paginator/Exception.php | 34 +++ .../vendor/Zend/Paginator/ScrollingStyle/All.php | 49 ++++ .../Zend/Paginator/ScrollingStyle/Elastic.php | 62 +++++ .../Zend/Paginator/ScrollingStyle/Interface.php | 38 +++ .../Zend/Paginator/ScrollingStyle/Jumping.php | 62 +++++ .../Zend/Paginator/ScrollingStyle/Sliding.php | 77 ++++++ .../Zend/Paginator/SerializableLimitIterator.php | 159 ++++++++++++ 14 files changed, 1151 insertions(+) create mode 100644 library/vendor/Zend/Paginator/Adapter/Array.php create mode 100644 library/vendor/Zend/Paginator/Adapter/DbSelect.php create mode 100644 library/vendor/Zend/Paginator/Adapter/DbTableSelect.php create mode 100644 library/vendor/Zend/Paginator/Adapter/Interface.php create mode 100644 library/vendor/Zend/Paginator/Adapter/Iterator.php create mode 100644 library/vendor/Zend/Paginator/Adapter/Null.php create mode 100644 library/vendor/Zend/Paginator/AdapterAggregate.php create mode 100644 library/vendor/Zend/Paginator/Exception.php create mode 100644 library/vendor/Zend/Paginator/ScrollingStyle/All.php create mode 100644 library/vendor/Zend/Paginator/ScrollingStyle/Elastic.php create mode 100644 library/vendor/Zend/Paginator/ScrollingStyle/Interface.php create mode 100644 library/vendor/Zend/Paginator/ScrollingStyle/Jumping.php create mode 100644 library/vendor/Zend/Paginator/ScrollingStyle/Sliding.php create mode 100644 library/vendor/Zend/Paginator/SerializableLimitIterator.php (limited to 'library/vendor/Zend/Paginator') diff --git a/library/vendor/Zend/Paginator/Adapter/Array.php b/library/vendor/Zend/Paginator/Adapter/Array.php new file mode 100644 index 0000000..b4d0c09 --- /dev/null +++ b/library/vendor/Zend/Paginator/Adapter/Array.php @@ -0,0 +1,80 @@ +_array = $array; + $this->_count = count($array); + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + return array_slice($this->_array, $offset, $itemCountPerPage); + } + + /** + * Returns the total number of rows in the array. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} diff --git a/library/vendor/Zend/Paginator/Adapter/DbSelect.php b/library/vendor/Zend/Paginator/Adapter/DbSelect.php new file mode 100644 index 0000000..ebd7142 --- /dev/null +++ b/library/vendor/Zend/Paginator/Adapter/DbSelect.php @@ -0,0 +1,285 @@ +_select = $select; + $this->_cacheIdentifier = md5($select->assemble()); + } + + /** + * Returns the cache identifier. + * + * @return string + */ + public function getCacheIdentifier() + { + return $this->_cacheIdentifier; + } + + /** + * Sets the total row count, either directly or through a supplied + * query. Without setting this, {@link getPages()} selects the count + * as a subquery (SELECT COUNT ... FROM (SELECT ...)). While this + * yields an accurate count even with queries containing clauses like + * LIMIT, it can be slow in some circumstances. For example, in MySQL, + * subqueries are generally slow when using the InnoDB storage engine. + * Users are therefore encouraged to profile their queries to find + * the solution that best meets their needs. + * + * @param Zend_Db_Select|integer $totalRowCount Total row count integer + * or query + * @return Zend_Paginator_Adapter_DbSelect $this + * @throws Zend_Paginator_Exception + */ + public function setRowCount($rowCount) + { + if ($rowCount instanceof Zend_Db_Select) { + $columns = $rowCount->getPart(Zend_Db_Select::COLUMNS); + + $countColumnPart = empty($columns[0][2]) + ? $columns[0][1] + : $columns[0][2]; + + if ($countColumnPart instanceof Zend_Db_Expr) { + $countColumnPart = $countColumnPart->__toString(); + } + + $rowCountColumn = $this->_select->getAdapter()->foldCase(self::ROW_COUNT_COLUMN); + + // The select query can contain only one column, which should be the row count column + if (false === strpos($countColumnPart, $rowCountColumn)) { + /** + * @see Zend_Paginator_Exception + */ + + throw new Zend_Paginator_Exception('Row count column not found'); + } + + $result = $rowCount->query(Zend_Db::FETCH_ASSOC)->fetch(); + + $this->_rowCount = count($result) > 0 ? $result[$rowCountColumn] : 0; + } else if (is_integer($rowCount)) { + $this->_rowCount = $rowCount; + } else { + /** + * @see Zend_Paginator_Exception + */ + + throw new Zend_Paginator_Exception('Invalid row count'); + } + + return $this; + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + $this->_select->limit($itemCountPerPage, $offset); + + return $this->_select->query()->fetchAll(); + } + + /** + * Returns the total number of rows in the result set. + * + * @return integer + */ + public function count() + { + if ($this->_rowCount === null) { + $this->setRowCount( + $this->getCountSelect() + ); + } + + return $this->_rowCount; + } + + /** + * Get the COUNT select object for the provided query + * + * TODO: Have a look at queries that have both GROUP BY and DISTINCT specified. + * In that use-case I'm expecting problems when either GROUP BY or DISTINCT + * has one column. + * + * @return Zend_Db_Select + */ + public function getCountSelect() + { + /** + * We only need to generate a COUNT query once. It will not change for + * this instance. + */ + if ($this->_countSelect !== null) { + return $this->_countSelect; + } + + $rowCount = clone $this->_select; + $rowCount->__toString(); // Workaround for ZF-3719 and related + + $db = $rowCount->getAdapter(); + + $countColumn = $db->quoteIdentifier($db->foldCase(self::ROW_COUNT_COLUMN)); + $countPart = 'COUNT(1) AS '; + $groupPart = null; + $unionParts = $rowCount->getPart(Zend_Db_Select::UNION); + + /** + * If we're dealing with a UNION query, execute the UNION as a subquery + * to the COUNT query. + */ + if (!empty($unionParts)) { + $expression = new Zend_Db_Expr($countPart . $countColumn); + + $rowCount = $db + ->select() + ->bind($rowCount->getBind()) + ->from($rowCount, $expression); + } else { + $columnParts = $rowCount->getPart(Zend_Db_Select::COLUMNS); + $groupParts = $rowCount->getPart(Zend_Db_Select::GROUP); + $havingParts = $rowCount->getPart(Zend_Db_Select::HAVING); + $isDistinct = $rowCount->getPart(Zend_Db_Select::DISTINCT); + + /** + * If there is more than one column AND it's a DISTINCT query, more + * than one group, or if the query has a HAVING clause, then take + * the original query and use it as a subquery os the COUNT query. + */ + if (($isDistinct && ((count($columnParts) == 1 && $columnParts[0][1] == Zend_Db_Select::SQL_WILDCARD) + || count($columnParts) > 1)) || count($groupParts) > 1 || !empty($havingParts)) { + $rowCount->reset(Zend_Db_Select::ORDER); + $rowCount = $db + ->select() + ->bind($rowCount->getBind()) + ->from($rowCount); + } else if ($isDistinct) { + $part = $columnParts[0]; + + if ($part[1] !== Zend_Db_Select::SQL_WILDCARD && !($part[1] instanceof Zend_Db_Expr)) { + $column = $db->quoteIdentifier($part[1], true); + + if (!empty($part[0])) { + $column = $db->quoteIdentifier($part[0], true) . '.' . $column; + } + + $groupPart = $column; + } + } else if (!empty($groupParts)) { + $groupPart = $db->quoteIdentifier($groupParts[0], true); + } + + /** + * If the original query had a GROUP BY or a DISTINCT part and only + * one column was specified, create a COUNT(DISTINCT ) query instead + * of a regular COUNT query. + */ + if (!empty($groupPart)) { + $countPart = 'COUNT(DISTINCT ' . $groupPart . ') AS '; + } + + /** + * Create the COUNT part of the query + */ + $expression = new Zend_Db_Expr($countPart . $countColumn); + + $rowCount->reset(Zend_Db_Select::COLUMNS) + ->reset(Zend_Db_Select::ORDER) + ->reset(Zend_Db_Select::LIMIT_OFFSET) + ->reset(Zend_Db_Select::GROUP) + ->reset(Zend_Db_Select::DISTINCT) + ->reset(Zend_Db_Select::HAVING) + ->columns($expression); + } + + $this->_countSelect = $rowCount; + + return $rowCount; + } +} diff --git a/library/vendor/Zend/Paginator/Adapter/DbTableSelect.php b/library/vendor/Zend/Paginator/Adapter/DbTableSelect.php new file mode 100644 index 0000000..dac467f --- /dev/null +++ b/library/vendor/Zend/Paginator/Adapter/DbTableSelect.php @@ -0,0 +1,47 @@ +_select->limit($itemCountPerPage, $offset); + + return $this->_select->getTable()->fetchAll($this->_select); + } +} diff --git a/library/vendor/Zend/Paginator/Adapter/Interface.php b/library/vendor/Zend/Paginator/Adapter/Interface.php new file mode 100644 index 0000000..7ec1ee2 --- /dev/null +++ b/library/vendor/Zend/Paginator/Adapter/Interface.php @@ -0,0 +1,40 @@ +_iterator = $iterator; + $this->_count = count($iterator); + } + + /** + * Returns an iterator of items for a page, or an empty array. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return LimitIterator|array + */ + public function getItems($offset, $itemCountPerPage) + { + if ($this->_count == 0) { + return array(); + } + + // @link http://bugs.php.net/bug.php?id=49906 | ZF-8084 + // return new LimitIterator($this->_iterator, $offset, $itemCountPerPage); + return new Zend_Paginator_SerializableLimitIterator($this->_iterator, $offset, $itemCountPerPage); + } + + /** + * Returns the total number of rows in the collection. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} diff --git a/library/vendor/Zend/Paginator/Adapter/Null.php b/library/vendor/Zend/Paginator/Adapter/Null.php new file mode 100644 index 0000000..da91d4d --- /dev/null +++ b/library/vendor/Zend/Paginator/Adapter/Null.php @@ -0,0 +1,79 @@ +_count = $count; + } + + /** + * Returns an array of items for a page. + * + * @param integer $offset Page offset + * @param integer $itemCountPerPage Number of items per page + * @return array + */ + public function getItems($offset, $itemCountPerPage) + { + if ($offset >= $this->count()) { + return array(); + } + + $remainItemCount = $this->count() - $offset; + $currentItemCount = $remainItemCount > $itemCountPerPage ? $itemCountPerPage : $remainItemCount; + + return array_fill(0, $currentItemCount, null); + } + + /** + * Returns the total number of rows in the array. + * + * @return integer + */ + public function count() + { + return $this->_count; + } +} diff --git a/library/vendor/Zend/Paginator/AdapterAggregate.php b/library/vendor/Zend/Paginator/AdapterAggregate.php new file mode 100644 index 0000000..fe209d4 --- /dev/null +++ b/library/vendor/Zend/Paginator/AdapterAggregate.php @@ -0,0 +1,40 @@ +getPagesInRange(1, $paginator->count()); + } +} diff --git a/library/vendor/Zend/Paginator/ScrollingStyle/Elastic.php b/library/vendor/Zend/Paginator/ScrollingStyle/Elastic.php new file mode 100644 index 0000000..6e103f6 --- /dev/null +++ b/library/vendor/Zend/Paginator/ScrollingStyle/Elastic.php @@ -0,0 +1,62 @@ +getPageRange(); + $pageNumber = $paginator->getCurrentPageNumber(); + + $originalPageRange = $pageRange; + $pageRange = $pageRange * 2 - 1; + + if ($originalPageRange + $pageNumber - 1 < $pageRange) { + $pageRange = $originalPageRange + $pageNumber - 1; + } else if ($originalPageRange + $pageNumber - 1 > count($paginator)) { + $pageRange = $originalPageRange + count($paginator) - $pageNumber; + } + + return parent::getPages($paginator, $pageRange); + } +} diff --git a/library/vendor/Zend/Paginator/ScrollingStyle/Interface.php b/library/vendor/Zend/Paginator/ScrollingStyle/Interface.php new file mode 100644 index 0000000..7871d89 --- /dev/null +++ b/library/vendor/Zend/Paginator/ScrollingStyle/Interface.php @@ -0,0 +1,38 @@ +getPageRange(); + $pageNumber = $paginator->getCurrentPageNumber(); + + $delta = $pageNumber % $pageRange; + + if ($delta == 0) { + $delta = $pageRange; + } + + $offset = $pageNumber - $delta; + $lowerBound = $offset + 1; + $upperBound = $offset + $pageRange; + + return $paginator->getPagesInRange($lowerBound, $upperBound); + } +} diff --git a/library/vendor/Zend/Paginator/ScrollingStyle/Sliding.php b/library/vendor/Zend/Paginator/ScrollingStyle/Sliding.php new file mode 100644 index 0000000..8bc6962 --- /dev/null +++ b/library/vendor/Zend/Paginator/ScrollingStyle/Sliding.php @@ -0,0 +1,77 @@ +getPageRange(); + } + + $pageNumber = $paginator->getCurrentPageNumber(); + $pageCount = count($paginator); + + if ($pageRange > $pageCount) { + $pageRange = $pageCount; + } + + $delta = ceil($pageRange / 2); + + if ($pageNumber - $delta > $pageCount - $pageRange) { + $lowerBound = $pageCount - $pageRange + 1; + $upperBound = $pageCount; + } else { + if ($pageNumber - $delta < 0) { + $delta = $pageNumber; + } + + $offset = $pageNumber - $delta; + $lowerBound = $offset + 1; + $upperBound = $offset + $pageRange; + } + + return $paginator->getPagesInRange($lowerBound, $upperBound); + } +} diff --git a/library/vendor/Zend/Paginator/SerializableLimitIterator.php b/library/vendor/Zend/Paginator/SerializableLimitIterator.php new file mode 100644 index 0000000..0e2e3d0 --- /dev/null +++ b/library/vendor/Zend/Paginator/SerializableLimitIterator.php @@ -0,0 +1,159 @@ +_offset = $offset; + $this->_count = $count; + } + + /** + * @return string representation of the instance + */ + public function serialize() + { + return serialize(array( + 'it' => $this->getInnerIterator(), + 'offset' => $this->_offset, + 'count' => $this->_count, + 'pos' => $this->getPosition(), + )); + } + + public function __serialize(): array + { + return array( + 'it' => $this->getInnerIterator(), + 'offset' => $this->_offset, + 'count' => $this->_count, + 'pos' => $this->getPosition(), + ); + } + + /** + * @param string $data representation of the instance + */ + public function unserialize($data) + { + $dataArr = unserialize($data); + $this->__construct($dataArr['it'], $dataArr['offset'], $dataArr['count']); + $this->seek($dataArr['pos']+$dataArr['offset']); + } + + public function __unserialize(array $data): void + { + $this->__construct($data['it'], $data['offset'], $data['count']); + $this->seek($data['pos']+$data['offset']); + } + + /** + * Returns value of the Iterator + * + * @param int $offset + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + $currentOffset = $this->key(); + $this->seek($offset); + $current = $this->current(); + $this->seek($currentOffset); + return $current; + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param int $offset + * @param mixed $value + */ + public function offsetSet($offset, $value): void + { + } + + /** + * Determine if a value of Iterator is set and is not NULL + * + * @param int $offset + */ + public function offsetExists($offset): bool + { + if ($offset > 0 && $offset < $this->_count) { + try { + $currentOffset = $this->key(); + $this->seek($offset); + $current = $this->current(); + $this->seek($currentOffset); + return null !== $current; + } catch (OutOfBoundsException $e) { + // reset position in case of exception is assigned null + $this->rewind(); + $this->seek($currentOffset); + return false; + } + } + return false; + } + + /** + * Does nothing + * Required by the ArrayAccess implementation + * + * @param int $offset + */ + public function offsetUnset($offset): void + { + } +} -- cgit v1.2.3