Дать возможность получать текст SQL-запроса до его непосредственного выполнения

Рейтинг: 1.8589  
Новая
Предложил Пользователь 17890 17.10.2014 13:24:53

Дать возможность получать текст SQL-запроса до его непосредственного выполнения

Возможная реализация: к примеру, можно добавить событие OnBeforeSqlQueryRun в CDatabase::Query(), в обработчике которого дать возможность получать SQL-запрос до выполнения запроса в mysql_query, а возможно дать и останавливать его выполнение.

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

Видимо, еще одну версию события нужно будет встроить в lib d7.

Кейс использования: CIblockElement::GetList() при динамическом и сложном фильтре $arFilter "ложит" mySql, хотелось бы для выяснения подробностей и отладки получить и проанализировать текст запроса, до того момента, как он уйдет на исполнение.

Рейтинг: 0  
Пользователь 3089 08.02.2015 21:35:21
Это сейчас делается без дополнительных событий:
$app = \Bitrix\Main\Application::getInstance();
$DB->sqlTracker = $app->getConnection()->startTracker();
$DB->sqlTracker->startFileLog(путь к файлу);

$DB->DebugToFile = true;
$dbRes = CIBlockElement::GetList(...);
$DB->DebugToFile = false;

В общем, все как и раньше, только нужно предварительно создать свой трекер и указать куда писать.
Если в dbconn.php указать $DBDebugToFile в true, то трекер будет создан со стандартным путем к файлу (тот, что использовался ранее, до перехода на новый лог d7) и писать будет все подряд. В моем примере только те запросы (тоже, кстати, не один), которые относятся к этому вызову API.