/******************************************************************************
* Icinga 2 *
- * Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/) *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/) *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
LivestatusQuery::LivestatusQuery(const std::vector<String>& lines, const String& compat_log_path)
: m_KeepAlive(false), m_OutputFormat("csv"), m_ColumnHeaders(true), m_Limit(-1), m_ErrorCode(0),
- m_LogTimeFrom(0), m_LogTimeUntil(static_cast<long>(Utility::GetTime()))
+ m_LogTimeFrom(0), m_LogTimeUntil(static_cast<long>(Utility::GetTime()))
{
if (lines.size() == 0) {
m_Verb = "ERROR";
m_CompatLogPath = compat_log_path;
/* default separators */
- m_Separators.push_back("\n");
- m_Separators.push_back(";");
- m_Separators.push_back(",");
- m_Separators.push_back("|");
+ m_Separators.emplace_back("\n");
+ m_Separators.emplace_back(";");
+ m_Separators.emplace_back(",");
+ m_Separators.emplace_back("|");
String line = lines[0];
if (header == "Or" || header == "StatsOr") {
filter = new OrFilter();
Log(LogDebug, "LivestatusQuery")
- << "Add OR filter for " << params << " column(s). " << deq.size() << " filters available.";
+ << "Add OR filter for " << params << " column(s). " << deq.size() << " filters available.";
} else {
filter = new AndFilter();
Log(LogDebug, "LivestatusQuery")
- << "Add AND filter for " << params << " column(s). " << deq.size() << " filters available.";
+ << "Add AND filter for " << params << " column(s). " << deq.size() << " filters available.";
}
if (num > deq.size()) {
while (num > 0 && num--) {
filter->AddSubFilter(deq.back());
Log(LogDebug, "LivestatusQuery")
- << "Add " << num << " filter.";
+ << "Add " << num << " filter.";
deq.pop_back();
if (&deq == &stats)
aggregators.pop_back();
}
- deq.push_back(filter);
+ deq.emplace_back(filter);
if (&deq == &stats) {
Aggregator::Ptr aggregator = new CountAggregator();
aggregator->SetFilter(filter);
m_Aggregators.swap(aggregators);
}
-int LivestatusQuery::GetExternalCommands(void)
+int LivestatusQuery::GetExternalCommands()
{
boost::mutex::scoped_lock lock(l_QueryMutex);
break;
}
- tokens.push_back(temp_buffer.SubStr(0, sp_index));
+ tokens.emplace_back(temp_buffer.SubStr(0, sp_index));
temp_buffer = temp_buffer.SubStr(sp_index + 1);
}
/* add the rest as value */
- tokens.push_back(temp_buffer);
+ tokens.emplace_back(std::move(temp_buffer));
if (tokens.size() == 2)
- tokens.push_back("");
+ tokens.emplace_back("");
if (tokens.size() < 3)
- return Filter::Ptr();
+ return nullptr;
bool negate = false;
String attr = tokens[0];
}
Log(LogDebug, "LivestatusQuery")
- << "Parsed filter with attr: '" << attr << "' op: '" << op << "' val: '" << val << "'.";
+ << "Parsed filter with attr: '" << attr << "' op: '" << op << "' val: '" << val << "'.";
return filter;
}
void LivestatusQuery::ExecuteGetHelper(const Stream::Ptr& stream)
{
Log(LogNotice, "LivestatusQuery")
- << "Table: " << m_Table;
+ << "Table: " << m_Table;
Table::Ptr table = Table::GetByName(m_Table, m_CompatLogPath, m_LogTimeFrom, m_LogTimeUntil);
column_objs.reserve(columns.size());
for (const String& columnName : columns)
- column_objs.push_back(std::make_pair(columnName, table->GetColumn(columnName)));
+ column_objs.emplace_back(columnName, table->GetColumn(columnName));
for (const LivestatusRowValue& object : objects) {
Array::Ptr row = new Array();
for (const String& columnName : m_Columns) {
Column column = table->GetColumn(columnName);
- statsKey.push_back(column.ExtractValue(object.Row, object.GroupByType, object.GroupByObject));
+ statsKey.emplace_back(column.ExtractValue(object.Row, object.GroupByType, object.GroupByObject));
}
auto it = allStats.find(statsKey);
if (it == allStats.end()) {
- std::vector<AggregatorState *> newStats(m_Aggregators.size(), NULL);
+ std::vector<AggregatorState *> newStats(m_Aggregators.size(), nullptr);
it = allStats.insert(std::make_pair(statsKey, newStats)).first;
}
int index = 0;
- for (const Aggregator::Ptr aggregator : m_Aggregators) {
+ for (const Aggregator::Ptr& aggregator : m_Aggregators) {
aggregator->Apply(table, object.Row, &stats[index]);
index++;
}
AppendResultRow(result, row, first_row);
}
+
+ /* add a bogus zero value if aggregated is empty*/
+ if (allStats.empty()) {
+ Array::Ptr row = new Array();
+
+ for (size_t i = 1; i <= m_Aggregators.size(); i++) {
+ row->Add(0);
+ }
+
+ AppendResultRow(result, row, first_row);
+ }
}
EndResultSet(result);
}
Log(LogNotice, "LivestatusQuery")
- << "Executing command: " << m_Command;
+ << "Executing command: " << m_Command;
ExternalCommandProcessor::Execute(m_Command);
SendResponse(stream, LivestatusErrorOK, "");
}
void LivestatusQuery::ExecuteErrorHelper(const Stream::Ptr& stream)
{
Log(LogDebug, "LivestatusQuery")
- << "ERROR: Code: '" << m_ErrorCode << "' Message: '" << m_ErrorMessage << "'.";
+ << "ERROR: Code: '" << m_ErrorCode << "' Message: '" << m_ErrorMessage << "'.";
SendResponse(stream, m_ErrorCode, m_ErrorMessage);
}
{
try {
Log(LogNotice, "LivestatusQuery")
- << "Executing livestatus query: " << m_Verb;
+ << "Executing livestatus query: " << m_Verb;
if (m_Verb == "GET")
ExecuteGetHelper(stream);