From 0be00b791ffa9e6d073a6626108fa763ac9d62bb Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Sat, 11 Dec 2021 16:34:16 +0400 Subject: [PATCH] Searcher::add_reader() rejects duplicate readers A O(N) linear search was added to `Searcher::add_reader()` deliberately. This doesn't seem to be an operation that may lead to performance problems. --- src/searcher.cpp | 6 ++++++ test/searcher.cpp | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/searcher.cpp b/src/searcher.cpp index 8fa77c391..51f16a7b3 100644 --- a/src/searcher.cpp +++ b/src/searcher.cpp @@ -94,6 +94,12 @@ bool Searcher::add_reader(Reader* reader) if (!reader->hasFulltextIndex()) { return false; } + + for ( const Reader* const existing_reader : readers ) { + if ( existing_reader->getZimFilePath() == reader->getZimFilePath() ) + return false; + } + this->readers.push_back(reader); return true; } diff --git a/test/searcher.cpp b/test/searcher.cpp index a3569d959..735f4c373 100644 --- a/test/searcher.cpp +++ b/test/searcher.cpp @@ -5,6 +5,20 @@ namespace kiwix { +TEST(Searcher, add_reader) { + Reader reader1("./test/example.zim"); + Reader reader2("./test/example.zim"); + Reader reader3("./test/../test/example.zim"); + + Searcher searcher; + ASSERT_TRUE (searcher.add_reader(&reader1)); + ASSERT_FALSE(searcher.add_reader(&reader1)); + ASSERT_FALSE(searcher.add_reader(&reader2)); + + // equivalence of resolved paths is not checked by Searcher::add_reader + ASSERT_TRUE(searcher.add_reader(&reader3)); +} + TEST(Searcher, search) { Reader reader("./test/example.zim"); @@ -64,4 +78,4 @@ TEST(Searcher, incrementalRange) { ASSERT_EQ(suggCount, 50); } -} \ No newline at end of file +}