*/ /** * Plik z bazą danych synchronizowanych aplikacji. * @deprecated since stInstallerPlugin 1.0.3 */ define ("ST_APP_REGISTRY_DB",sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'install'.DIRECTORY_SEPARATOR.'db'.DIRECTORY_SEPARATOR.'.registry.yml'); /** * Plik z bazą danych synchronizowanych aplikacji. */ define ("ST_APP_REGISTRY_DB2",sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'install'.DIRECTORY_SEPARATOR.'db'.DIRECTORY_SEPARATOR.'.registry.reg'); /** * Katalog z bazą danych sum kontrolnych */ if (! defined('ST_APP_REGISTRY_MD5SUM')) define ("ST_APP_REGISTRY_MD5SUM",sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'install'.DIRECTORY_SEPARATOR.'db'.DIRECTORY_SEPARATOR.'.md5sum'); /** * Obsługuje dane synchronizacji zapisane w pliku. * * @package stInstallerPlugin * @subpackage libs */ class stRegisterSync { /** * @var string plik z bazą danych synchornizowanych aplikacji */ var $registryFile; /** * @var stInstaller */ var $installer; /** * Konstruktor. */ public function __construct($file=ST_APP_REGISTRY_DB2) { $this->peari = stPearInfo::getInstance(); $this->registryFile=$file; $this->installer = new stInstaller(); $this->history = new stInstallerHistory(); $this->fixmd5sum(); } /** * Zapisz w bazie informacje o zainstalowaniu aplikacji. * Baza danych aplikacji install/db/.registry.reg * * @param string $app nazwa aplikacji * @return bool */ public function register($app) { $version=$this->peari->getPackageVersion($app); if (empty($version)) $action='uninstall'; else $action='install'; $registry=$this->getData(); switch ($action) { case "install": if ($this->registerMd5sum($app)) { $registry['packages'][$app]=$version; } break; case "uninstall": if ($this->unregisterMd5sum($app)) { unset($registry['packages'][$app]); } break; } // $ret=stFile::write($this->registryFile,sfYaml::dump($registry)); $ret=stFile::write($this->registryFile,serialize($registry)); $this->history->add($app,$version); // dodaj do historii aktualizacji $this->history->save(); // zapisz po każdej aktualizacji, na wypadek przerwania aktualizacji return $ret; } /** * Odczytuje dane z pliku i zwaraca tablicę. * * @return array */ static public function getData() { $registry=array(); if (file_exists(ST_APP_REGISTRY_DB2)) { // update z wersji 1.0.2 do 1.0.3, zmiana lokalizacji pliku danych // system za pierwszym razem odczytuje dane ze starego pliku a zapisuje w nowym if (! file_exists(ST_APP_REGISTRY_DB2)) $data=sfYaml::load(ST_APP_REGISTRY_DB2); else { if (file_exists(ST_APP_REGISTRY_DB)) unlink(ST_APP_REGISTRY_DB); // usun stary plik z werjsi 1.0.2 $data=unserialize(file_get_contents(ST_APP_REGISTRY_DB2)); } if (! empty($data)) $registry=$data; } else { if (file_exists(ST_APP_REGISTRY_DB)) { $data=sfYaml::load(ST_APP_REGISTRY_DB); if (! empty($data)) $registry=$data; } } return $registry; } /** * Odczytaj listę aplikacji * * @return array array('stAppName'=>'1.0.2','stTest'=>'1.0.0',...) */ static public function getSynchronizedApps() { $data=self::getData(); if (is_array($data['packages'])) return $data['packages']; else return array(); } /** * Odczytuje wersje zsynchronizowanej wersji aplikacji * * @return string|null np. 1.0.2 * @todo prztestować */ static public function getPackageVersion($app) { $apps=self::getSynchronizedApps(); if (! empty($apps[$app])) return $apps[$app]; else return null; } /** * Zwraca listę aplikacji so synchronizacji * * @return array */ function getAppsToSync() { $apps_pear=$this->installer->getInstalledApps(); $apps_sync=$this->getSynchronizedApps(); $changes=st_array_diff($apps_sync,$apps_pear); return $changes; } /** * Rejestruje sumy kontrolne plików aplikacji * * @param string $app aplikacja * @return bool */ private function registerMd5Sum($app) { pake_echo ("Registering md5sum for $app"); $file = new stFile(); $filereg=$this->peari->getPearRegistryFile($app); if (! is_dir(ST_APP_REGISTRY_MD5SUM)) { $file->mkdir(ST_APP_REGISTRY_MD5SUM); } $regfiledb=ST_APP_REGISTRY_MD5SUM.DIRECTORY_SEPARATOR.basename($filereg); $file->copy($filereg,$regfiledb); return true; } /** * Usuwa dane sum kontrolnych aplikacji * * @param string $app aplikacja * @return bool */ private function unregisterMd5Sum($app) { pake_echo ("Unregistering md5sum for $app"); $file = new stFile(); $filereg=strtolower($app).'.reg'; $regfiledb=ST_APP_REGISTRY_MD5SUM.DIRECTORY_SEPARATOR.basename($filereg); if (file_exists($regfiledb)) { if ($file->rm($regfiledb)) return true; else return false; } return true; } /** * Fix soteshop 5.0.0 -> 5.0.1 * Dodaje bazę install/db/.md5sum. Baza może być dodana przez kopiowanie TYLKO 1 raz, jeśli nie istnieje, * lub zostanie błędnie usunięta. */ static public function fixmd5sum() { if (! is_dir(ST_APP_REGISTRY_MD5SUM)) { $peari = stPearInfo::getInstance(); $file = new stFile(); $dir=$peari->getPearRegistryDir(); $apps=sfFinder::type('file')->name('*.reg')->in($dir); if ($file->mkdir(ST_APP_REGISTRY_MD5SUM)) { foreach ($apps as $regfile) { $file->copy($regfile,ST_APP_REGISTRY_MD5SUM.DIRECTORY_SEPARATOR.basename($regfile)); } } else throw new Exception('Can\'t make directory '.$dir); } } }