Здесь мое (простое решение):
std::string Format(const char* lpszFormat, ...)
{
// Warning : "vsnprintf" crashes with an access violation
// exception if lpszFormat is not a "const char*" (for example, const string&)
size_t nSize = 1024;
char *lpBuffer = (char*)malloc(nSize);
va_list lpParams;
while (true)
{
va_start(lpParams, lpszFormat);
int nResult = vsnprintf(
lpBuffer,
nSize,
lpszFormat,
lpParams
);
va_end(lpParams);
if ((nResult >= 0) && (nResult < (int)nSize) )
{
// Success
lpBuffer[nResult] = '\0';
std::string sResult(lpBuffer);
free (lpBuffer);
return sResult;
}
else
{
// Increase buffer
nSize =
(nResult < 0)
? nSize *= 2
: (nResult + 1)
;
lpBuffer = (char *)realloc(lpBuffer, nSize);
}
}
}
Насколько мне известно, нет простого способа получить доступ к списку запросов. Тем не менее, вы можете легко получить к ним доступ, создав очень простой регистратор.
Если вы откроете класс ActiveRecord :: ConnectionAdapters :: AbstractAdapter
, вы увидите метод под названием log. Этот метод вызывается при каждом запросе для регистрации оператора. По умолчанию он регистрирует все операторы с помощью регистратора Rails.
Вы можете сделать что-то вроде
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
attr_reader :last_query
alias_method_chain :log, :last_query
def log_with_last_query(sql, name, &block)
@last_query = [sql, name]
log_without_last_query(sql, name, &block)
end
end
Теперь вы можете получить запрос с помощью
ActiveRecord::Base.connection.last_query # => ...
Ваш журнал разработки должен включать все выполняемые SQL-запросы.