public static function beginTransaction() { if (is_null(self::$instance)) { self::$instance = new Package_Transaction(); } self::$instance->transaction = array(); return self::$instance; }
public function repair_all() { $this->template->content = new View('generic/blank'); $catalog = Package_Manager::getDisplayList(); if (empty($catalog['Installed'])) { return; } try { $transaction = Package_Transaction::beginTransaction(); foreach ($catalog['Installed'] as $package) { $transaction->repair($package['identifier']); } $transaction->commit(); message::set('Repair all operation completed', 'success'); } catch (Exception $e) { message::set($e->getMessage()); } url::redirect(Router::$controller); }
public static function validateIntegration($identifier) { $package = Package_Catalog::getPackageByIdentifier($identifier); $failures = array(); foreach ($package['required'] as $requirement => $conditions) { switch ($requirement) { case 'not': foreach ($conditions as $name => $condition) { if (!($dependency = Package_Catalog::getInstalledPackage($name))) { try { // Hmmm, this is offly optimistic.... $dependency = Package_Transaction::checkTransaction($name); } catch (Exception $e) { continue; } } if (self::compareVersion($dependency['version'], $condition)) { Package_Message::log('debug', 'dependency restriction, ' . $package['packageName'] . ' can not be installed with ' . $name . ' version ' . $condition); Package_Message::set($package['displayName'] . ' version ' . $package['version'] . ' can not be installed with ' . $dependency['displayName'] . ' version ' . $dependency['version'], 'error', $identifier); Package_Message::set($dependency['displayName'] . ' conflicts with ' . $package['displayName'], 'alert', $dependency['identifier']); $failures['not'][$name] = $condition; } } break; case 'or': $failed = array(); foreach ($conditions as $name => $condition) { if (!($dependency = Package_Catalog::getInstalledPackage($name))) { try { // Hmmm, this is offly optimistic.... $dependency = Package_Transaction::checkTransaction($name); } catch (Exception $e) { continue; } } if (self::compareVersion($dependency['version'], $condition)) { continue 2; } Package_Message::set($dependency['displayName'] . ' is part of a series of packages, one of which must be installed for ' . $package['displayName'], 'info', $dependency['identifier']); $failed[$name] = $condition; } Package_Message::log('debug', 'dependency restriction ' . $package['packageName'] . ' requires one to be installed -> ' . implode(', ', $failed)); Package_Message::set($package['displayName'] . ' version ' . $package['version'] . ' requires one of the following to be install: ' . implode(', ', $failed), 'error', $identifier); $failures['or'] += $failed; break; default: if (!($dependency = Package_Catalog::getInstalledPackage($requirement))) { try { // Hmmm, this is offly optimistic.... $dependency = Package_Transaction::checkTransaction($requirement); } catch (Exception $e) { Package_Message::log('debug', 'dependency restriction ' . $package['packageName'] . ' requires ' . $requirement . ' version ' . $conditions . ' but it is not installed'); Package_Message::set($package['displayName'] . ' version ' . $package['version'] . ' requires ' . ucfirst($requirement) . ' but it is not avaliable', 'error', $identifier); $failures['missing'][$requirement] = $conditions; continue; } } if (!self::compareVersion($dependency['version'], $conditions)) { Package_Message::log('debug', 'dependency restriction ' . $package['packageName'] . ' requires ' . $requirement . ' version ' . $conditions); Package_Message::set($package['displayName'] . ' version ' . $package['version'] . ' requires ' . $dependency['displayName'] . ' version ' . $conditions . ' but it is not avaliable', 'error', $identifier); $failures['incompatible'][$requirement] = $conditions; } } } if (!empty($failures)) { $dependencyException = new Package_Dependency_Exception('Package did not pass dependency validation'); $dependencyException->loadFailures($failures); throw $dependencyException; } }
private function _freshInstall() { $defaultModules = Kohana::config('config.modules'); Kohana::config_set('core.modules', $defaultModules); // Get the doctrine overlord $manager = Doctrine_Manager::getInstance(); $conn = $manager->getCurrentConnection(); try { // See if we can connect to the DB $conn->connect(); } catch (Doctrine_Connection_Exception $e) { // We could connect earlier, hmmm.... try { Doctrine::createDatabases(); } catch (Exception $e) { // We cant resolve this issue without the user message::set('Unable to establish a connection to ' . $this->session->get('installer.dbName') . '! <div class="error_details">' . $e->getMessage() . '</div>'); return FALSE; } } // See if the DB has any tables in it $tables = $conn->import->listTables(); if (!empty($tables)) { // Yup, there are tables in our soon to be fresh install db, remove them try { $dsn = $conn->getOption('dsn'); $dsn = $manager->parsePdoDsn($dsn); $tmpConn = $conn->getTmpConnection($dsn); $conn->close(); $tmpConn->export->dropDatabase($dsn['dbname']); $tmpConn->export->createDatabase($dsn['dbname']); $manager->closeConnection($tmpConn); $conn->connect(); } catch (Exception $e) { // We cant resolve this issue without the user message::set('Unable to recreate database ' . $this->session->get('installer.dbName') . '! <div class="error_details">' . $e->getMessage() . '</div>'); return FALSE; } } $driver = $this->session->get('installer.tel_driver', 'none'); kohana::log('debug', 'Installer running for driver ' . $driver); $packages = $this->session->get('installer.default_packages', array()); $packages = arr::merge($this->minimumPackages, $packages, array($driver)); try { $transaction = Package_Transaction::beginTransaction(); foreach ($packages as $package) { try { $identifier = Package_Catalog::getFirstAvaliablePackage($package); $transaction->install($identifier); } catch (Exception $e) { kohana::log('error', 'Error during initial install package selection: ' . $e->getMessage()); } } $transaction->commit(); Session::instance()->set('Bluebox_installer.created', Bluebox_Tenant::$created); return TRUE; } catch (Exception $e) { message::set('Installer Error!' . '<div class="error_details">' . $e->getMessage() . '</div>'); return FALSE; } }