std::map<std::string, int> computeQueryDataLengths(const QueryData& q) { std::map<std::string, int> results; if (q.size() == 0) { return results; } for (const auto& it : q.front()) { results[it.first] = it.first.size(); } for (const auto& row : q) { for (const auto& it : row) { try { if (it.second.size() > results[it.first]) { results[it.first] = it.second.size(); } } catch (const std::out_of_range& e) { LOG(ERROR) << "Error retreiving the \"" << it.first << "\" key in computeQueryDataLength: " << e.what(); } } } return results; }
void prettyPrint(const QueryData& results, const std::vector<std::string>& columns, std::map<std::string, size_t>& lengths) { if (results.size() == 0) { return; } // Call a final compute using the column names as minimum lengths. computeRowLengths(results.front(), lengths, true); // Output a nice header wrapping the column names. auto separator = generateToken(lengths, columns); auto header = separator + generateHeader(lengths, columns) + separator; printf("%s", header.c_str()); // Iterate each row and pretty print. for (const auto& row : results) { printf("%s", generateRow(row, lengths, columns).c_str()); } printf("%s", separator.c_str()); }