|
3 | 3 | namespace CodedMonkey\Dirigent\Doctrine\Repository; |
4 | 4 |
|
5 | 5 | use CodedMonkey\Dirigent\Doctrine\Entity\Package; |
| 6 | +use CodedMonkey\Dirigent\Doctrine\Entity\Version; |
6 | 7 | use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; |
| 8 | +use Doctrine\DBAL\Connection; |
7 | 9 | use Doctrine\Persistence\ManagerRegistry; |
8 | 10 | use Symfony\Component\DependencyInjection\Attribute\Autowire; |
9 | 11 |
|
@@ -40,8 +42,6 @@ public function save(Package $entity, bool $flush = false): void |
40 | 42 |
|
41 | 43 | public function remove(Package $entity, bool $flush = false): void |
42 | 44 | { |
43 | | - $this->deletePackageLinks($entity->getId()); |
44 | | - |
45 | 45 | $this->getEntityManager()->remove($entity); |
46 | 46 |
|
47 | 47 | if ($flush) { |
@@ -85,55 +85,64 @@ public function getStalePackageIds(): array |
85 | 85 | ); |
86 | 86 | } |
87 | 87 |
|
88 | | - public function updatePackageLinks(int $packageId, int $versionId): void |
| 88 | + public function updatePackageLinks(Package $package, Version $version): void |
89 | 89 | { |
90 | 90 | $connection = $this->getEntityManager()->getConnection(); |
91 | | - $connection->beginTransaction(); |
92 | | - |
93 | | - try { |
94 | | - $this->deletePackageLinks($packageId); |
| 91 | + $connection->transactional(function(Connection $connection) use ($package, $version) { |
| 92 | + $this->deletePackageLinks($package); |
| 93 | + $queryParameters = ['id' => $package->getId(), 'version' => $version->getId()]; |
95 | 94 |
|
96 | | - $connection->executeStatement(<<<'SQL' |
| 95 | + $connection->executeStatement( |
| 96 | + <<<'SQL' |
97 | 97 | INSERT INTO package_provide_link (linked_package_name, implementation, package_id) |
98 | 98 | SELECT linked_package_name, FALSE, :id |
99 | 99 | FROM version_provide_link |
100 | 100 | WHERE version_id = :version AND linked_package_name NOT LIKE '%-implementation' |
101 | 101 | SQL, |
102 | | - ['id' => $packageId, 'version' => $versionId], |
| 102 | + $queryParameters, |
103 | 103 | ); |
104 | | - $connection->executeStatement(<<<'SQL' |
| 104 | + $connection->executeStatement( |
| 105 | + <<<'SQL' |
105 | 106 | INSERT INTO package_provide_link (linked_package_name, implementation, package_id) |
106 | 107 | SELECT SUBSTRING(linked_package_name, 1, LENGTH(linked_package_name) - 15), TRUE, :id |
107 | 108 | FROM version_provide_link |
108 | 109 | WHERE version_id = :version AND linked_package_name LIKE '%-implementation' |
109 | 110 | SQL, |
110 | | - ['id' => $packageId, 'version' => $versionId], |
| 111 | + $queryParameters, |
111 | 112 | ); |
112 | 113 | $connection->executeStatement( |
113 | | - 'INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) SELECT linked_package_name, FALSE, :id FROM version_require_link WHERE version_id = :version', |
114 | | - ['id' => $packageId, 'version' => $versionId], |
| 114 | + <<<'SQL' |
| 115 | + INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) |
| 116 | + SELECT linked_package_name, FALSE, :id FROM version_require_link WHERE version_id = :version |
| 117 | + SQL, |
| 118 | + $queryParameters, |
115 | 119 | ); |
116 | 120 | $connection->executeStatement( |
117 | | - 'INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) SELECT linked_package_name, TRUE, :id FROM version_dev_require_link WHERE version_id = :version', |
118 | | - ['id' => $packageId, 'version' => $versionId], |
| 121 | + <<<'SQL' |
| 122 | + INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) |
| 123 | + SELECT linked_package_name, TRUE, :id FROM version_dev_require_link WHERE version_id = :version |
| 124 | + SQL, |
| 125 | + $queryParameters, |
119 | 126 | ); |
120 | 127 | $connection->executeStatement( |
121 | | - 'INSERT INTO package_suggest_link (linked_package_name, package_id) SELECT linked_package_name, :id FROM version_suggest_link WHERE version_id = :version', |
122 | | - ['id' => $packageId, 'version' => $versionId], |
| 128 | + <<<'SQL' |
| 129 | + INSERT INTO package_suggest_link (linked_package_name, package_id) |
| 130 | + SELECT linked_package_name, :id FROM version_suggest_link WHERE version_id = :version |
| 131 | + SQL, |
| 132 | + $queryParameters, |
123 | 133 | ); |
124 | | - } catch (\Throwable $exception) { |
125 | | - $connection->rollBack(); |
126 | | - throw $exception; |
127 | | - } |
128 | | - |
129 | | - $connection->commit(); |
| 134 | + }); |
130 | 135 | } |
131 | 136 |
|
132 | | - public function deletePackageLinks(int $packageId): void |
| 137 | + public function deletePackageLinks(Package $package): void |
133 | 138 | { |
134 | 139 | $connection = $this->getEntityManager()->getConnection(); |
135 | | - $connection->executeStatement('DELETE FROM package_provide_link WHERE package_id = :id', ['id' => $packageId]); |
136 | | - $connection->executeStatement('DELETE FROM package_require_link WHERE package_id = :id', ['id' => $packageId]); |
137 | | - $connection->executeStatement('DELETE FROM package_suggest_link WHERE package_id = :id', ['id' => $packageId]); |
| 140 | + $connection->transactional(function(Connection $connection) use ($package) { |
| 141 | + $queryParameters = ['id' => $package->getId()]; |
| 142 | + |
| 143 | + $connection->executeStatement('DELETE FROM package_provide_link WHERE package_id = :id', $queryParameters); |
| 144 | + $connection->executeStatement('DELETE FROM package_require_link WHERE package_id = :id', $queryParameters); |
| 145 | + $connection->executeStatement('DELETE FROM package_suggest_link WHERE package_id = :id', $queryParameters); |
| 146 | + }); |
138 | 147 | } |
139 | 148 | } |
0 commit comments