From fa277f69b14446b47a3dfa63ed7fc1a8a16ef7f8 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 9 Jul 2026 13:09:34 +0100 Subject: Include type in existingEntities cache Fixes the issues of entities having the same value (hash) but occurring in different places. This is most often when the client states the virtual host name as the referrer. --- src/ingestor.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'src/ingestor.cpp') diff --git a/src/ingestor.cpp b/src/ingestor.cpp index 41dd24f..ebff00b 100644 --- a/src/ingestor.cpp +++ b/src/ingestor.cpp @@ -53,9 +53,11 @@ namespace WebStat { operator()(const std::string_view value) const { return { - .hash = makeHash(value), + .key = { + .hash = makeHash(value), + .type = Type, + }, .id = std::nullopt, - .type = Type, .value = value, }; } @@ -331,7 +333,7 @@ namespace WebStat { } constexpr auto ENTITY_IDS = std::views::transform([](auto && value) { - return std::make_pair(value->hash, *value->id); + return std::tie(value->key, *value->id); }); Ingestor::Job::Result @@ -610,7 +612,7 @@ namespace WebStat { { auto lockedEntities = existingEntities.shared(); for (const auto entity : entities) { - if (auto existing = lockedEntities->find(entity->hash); existing != lockedEntities->end()) { + if (auto existing = lockedEntities->find(entity->key); existing != lockedEntities->end()) { entity->id = existing->second; } } @@ -644,7 +646,7 @@ namespace WebStat { }}; assert(!entity.id); - const auto & [typeName, onInsert] = ENTITY_TYPE_VALUES[std::to_underlying(entity.type)]; + const auto & [typeName, onInsert] = ENTITY_TYPE_VALUES[std::to_underlying(entity.key.type)]; bool entityNullDetail = true; std::tie(entity.id, entityNullDetail) = insert(dbconn, SQL::ENTITY_INSERT, SQL::ENTITY_INSERT_OPTS, entity.value, typeName); @@ -671,7 +673,7 @@ namespace WebStat { void Ingestor::onNewUserAgent(const Entity & entity) const { - const auto & [entityHash, entityId, type, value] = entity; + const auto & [_, entityId, value] = entity; auto curlOp = curlGetUserAgentDetail(*entityId, value, settings.userAgentAPI.c_str()); { std::lock_guard curlOperationsLock {curlOperationsMutex}; -- cgit v1.3