ADR 0013: курсорные страницы каталога UPack
Статус: accepted. Дата: 2026-09-23.
Контекст
Нативный список зарегистрированных UPack ограничивался 1000 версиями после фильтрации. Простая нарезка исходного SQL-порядка на страницы нарушила бы выбранную сортировку по SemVer: текстовый порядок 1.10.0 и 1.9.0 отличается от порядка версий.
Решение
- Нативный
GET /api/v1/repositories/{repository}/packagesвозвращает до 50 записей по умолчанию, максимум 100 поlimit, и непрозрачныйnextдля параметраafter. SDK и консоль используют тот же контракт. Группировка строится только внутри текущей страницы. - Миграция 7 добавляет неизменяемую SQL-функцию
arkvory_semver_key(text). Она строит сравнимый ключ из числовых частей версии и идентификаторов prerelease; build metadata не влияет на приоритет. При равном приоритете исходная строка версии и ID артефакта задают устойчивый порядок. Для имён группы и пакета используется регистронезависимое сравнение с коллациейC. - Адаптер выполняет keyset-запрос с
LIMIT limit+1. Курсор содержит значения последней строки, репозиторий, выбранные фильтры, сортировку и направление. Некорректный курсор или его применение с другим репозиторием, фильтрами или порядком возвращаетinvalid_input. Права репозитория проверяются до чтения страницы. - Запрос не удерживает SQL-транзакцию между страницами. Добавленная во время просмотра версия может появиться на следующей странице, если её ключ позже курсора; версия перед курсором в этой последовательности не появится. Для неизменных записей повторов и пропусков нет.
Последствия
Миграция 7 только добавляет функцию и не переписывает существующие таблицы. Замеры и последующие индексы описаны в ADR 0014. На момент решения lookup exact/latest для скачивания сохранял предел 1000 совпадений; последующая точечная выборка exact/latest устранила его без изменения внешнего контракта. Курсор не содержит секретов и не заменяет проверку ACL.