setDboFromAdapter($parent); // Do not run on uninstall. if ($type === 'uninstall') { return true; } define('AKEEBABACKUP_INSTALLATION_PRO', is_file($parent->getParent()->getPath('source') . '/com_akeebabackup-pro.zip')); return true; } /** * Called after any type of installation / uninstallation action. * * @param string $type Which action is happening (install|uninstall|discover_install|update) * @param PackageAdapter $parent The object responsible for running this script * * @return bool * @since 9.0.0 */ public function postflight(string $type, PackageAdapter $parent): bool { $this->setDboFromAdapter($parent); // Do not run on uninstall. if ($type === 'uninstall') { return true; } $model = $this->getUpgradeModel(); if (empty($model)) { return true; } return $model->postflight($type, $parent); } /** * Get the UpgradeModel of the installed component * * @return UpgradeModel|null The upgrade Model. NULL if it cannot be loaded. * @since 9.0.0 */ private function getUpgradeModel(): ?UpgradeModel { // Make sure the latest version of the Model file will be loaded, regardless of the OPcache state. $filePath = JPATH_ADMINISTRATOR . '/components/com_akeebabackup/src/Model/UpgradeModel.php'; if (function_exists('opcache_invalidate')) { opcache_invalidate($filePath = JPATH_ADMINISTRATOR . '/components/com_akeebabackup/src/Model/UpgradeModel.php'); } // Can I please load the model? if (!class_exists('\Akeeba\Component\AkeebaBackup\Administrator\Model\UpgradeModel')) { if (!file_exists($filePath) || !is_readable($filePath)) { return null; } include_once $filePath; } if (!class_exists('\Akeeba\Component\AkeebaBackup\Administrator\Model\UpgradeModel')) { return null; } try { $upgradeModel = new UpgradeModel(); } catch (Throwable $e) { return null; } if (method_exists($upgradeModel, 'setDatabase')) { $upgradeModel->setDatabase($this->dbo ?? Factory::getContainer()->get('DatabaseDriver')); } elseif (method_exists($upgradeModel, 'setDbo')) { $upgradeModel->setDbo($this->dbo ?? Factory::getContainer()->get('DatabaseDriver')); } if (method_exists($upgradeModel, 'init')) { $upgradeModel->init(); } return $upgradeModel; } /** * Set the database object from the installation adapter, if possible * * @param InstallerAdapter|mixed $adapter The installation adapter, hopefully. * * @since 9.3.0 * @return void */ private function setDboFromAdapter($adapter): void { $this->dbo = null; if (class_exists(InstallerAdapter::class) && ($adapter instanceof InstallerAdapter)) { /** * If this is Joomla 4.2+ the adapter has a protected getDatabase() method which we can access with the * magic property $adapter->db. On Joomla 4.1 and lower this is not available. So, we have to first figure * out if we can actually use the magic property... */ try { $refObj = new ReflectionObject($adapter); if ($refObj->hasMethod('getDatabase')) { $this->dbo = $adapter->db; return; } } catch (Throwable $e) { // If something breaks we will fall through } } $this->dbo = Factory::getContainer()->get('DatabaseDriver'); } }