diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 8f794069f..fb45410f4 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -697,7 +697,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S actionUrls.emplace_back(JsonEncode(data)); if (runtimeUpdate) { - AddObjectDataToRuntimeUpdates(runtimeUpdates, actionUrls.at(actionUrls.size() - 2u), m_PrefixConfigObject + "action:url", data); + AddObjectDataToRuntimeUpdates(runtimeUpdates, static_cast(actionUrls.at(actionUrls.size() - 2u)), m_PrefixConfigObject + "action:url", data); } } } @@ -712,7 +712,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S notesUrls.emplace_back(JsonEncode(data)); if (runtimeUpdate) { - AddObjectDataToRuntimeUpdates(runtimeUpdates, notesUrls.at(notesUrls.size() - 2u), m_PrefixConfigObject + "notes:url", data); + AddObjectDataToRuntimeUpdates(runtimeUpdates, static_cast(notesUrls.at(notesUrls.size() - 2u)), m_PrefixConfigObject + "notes:url", data); } } } @@ -727,7 +727,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S iconImages.emplace_back(JsonEncode(data)); if (runtimeUpdate) { - AddObjectDataToRuntimeUpdates(runtimeUpdates, iconImages.at(iconImages.size() - 2u), m_PrefixConfigObject + "icon:image", data); + AddObjectDataToRuntimeUpdates(runtimeUpdates, static_cast(iconImages.at(iconImages.size() - 2u)), m_PrefixConfigObject + "icon:image", data); } } } diff --git a/lib/icingadb/redisconnection.cpp b/lib/icingadb/redisconnection.cpp index aa437aa75..10f05ddb1 100644 --- a/lib/icingadb/redisconnection.cpp +++ b/lib/icingadb/redisconnection.cpp @@ -94,14 +94,14 @@ void LogQuery(RedisConnection::Query& query, Log& msg) { int i = 0; - for (auto& arg : query) { + for (std::string_view arg : query) { if (++i == 8) { msg << " ..."; break; } - if (arg.GetLength() > 64) { - msg << " '" << arg.SubStr(0, 61) << "...'"; + if (arg.length() > 64) { + msg << " '" << arg.substr(0, 61) << "...'"; } else { msg << " '" << arg << '\''; } diff --git a/lib/icingadb/redisconnection.hpp b/lib/icingadb/redisconnection.hpp index bd6bef415..d8d3241fd 100644 --- a/lib/icingadb/redisconnection.hpp +++ b/lib/icingadb/redisconnection.hpp @@ -39,7 +39,9 @@ #include #include #include +#include #include +#include #include namespace icinga @@ -54,7 +56,54 @@ namespace icinga public: DECLARE_PTR_TYPEDEFS(RedisConnection); - typedef String QueryArg; + /** + * A Redis query argument. Either owned String or hardcoded const char[]. + * Allows mixing these types in a single query transparently, not requiring any conversions. + * + * @ingroup icingadb + */ + class QueryArg + { + public: + QueryArg(const char data[]) noexcept : m_Data(std::in_place_type, data) + { + } + + QueryArg(String data) noexcept : m_Data(std::move(data)) + { + } + + bool operator<(const QueryArg& rhs) const noexcept // For std::map keys + { + return static_cast(*this) < static_cast(rhs); + } + + operator std::string_view() const noexcept + { + return std::visit([](auto& data) { return ViewOf(data); }, m_Data); + } + + explicit operator String() const + { + std::string_view sv (*this); + + return String(sv.begin(), sv.end()); + } + + private: + std::variant m_Data; + + static std::string_view ViewOf(const std::string_view& data) noexcept + { + return data; + } + + static std::string_view ViewOf(const String& data) noexcept + { + return {data.CStr(), data.GetLength()}; + } + }; + typedef std::vector Query; typedef std::vector Queries; typedef Value Reply; @@ -665,8 +714,8 @@ void RedisConnection::WriteRESP(AsyncWriteStream& stream, const Query& query, bo msg << "*" << query.size() << "\r\n"; - for (auto& arg : query) { - msg << "$" << arg.GetLength() << "\r\n" << arg << "\r\n"; + for (std::string_view arg : query) { + msg << "$" << arg.length() << "\r\n" << arg << "\r\n"; } asio::async_write(stream, writeBuffer, yc);