|
9 | 9 | namespace OCA\Bookmarks\Db; |
10 | 10 |
|
11 | 11 | use OCA\Bookmarks\Events\BeforeDeleteEvent; |
| 12 | +use OCA\Bookmarks\Events\InsertEvent; |
| 13 | +use OCA\Bookmarks\Events\ManipulateEvent; |
12 | 14 | use OCA\Bookmarks\Exception\AlreadyExistsError; |
13 | 15 | use OCA\Bookmarks\Exception\UrlParseError; |
14 | 16 | use OCA\Bookmarks\Exception\UserLimitExceededError; |
@@ -257,6 +259,21 @@ protected function findEntitiesWithRawQuery(string $query, array $params, array |
257 | 259 | return $entities; |
258 | 260 | } |
259 | 261 |
|
| 262 | + /** |
| 263 | + * @throws \OCP\DB\Exception |
| 264 | + */ |
| 265 | + protected function getIteratorWithRawQuery(string $query, array $params, array $types): \Generator { |
| 266 | + $cursor = $this->db->executeQuery($query, $params, $types); |
| 267 | + |
| 268 | + $entities = []; |
| 269 | + |
| 270 | + while ($row = $cursor->fetch()) { |
| 271 | + yield $this->mapRowToEntity($row); |
| 272 | + } |
| 273 | + |
| 274 | + $cursor->closeCursor(); |
| 275 | + } |
| 276 | + |
260 | 277 | /** |
261 | 278 | * Common table expression that lists all items in a given folder, recursively |
262 | 279 | * @param int $folderId |
@@ -773,7 +790,9 @@ public function update(Entity $entity): Bookmark { |
773 | 790 | $entity->setUrl($this->urlNormalizer->normalize($entity->getUrl())); |
774 | 791 | } |
775 | 792 | $entity->setLastmodified(time()); |
776 | | - return parent::update($entity); |
| 793 | + parent::update($entity); |
| 794 | + $this->eventDispatcher->dispatchTyped(new ManipulateEvent('bookmark', $entity->getId())); |
| 795 | + return $entity; |
777 | 796 | } |
778 | 797 |
|
779 | 798 | /** |
@@ -806,6 +825,7 @@ public function insert(Entity $entity): Bookmark { |
806 | 825 | $this->findByUrl($entity->getUserId(), $entity->getUrl()); |
807 | 826 | } catch (DoesNotExistException $e) { |
808 | 827 | parent::insert($entity); |
| 828 | + $this->eventDispatcher->dispatchTyped(new InsertEvent('bookmark', $entity->getId())); |
809 | 829 | return $entity; |
810 | 830 | } catch (MultipleObjectsReturnedException $e) { |
811 | 831 | // noop |
@@ -904,4 +924,41 @@ private function _findSharersFor(string $userId) :array { |
904 | 924 | return $share->getOwner(); |
905 | 925 | }, $this->shareMapper->findByUser($userId)); |
906 | 926 | } |
| 927 | + |
| 928 | + public function getIterator(string $userId, QueryParameters $queryParams): \Generator { |
| 929 | + $rootFolder = $this->folderMapper->findRootFolder($userId); |
| 930 | + // gives us all bookmarks in this folder, recursively |
| 931 | + [$cte, $params, $paramTypes] = $this->_generateCTE($rootFolder->getId(), $queryParams->getSoftDeletedFolders()); |
| 932 | + |
| 933 | + $qb = $this->db->getQueryBuilder(); |
| 934 | + $bookmark_cols = array_map(static function ($c) { |
| 935 | + return 'b.' . $c; |
| 936 | + }, Bookmark::$columns); |
| 937 | + |
| 938 | + $qb->select($bookmark_cols); |
| 939 | + $qb->groupBy($bookmark_cols); |
| 940 | + |
| 941 | + $qb->automaticTablePrefix(false); |
| 942 | + |
| 943 | + $qb |
| 944 | + ->from('*PREFIX*bookmarks', 'b') |
| 945 | + ->innerJoin('b', 'folder_tree', 'tree', 'tree.item_id = b.id AND tree.type = ' . $qb->createPositionalParameter(TreeMapper::TYPE_BOOKMARK) |
| 946 | + . ($queryParams->getSoftDeleted() ? ' AND tree.soft_deleted_at is NOT NULL' : ' AND tree.soft_deleted_at is NULL')); |
| 947 | + |
| 948 | + $this->_filterUrl($qb, $queryParams); |
| 949 | + $this->_filterArchived($qb, $queryParams); |
| 950 | + $this->_filterUnavailable($qb, $queryParams); |
| 951 | + $this->_filterDuplicated($qb, $queryParams); |
| 952 | + $this->_filterFolder($qb, $queryParams); |
| 953 | + $this->_filterTags($qb, $queryParams); |
| 954 | + $this->_filterUntagged($qb, $queryParams); |
| 955 | + $this->_filterSearch($qb, $queryParams); |
| 956 | + $this->_sortAndPaginate($qb, $queryParams); |
| 957 | + |
| 958 | + $finalQuery = $cte . ' ' . $qb->getSQL(); |
| 959 | + |
| 960 | + $params = array_merge($params, $qb->getParameters()); |
| 961 | + $paramTypes = array_merge($paramTypes, $qb->getParameterTypes()); |
| 962 | + return $this->getIteratorWithRawQuery($finalQuery, $params, $paramTypes); |
| 963 | + } |
907 | 964 | } |
0 commit comments