Поддержка серверов

SessionTable::lock: метод Битрикс

Постоянная ссылка: http://bxapi.ru/src/?id=362319

//    Bitrix\Security\SessionTable::lock()
//    /bitrix/modules/security/lib/session.php:103

    public static function lock($id, $timeout = 60)
    {
        $result = true;

        $pool = \Bitrix\Main\Application::getInstance()->getConnectionPool();
        $pool->useMasterOnly(true);

        $connection = static::getEntity()->getConnection();
        if ($connection instanceof \Bitrix\Main\DB\MysqlCommonConnection)
        {
            $lock = $connection->queryScalar(
                sprintf('SELECT GET_LOCK("%s", %d)', md5($id), (int) $timeout)
            );
            $result = $lock != '0';
        }
        elseif ($connection instanceof \Bitrix\Main\DB\MssqlConnection)
        {
            $id = $connection->getSqlHelper()->forSql($id);
            $timeout = (int) $timeout;
            $connection->startTransaction();
            try
            {
                $connection->queryExecute(sprintf('SET LOCK_TIMEOUT %d', $timeout * 1000));
                $queryResult = static::update($id, array(
                    'TIMESTAMP_X' => new Type\DateTime
                ));
                if ($queryResult->isSuccess())
                {
                    if ($queryResult->getAffectedRowsCount())
                    {
                        $result = true;
                    }
                    else
                    {
                        $queryResult = static::add(array(
                            'SESSION_ID' => $id
                        ));
                        $result = $queryResult->isSuccess();
                    }
                }
                else
                {
                    $result = false;
                }
            }
            catch (\Bitrix\Main\DB\SqlQueryException $e)
            {
                $result = false;
            }
        }
        elseif ($connection instanceof \Bitrix\Main\DB\OracleConnection)
        {
            $id = $connection->getSqlHelper()->forSql($id);
            $timeout = (int) $timeout;
            $connection->startTransaction();
            $result = null;
            while ($result === null)
            {
                try
                {
                    $lock = $connection->query("
                        select *
                        from b_sec_session
                            where SESSION_ID = '${id}'
                        for update wait ${timeout}
                    ");

                    if ($lock->fetch())
                    {
                        $result = true;
                    }
                    else
                    {
                        static::add(array(
                            'SESSION_ID' => $id
                        ));
                    }
                }
                catch (\Bitrix\Main\DB\SqlQueryException $e)
                {
                    $result = false;
                }
            }
        }
        else
        {
            trigger_error(sprintf('SessionTable::lock not supported for connection of type "%s"', get_class($connection)), E_USER_WARNING);
        }

        $pool->useMasterOnly(false);

        return $result;
    }
';

Блог разработчика

9 августа 2016 ResizeImageGet и простой водяной знак налету

Сегодня поговорим о том как проще всего воткнуть водяной знак на картинки в Битрикс. Например, на все изображения каталога.

21 июля 2016 Добавление вкладки в CRM коробки Битрикс24

В этом посте я покажу, как легко и просто добавить вкладку в сущность CRM. И не просто добавить, а вывести там свой контент.

21 июля 2016 Как просто обращаться из коробки Битрикс24 на сайт на базе Битрикс

К примеру вам хочется внутренним скриптом дернуть с сайта-магазина информацию, которая там, в свою очередь, закрыта некоторыми правами. Например, админскими. Можно конечно мутить свой REST, или иной формат общения, но проще всего воспользоваться штатным инструментом:

Текст сообщения*
Загрузить изображение