diff --git a/lib/base/array.cpp b/lib/base/array.cpp index d037bce75..a09610855 100644 --- a/lib/base/array.cpp +++ b/lib/base/array.cpp @@ -181,6 +181,14 @@ void Array::Clear(void) m_Data.clear(); } +void Array::Reserve(size_t new_size) +{ + ASSERT(!OwnsLock()); + ObjectLock olock(this); + + m_Data.reserve(new_size); +} + void Array::CopyTo(const Array::Ptr& dest) const { ASSERT(!OwnsLock()); diff --git a/lib/base/array.hpp b/lib/base/array.hpp index 2b0e6a64e..34db58477 100644 --- a/lib/base/array.hpp +++ b/lib/base/array.hpp @@ -62,6 +62,8 @@ public: void Resize(size_t new_size); void Clear(void); + void Reserve(size_t new_size); + void CopyTo(const Array::Ptr& dest) const; Array::Ptr ShallowClone(void) const; diff --git a/lib/livestatus/livestatusquery.cpp b/lib/livestatus/livestatusquery.cpp index de9127800..70c707f3b 100644 --- a/lib/livestatus/livestatusquery.cpp +++ b/lib/livestatus/livestatusquery.cpp @@ -508,16 +508,26 @@ void LivestatusQuery::ExecuteGetHelper(const Stream::Ptr& stream) if (m_Aggregators.empty()) { Array::Ptr header = new Array(); + typedef std::pair ColumnPair; + + std::vector column_objs; + column_objs.reserve(columns.size()); + + BOOST_FOREACH(const String& columnName, columns) + column_objs.push_back(std::make_pair(columnName, table->GetColumn(columnName))); + + rs->Reserve(1 + objects.size()); + BOOST_FOREACH(const LivestatusRowValue& object, objects) { Array::Ptr row = new Array(); - BOOST_FOREACH(const String& columnName, columns) { - Column column = table->GetColumn(columnName); + row->Reserve(column_objs.size()); + BOOST_FOREACH(const ColumnPair& cv, column_objs) { if (m_ColumnHeaders) - header->Add(columnName); + header->Add(cv.first); - row->Add(column.ExtractValue(object.Row, object.GroupByType, object.GroupByObject)); + row->Add(cv.second.ExtractValue(object.Row, object.GroupByType, object.GroupByObject)); } if (m_ColumnHeaders) { @@ -558,6 +568,8 @@ void LivestatusQuery::ExecuteGetHelper(const Stream::Ptr& stream) Array::Ptr row = new Array(); + row->Reserve(m_Columns.size() + m_Aggregators.size()); + /* * add selected columns next to stats * may not be accurate for grouping!