%PDF- %PDF-
Server IP : 37.220.80.31 / Your IP : 3.147.64.68 Web Server : Apache/2.4.52 (Ubuntu) System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64 User : www-root ( 1010) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/modules/main/lib/db/ |
Upload File : |
<?php namespace Bitrix\Main\DB; use Bitrix\Main\ArgumentException; use Bitrix\Main\ORM\Fields\ScalarField; abstract class MysqlCommonConnection extends Connection { const INDEX_UNIQUE = 'UNIQUE'; const INDEX_FULLTEXT = 'FULLTEXT'; const INDEX_SPATIAL = 'SPATIAL'; protected $engine = ""; /** * @inheritDoc */ public function __construct(array $configuration) { parent::__construct($configuration); $this->engine = isset($configuration['engine']) ? $configuration['engine'] : ""; } /** * @inheritDoc */ public function isTableExists($tableName) { $tableName = preg_replace("/[^a-z0-9%_]+/i", "", $tableName); $tableName = trim($tableName); if ($tableName == '') { return false; } $result = $this->query("SHOW TABLES LIKE '".$this->getSqlHelper()->forSql($tableName)."'"); return (bool) $result->fetch(); } /** * @inheritDoc */ public function isIndexExists($tableName, array $columns) { return $this->getIndexName($tableName, $columns) !== null; } /** * @inheritDoc */ public function getIndexName($tableName, array $columns, $strict = false) { if (empty($columns)) { return null; } $tableName = preg_replace("/[^a-z0-9_]+/i", "", $tableName); $tableName = trim($tableName); $rs = $this->query("SHOW INDEX FROM `".$this->getSqlHelper()->forSql($tableName)."`"); if (!$rs) { return null; } $indexes = array(); while ($ar = $rs->fetch()) { $indexes[$ar["Key_name"]][$ar["Seq_in_index"] - 1] = $ar["Column_name"]; } return static::findIndex($indexes, $columns, $strict); } /** * @inheritDoc */ public function getTableFields($tableName) { if (!isset($this->tableColumnsCache[$tableName])) { $this->connectInternal(); $sqlTableName = ($tableName[0] === '(') ? $sqlTableName = $tableName.' AS xyz' // subquery : $sqlTableName = $this->getSqlHelper()->quote($tableName); // regular table name $query = $this->queryInternal("SELECT * FROM {$sqlTableName} LIMIT 0"); $result = $this->createResult($query); $this->tableColumnsCache[$tableName] = $result->getFields(); } return $this->tableColumnsCache[$tableName]; } /** * @inheritDoc */ public function createTable($tableName, $fields, $primary = array(), $autoincrement = array()) { $sql = 'CREATE TABLE '.$this->getSqlHelper()->quote($tableName).' ('; $sqlFields = array(); foreach ($fields as $columnName => $field) { if (!($field instanceof ScalarField)) { throw new ArgumentException(sprintf( 'Field `%s` should be an Entity\ScalarField instance', $columnName )); } $realColumnName = $field->getColumnName(); $sqlFields[] = $this->getSqlHelper()->quote($realColumnName) . ' ' . $this->getSqlHelper()->getColumnTypeByField($field) . ($field->isNullable() ? '' : ' NOT NULL') // null for oracle if is not primary . (in_array($columnName, $autoincrement, true) ? ' AUTO_INCREMENT' : '') ; } $sql .= join(', ', $sqlFields); if (!empty($primary)) { foreach ($primary as &$primaryColumn) { $realColumnName = $fields[$primaryColumn]->getColumnName(); $primaryColumn = $this->getSqlHelper()->quote($realColumnName); } $sql .= ', PRIMARY KEY('.join(', ', $primary).')'; } $sql .= ')'; if ($this->engine) { $sql .= ' Engine='.$this->engine; } $this->query($sql); } /** * @inheritDoc */ public function createIndex($tableName, $indexName, $columnNames, $columnLengths = null, $indexType = null) { if (!is_array($columnNames)) { $columnNames = array($columnNames); } $sqlHelper = $this->getSqlHelper(); foreach ($columnNames as &$columnName) { if (is_array($columnLengths) && isset($columnLengths[$columnName]) && $columnLengths[$columnName] > 0) { $maxLength = intval($columnLengths[$columnName]); } else { $maxLength = 0; } $columnName = $sqlHelper->quote($columnName); if ($maxLength > 0) { $columnName .= '('.$maxLength.')'; } } unset($columnName); $indexTypeSql = ''; if ($indexType !== null && in_array(mb_strtoupper($indexType), [static::INDEX_UNIQUE, static::INDEX_FULLTEXT, static::INDEX_SPATIAL], true) ) { $indexTypeSql = mb_strtoupper($indexType); } $sql = 'CREATE '.$indexTypeSql.' INDEX '.$sqlHelper->quote($indexName).' ON '.$sqlHelper->quote($tableName) .' ('.join(', ', $columnNames).')'; return $this->query($sql); } /** * @inheritDoc */ public function renameTable($currentName, $newName) { $this->query('RENAME TABLE '.$this->getSqlHelper()->quote($currentName).' TO '.$this->getSqlHelper()->quote($newName)); } /** * @inheritDoc */ public function dropTable($tableName) { $this->query('DROP TABLE '.$this->getSqlHelper()->quote($tableName)); } /********************************************************* * Transaction *********************************************************/ /** * @inheritDoc */ public function startTransaction() { $this->query("START TRANSACTION"); } /** * @inheritDoc */ public function commitTransaction() { $this->query("COMMIT"); } /** * @inheritDoc */ public function rollbackTransaction() { $this->query("ROLLBACK"); } /********************************************************* * Global named lock *********************************************************/ /** * @inheritDoc */ public function lock($name, $timeout = 0) { $timeout = (int)$timeout; $name = $this->getLockName($name); $lock = $this->query("SELECT GET_LOCK('{$name}', {$timeout}) as L")->fetch(); return ($lock["L"] == "1"); } /** * @inheritDoc */ public function unlock($name) { $name = $this->getLockName($name); $lock = $this->query("SELECT RELEASE_LOCK('{$name}') as L")->fetch(); return ($lock["L"] == "1"); } protected function getLockName($name) { $unique = \CMain::GetServerUniqID(); //64 characters max for mysql 5.7+ return $unique.md5($name); } /********************************************************* * Type, version, cache, etc. *********************************************************/ /** * @inheritDoc */ public function getType() { return "mysql"; } /** * Sets default storage engine for all consequent CREATE TABLE statements and all other relevant DDL. * Storage engine read from .settings.php file. It is 'engine' key of the 'default' from the 'connections'. * * @return void */ public function setStorageEngine() { if ($this->engine) { $this->query("SET storage_engine = '".$this->engine."'"); } } /** * Selects the default database for database queries. * * @param string $database Database name. * @return bool */ abstract public function selectDatabase($database); /** * Returns max packet length to send to or receive from the database server. * * @return int */ public function getMaxAllowedPacket() { static $mtu; if (is_null($mtu)) { $mtu = 0; $res = $this->query("SHOW VARIABLES LIKE 'max_allowed_packet'")->fetch(); if ($res['Variable_name'] == 'max_allowed_packet') { $mtu = intval($res['Value']); } } return $mtu; } }