<?php
class updater
{
 var $error;
 var $notice = array();
 var $chmod_err = array();
 protected $_update_dir;
 protected $_info;
 protected $_sqls = array(); // SQL запросы для изменения структуры таблиц
 function __construct($zip_path)
 {
 $this -> _update_dir = TMP.'/'.passgen(32);
 filesystem::mkdir($this -> _update_dir) or die('Ошибка при создании временной папки');
 
 $zip = new PclZip($zip_path);
 $zip -> extract(PCLZIP_OPT_PATH, $this -> _update_dir);
 
 
 $this -> _readInfo(); // получение информации о пакете и проверка совместимости
 $this -> _getSQLs(); // получение SQL запросов для обновления структуры базы
 $this -> _checkChmod($this -> _update_dir); // проверка прав
 }
 
 protected function _readInfo()
 {
 // получение информации о пакете
 
 if (!is_file($this -> _update_dir.'/install.ini'))
 {
 $this -> error = 'Нет файла конфигурации';
 return false;
 }
 
 if (!$this -> _info = ini::read($this -> _update_dir.'/install.ini'))
 {
 $this -> error = 'Файл конфигурации поврежден';
 return false;
 }
 
 if (!empty($this -> _info['version_min']))
 {
 global $dcms;
 if (version_compare($this -> _info['version_min'], $dcms -> version, '<'))
 {
 $this -> error = 'Этот пакет предназначен для версии DCMS не ниже '.$this -> _info['version_min'];
 return false;
 }
 }
 
 if (!empty($this -> _info['version_max']))
 {
 global $dcms;
 if (version_compare($this -> _info['version_max'], $dcms -> version, '>'))
 {
 $this -> error = 'Этот пакет предназначен для версии DCMS не выше '.$this -> _info['version_max'];
 return false;
 }
 }
 }
 
 
 
 protected function _getSQLs()
 {
 $tables = new tables(); // получение списка таблиц из базы
 if (!is_dir($this -> _update_dir.'/preinstall'))return false;
 
 // новые структуры таблиц
 $sqls_new = (array)glob($this -> _update_dir.'/preinstall/create.*.ini');
 
 foreach ($sqls_new as $path) {
	 $tab_new = new table_structure($path);
 if (in_array($tab_new-> _properties['name'], $tables -> tables))
 {
 // если такая таблица уже существует в базе, то получаем SQL запрос на изменение этой таблицы
 $tab_old = new table_structure();
 $tab_old -> loadFromBase($tab_new-> _properties['name']);
 
 // только если есть изменения
 if ($sql = $tab_old -> getSQLQueryChange($tab_new))
 $this -> _sqls[] = $sql;
 
 }
 else
 {
 // если таблицы не существует, то получаем SQL запрос на создание
 $this -> _sqls[] = $tab_new -> getSQLQueryCreate();
 }
 	
 }
 
 }
 
 
 
 protected function _checkChmod($dir)
 {
 $dir = filesystem::unixpath($dir);
 $dir_local = str_replace(filesystem::unixpath($this -> _update_dir).'/', '', $dir.'/');
 $od = opendir($dir);
 
 while ($rd = readdir($od)) {
	 if ($rd == '.' || $rd == '..')continue;
	 if (is_dir($dir.'/'.$rd))
	 {
    if (!is_writable(H.'/'.$dir_local.'/'.$rd))
    {
    $this -> error = 'Необходимо установить CHMOD на запись';
    $this -> chmod_err[] = $dir_local.'/'.$rd;
    }
     $this -> _checkChmod($dir.'/'.$rd); 
   }
	 else
	 {
    if (is_file(H.'/'.$dir_local.'/'.$rd) && !is_writable(H.'/'.$dir_local.'/'.$rd))
    {
    $this -> error = 'Необходимо установить CHMOD на запись';
    $this -> chmod_err[] = $dir_local.'/'.$rd;
    }
    elseif(is_dir(H.'/'.$dir_local) && !is_writable(H.'/'.$dir_local))
    {
    $this -> error = 'Необходимо установить CHMOD на запись';
    $this -> chmod_err[] = $dir_local;
    }
 
   }
 }
 closedir($dir);
 }
 
 
 function __destruct()
 {
  if (is_dir($this -> _update_dir))
  filesystem::rmdir($this -> _update_dir);
 }

}
?>
