Skip to content

Commit 3230ad2

Browse files
committed
Save search results of long running queries every 30 seconds
If a search query runs for a long time, and the server dies/restarts before the query completes, all results will be lost. To protect against this, we save results every 30 seconds, so long as there are new results.
1 parent 7499536 commit 3230ad2

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/webui/searchjobmanager.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <QJsonObject>
3838
#include <QString>
3939
#include <QStringList>
40+
#include <QTimer>
4041

4142
#include "base/global.h"
4243
#include "base/logger.h"
@@ -75,15 +76,29 @@ int SearchJobManager::startSearch(const QString &pattern, const QString &categor
7576

7677
connect(searchHandler.get(), &SearchHandler::searchFinished, this, [this, id]
7778
{
79+
if (QTimer *timer = m_resultSaveTimers.take(id))
80+
{
81+
timer->stop();
82+
timer->deleteLater();
83+
}
7884
m_activeSearches.remove(id);
7985
saveSession();
8086
saveSearchResults(id);
8187
});
8288
connect(searchHandler.get(), &SearchHandler::searchFailed, this, [this, id]([[maybe_unused]] const QString &errorMessage)
8389
{
90+
if (QTimer *timer = m_resultSaveTimers.take(id))
91+
{
92+
timer->stop();
93+
timer->deleteLater();
94+
}
8495
m_activeSearches.remove(id);
8596
saveSession();
8697
});
98+
connect(searchHandler.get(), &SearchHandler::newSearchResults, this, [this, id]
99+
{
100+
scheduleSaveResults(id);
101+
});
87102

88103
m_searchHandlers.insert(id, searchHandler);
89104
m_activeSearches.insert(id);
@@ -131,6 +146,12 @@ bool SearchJobManager::deleteSearch(const int id)
131146
if (!found)
132147
return false;
133148

149+
if (QTimer *timer = m_resultSaveTimers.take(id))
150+
{
151+
timer->stop();
152+
timer->deleteLater();
153+
}
154+
134155
m_searchOrder.removeOne(id);
135156
removeSearchResults(id);
136157
saveSession();
@@ -325,6 +346,27 @@ void SearchJobManager::saveSession() const
325346
}
326347
}
327348

349+
void SearchJobManager::scheduleSaveResults(const int searchId)
350+
{
351+
if (!m_storeOpenedTabsResults)
352+
return;
353+
354+
if (m_resultSaveTimers.contains(searchId))
355+
return; // Timer already running, don't restart
356+
357+
auto *timer = new QTimer(this);
358+
timer->setSingleShot(true);
359+
timer->setInterval(30000); // 30 seconds
360+
connect(timer, &QTimer::timeout, this, [this, searchId, timer]
361+
{
362+
m_resultSaveTimers.remove(searchId);
363+
timer->deleteLater();
364+
saveSearchResults(searchId);
365+
});
366+
m_resultSaveTimers.insert(searchId, timer);
367+
timer->start();
368+
}
369+
328370
void SearchJobManager::saveSearchResults(const int searchId) const
329371
{
330372
const auto *pref = Preferences::instance();

src/webui/searchjobmanager.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
#include <QObject>
3535
#include <QSet>
3636

37+
class QTimer;
38+
3739
#include "base/path.h"
3840
#include "base/search/searchhandler.h"
3941

@@ -76,6 +78,7 @@ private slots:
7678
void loadSession();
7779
void saveSession() const;
7880
void saveSearchResults(int searchId) const;
81+
void scheduleSaveResults(int searchId);
7982
void removeSearchResults(int searchId) const;
8083
void removeAllResultFiles() const;
8184
void removeAllData() const;
@@ -88,4 +91,5 @@ private slots:
8891
QSet<int> m_activeSearches;
8992
QHash<int, RestoredSearch> m_restoredSearches;
9093
QList<int> m_searchOrder; // Tracks insertion order (oldest first)
94+
QHash<int, QTimer*> m_resultSaveTimers;
9195
};

0 commit comments

Comments
 (0)