/** * release all lock acquired by this instance which were marked using the mark* methods */ public function releaseAll() { parent::releaseAll(); // since we keep shared locks we need to manually clean those foreach ($this->sharedLocks as $path => $lock) { if ($lock) { $this->connection->executeUpdate( 'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` - 1 WHERE `key` = ? AND `lock` > 0', [$path] ); } } }
/** * release all lock acquired by this instance which were marked using the mark* methods */ public function releaseAll() { parent::releaseAll(); // since we keep shared locks we need to manually clean those $lockedPaths = array_keys($this->sharedLocks); $lockedPaths = array_filter($lockedPaths, function ($path) { return $this->sharedLocks[$path]; }); $chunkedPaths = array_chunk($lockedPaths, 100); foreach ($chunkedPaths as $chunk) { $builder = $this->connection->getQueryBuilder(); $query = $builder->update('file_locks')->set('lock', $builder->createFunction('`lock` -1'))->where($builder->expr()->in('key', $builder->createNamedParameter($chunk, IQueryBuilder::PARAM_STR_ARRAY)))->andWhere($builder->expr()->gt('lock', new Literal(0))); $query->execute(); } }