<commit_before><?
namespace Core2;

use Zend\Session\Container as SessionContainer;

/**
 * Class Db
 * @property \Zend_Db_Adapter_Abstract $db
 * @property \Zend_Cache_Core          $cache
 * @property \Core2\I18n               $translate
 * @property Log               $log
 */
class Db {

    /**
     * @var \Zend_Config_Ini
     */
	protected $config;
	protected $frontendOptions = array(
		'lifetime'                => 40000,
		'automatic_serialization' => true
	);
	protected $backendOptions = array();
	protected $backend = 'File';
	private $_s        = array();
	private $_settings = array();
	private $_locations = array();
    private $schemaName     = 'public';

	/**
	 * Db constructor.
	 * @param null $config
	 */
	public function __construct($config = null) {
		if (is_null($config)) {
			$this->config = \Zend_Registry::get('config');
		} else {
			$this->config = $config;
		}
		if (!$config) return false;
	}


	/**
	 * @param string $k
	 * @return mixed|\Zend_Cache_Core|\Zend_Db_Adapter_Abstract|Log
	 * @throws \Zend_Exception
	 * @throws \Exception
	 */
	public function __get($k) {
		if ($k == 'db') {
			$reg = \Zend_Registry::getInstance();
			if (!$reg->isRegistered('db')) {
				if (!$this->config) $this->config = $reg->get('config');
				$db = $this->establishConnection($this->config->database);
			} else {
				$db = $reg->get('db');
			}
			return $db;
		}
		// Получение указанного кэша
		if ($k == 'cache') {
			$reg = \Zend_Registry::getInstance();
			if (!$reg->isRegistered($k)) {
				$v = \Zend_Cache::factory('Core',
					$this->backend,
					$this->frontendOptions,
					array('cache_dir' => $this->config->cache));
				$reg->set($k, $v);
			} else {
				$v = $reg->get($k);
			}
			return $v;
		}
		// Получение экземпляра переводчика
		if ($k == 'translate') {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$v = \Zend_Registry::get('translate');
				$this->_s[$k] = $v;
			}
			return $v;
		}
		// Получение экземпляра логера
		elseif ($k == 'log') {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$v = new Log();
				$this->_s[$k] = $v;
			}
			return $v;
		}
		// Получение экземпляра модели текущего модуля
		elseif (strpos($k, 'data') === 0) {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$this->db; ////FIXME грязный хак для того чтобы сработал сеттер базы данных. Потому что иногда его здесь еще нет, а для инициализаци модели используется адаптер базы данных по умолчанию
				$module   = explode("|", $k);
				$model    = substr($module[0], 4);
				$module   = !empty($module[1]) ? $module[1] : 'admin';
				$location = $module == 'admin'
					? DOC_ROOT . "core2/mod/admin"
					: $this->getModuleLocation($module);
                $r = new \ReflectionClass(get_called_class());
                $classLoc = $r->getFileName();
                $classPath = strstr($classLoc, '/mod/');
                if ($classPath && strpos($classPath, dirname(strstr($location, '/mod/'))) !== 0) {
                    //происходит если модель вызывается из метода, который был вызван из другого модуля
                    $classPath = substr($classPath, 5);
                    $module    = substr($classPath, 0, strpos($classPath, "/"));
                    $location  = $this->getModuleLocation($module);
                }
				if (!file_exists($location . "/Model/$model.php")) {
                    throw new \Exception($this->translate->tr('Модель не найдена.'));
                }
				require_once($location . "/Model/$model.php");
				$v            = new $model();
				$this->_s[$k] = $v;
			}
			return $v;
		}

		return null;
	}


    /**
     * Ищет перевод для строки $str
     *
     * @param string $str
     * @return string
     */
    public function _($str) {
        return $this->translate->tr($str);
	}


    /**
     * @param \Zend_Config $database
     * @return \Zend_Db_Adapter_Abstract
     */
    protected function establishConnection(\Zend_Config $database) {
		try {
            $db = $this->getConnection($database);
			\Zend_Db_Table::setDefaultAdapter($db);
			\Zend_Registry::getInstance()->set('db', $db);
			if ($database->adapter === 'Pdo_Mysql') {
			    if ($this->config->system->timezone) $db->query("SET time_zone = '{$this->config->system->timezone}'");
            }
            elseif ($database->adapter === 'Pdo_Pgsql') {
                $db->query("SET search_path TO $this->schemaName");
            }
            return $db;
        } catch (\Zend_Db_Adapter_Exception $e) {
            Error::catchDbException($e);
        } catch (\Zend_Exception $e) {
            Error::catchZendException($e);
        }
	}

    /**
     * получаем соединение с базой данных
     *
     * @param \Zend_Config $database
     * @return \Zend_Db_Adapter_Abstract
     * @throws \Zend_Db_Exception
     */
	protected function getConnection(\Zend_Config $database) {
        if ($database->adapter === 'Pdo_Mysql') {
            $this->schemaName = $database->params->dbname;
        }
        elseif ($database->adapter === 'Pdo_Pgsql') {
            $this->schemaName = $database->schema;
        }
        $db = \Zend_Db::factory($database);
        $db->getConnection();
        return $db;
    }

    /**
     * получаем имя схемы базы данных
     * для Mysql это тожесамое что имя базы данных
     *
     * @return string
     */
    protected function getDbSchema() {
	    return $this->schemaName;
    }


	/**
	 * Установка соединения с произвольной базой MySQL
	 * @param string $dbname
	 * @param string $username<commit_msg>исправлено получение schema для классов, использующих соединение с базой<commit_after><?
namespace Core2;

use Zend\Session\Container as SessionContainer;

/**
 * Class Db
 * @property \Zend_Db_Adapter_Abstract $db
 * @property \Zend_Cache_Core          $cache
 * @property \Core2\I18n               $translate
 * @property Log               $log
 */
class Db {

    /**
     * @var \Zend_Config_Ini
     */
	protected $config;
	protected $frontendOptions = array(
		'lifetime'                => 40000,
		'automatic_serialization' => true
	);
	protected $backendOptions = array();
	protected $backend = 'File';
	private $_s        = array();
	private $_settings = array();
	private $_locations = array();
    private $schemaName     = 'public';

	/**
	 * Db constructor.
	 * @param null $config
	 */
	public function __construct($config = null) {
		if (is_null($config)) {
			$this->config = \Zend_Registry::get('config');
		} else {
			$this->config = $config;
		}
		if (!$config) return false;
	}


	/**
	 * @param string $k
	 * @return mixed|\Zend_Cache_Core|\Zend_Db_Adapter_Abstract|Log
	 * @throws \Zend_Exception
	 * @throws \Exception
	 */
	public function __get($k) {
		if ($k == 'db') {
			$reg = \Zend_Registry::getInstance();
			if (!$reg->isRegistered('db')) {
				if (!$this->config) $this->config = $reg->get('config');
				$db = $this->establishConnection($this->config->database);
			} else {
				$db = $reg->get('db');
                $this->schemaName = $reg->get('dbschema');
			}
			return $db;
		}
		// Получение указанного кэша
		if ($k == 'cache') {
			$reg = \Zend_Registry::getInstance();
			if (!$reg->isRegistered($k)) {
				$v = \Zend_Cache::factory('Core',
					$this->backend,
					$this->frontendOptions,
					array('cache_dir' => $this->config->cache));
				$reg->set($k, $v);
			} else {
				$v = $reg->get($k);
			}
			return $v;
		}
		// Получение экземпляра переводчика
		if ($k == 'translate') {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$v = \Zend_Registry::get('translate');
				$this->_s[$k] = $v;
			}
			return $v;
		}
		// Получение экземпляра логера
		elseif ($k == 'log') {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$v = new Log();
				$this->_s[$k] = $v;
			}
			return $v;
		}
		// Получение экземпляра модели текущего модуля
		elseif (strpos($k, 'data') === 0) {
			if (array_key_exists($k, $this->_s)) {
				$v = $this->_s[$k];
			} else {
				$this->db; ////FIXME грязный хак для того чтобы сработал сеттер базы данных. Потому что иногда его здесь еще нет, а для инициализаци модели используется адаптер базы данных по умолчанию
				$module   = explode("|", $k);
				$model    = substr($module[0], 4);
				$module   = !empty($module[1]) ? $module[1] : 'admin';
				$location = $module == 'admin'
					? DOC_ROOT . "core2/mod/admin"
					: $this->getModuleLocation($module);
                $r = new \ReflectionClass(get_called_class());
                $classLoc = $r->getFileName();
                $classPath = strstr($classLoc, '/mod/');
                if ($classPath && strpos($classPath, dirname(strstr($location, '/mod/'))) !== 0) {
                    //происходит если модель вызывается из метода, который был вызван из другого модуля
                    $classPath = substr($classPath, 5);
                    $module    = substr($classPath, 0, strpos($classPath, "/"));
                    $location  = $this->getModuleLocation($module);
                }
				if (!file_exists($location . "/Model/$model.php")) {
                    throw new \Exception($this->translate->tr('Модель не найдена.'));
                }
				require_once($location . "/Model/$model.php");
                $v            = new $model();
                $this->_s[$k] = $v;
			}
			return $v;
		}

		return null;
	}


    /**
     * Ищет перевод для строки $str
     *
     * @param string $str
     * @return string
     */
    public function _($str) {
        return $this->translate->tr($str);
	}


    /**
     * @param \Zend_Config $database
     * @return \Zend_Db_Adapter_Abstract
     */
    protected function establishConnection(\Zend_Config $database) {
		try {
            $db = $this->getConnection($database);
			\Zend_Db_Table::setDefaultAdapter($db);
			\Zend_Registry::getInstance()->set('db', $db);
			if ($database->adapter === 'Pdo_Mysql') {
			    if ($this->config->system->timezone) $db->query("SET time_zone = '{$this->config->system->timezone}'");
            }
            elseif ($database->adapter === 'Pdo_Pgsql') {
                $db->query("SET search_path TO $this->schemaName");
            }
            return $db;
        } catch (\Zend_Db_Adapter_Exception $e) {
            Error::catchDbException($e);
        } catch (\Zend_Exception $e) {
            Error::catchZendException($e);
        }
	}

    /**
     * получаем соединение с базой данных
     *
     * @param \Zend_Config $database
     * @return \Zend_Db_Adapter_Abstract
     * @throws \Zend_Db_Exception
     */
	protected function getConnection(\Zend_Config $database) {
        if ($database->adapter === 'Pdo_Mysql') {
            $this->schemaName = $database->params->dbname;
        }
        elseif ($database->adapter === 'Pdo_Pgsql') {
            $this->schemaName = $database->schema;
        }
        \Zend_Registry::getInstance()->set('dbschema', $this->schemaName);
        $db = \Zend_Db::factory($database);
        $db->getConnection();
        return $db;
    }

    /**
     * получаем имя схемы базы данных
     * для Mysql это тожесамое что имя базы данных
     *
     * @return string
     */
    protected function getDbSchema() {
	    return $this->schemaName;
    }


	/**
	 * Установка соединения с произвольной базой MySQL
	 * @param string $dbname
	 * @param string $username
{'fraction_non_alphanumeric': 0.16729339746392655, 'fraction_numerical': 0.0031482291211193704, 'mean_word_length': 2.372456502506635, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 125, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5172405', 'n_tokens_mistral': 4250, 'n_tokens_neox': 3933, 'n_words': 797}