Browse Source

Fix caching issues in last commit

adaptive-webui-19844
Christophe Dumez 13 years ago
parent
commit
122655758d
  1. 26
      src/webui/btjson.cpp
  2. 5
      src/webui/jsondict.cpp
  3. 1
      src/webui/jsondict.h
  4. 5
      src/webui/jsonlist.cpp
  5. 1
      src/webui/jsonlist.h

26
src/webui/btjson.cpp

@ -49,6 +49,16 @@ using namespace libtorrent;
cacheTimer.start(); \ cacheTimer.start(); \
VAR.clear() VAR.clear()
#define CACHED_VARIABLE_FOR_HASH(VARTYPE, VAR, DUR, HASH) \
static VARTYPE VAR; \
static QString prev_hash; \
static QElapsedTimer cacheTimer; \
if (prev_hash == HASH && !cacheTimer.hasExpired(DUR)) \
return VAR.toString(); \
prev_hash = HASH; \
cacheTimer.start(); \
VAR.clear()
// Numerical constants // Numerical constants
static const int CACHE_DURATION_MS = 1500; // 1500ms static const int CACHE_DURATION_MS = 1500; // 1500ms
@ -196,7 +206,7 @@ QString btjson::getTorrents()
*/ */
QString btjson::getTrackersForTorrent(const QString& hash) QString btjson::getTrackersForTorrent(const QString& hash)
{ {
CACHED_VARIABLE(JsonList, tracker_list, CACHE_DURATION_MS); CACHED_VARIABLE_FOR_HASH(JsonList, tracker_list, CACHE_DURATION_MS, hash);
try { try {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(hash); QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(hash);
@ -223,8 +233,8 @@ QString btjson::getTrackersForTorrent(const QString& hash)
tracker_list.append(tracker_dict); tracker_list.append(tracker_dict);
} }
} catch(const std::exception&) { } catch(const std::exception& e) {
qWarning() << "getTrackersForTorrent() called with invalid torrent"; qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what();
return QString(); return QString();
} }
@ -251,7 +261,7 @@ QString btjson::getTrackersForTorrent(const QString& hash)
*/ */
QString btjson::getPropertiesForTorrent(const QString& hash) QString btjson::getPropertiesForTorrent(const QString& hash)
{ {
CACHED_VARIABLE(JsonDict, data, CACHE_DURATION_MS); CACHED_VARIABLE_FOR_HASH(JsonDict, data, CACHE_DURATION_MS, hash);
try { try {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
@ -284,7 +294,8 @@ QString btjson::getPropertiesForTorrent(const QString& hash)
data.add(KEY_PROP_CONNECT_COUNT, QString(QString::number(h.num_connections()) + " (" + tr("%1 max", "e.g. 10 max").arg(QString::number(h.connections_limit())) + ")")); data.add(KEY_PROP_CONNECT_COUNT, QString(QString::number(h.num_connections()) + " (" + tr("%1 max", "e.g. 10 max").arg(QString::number(h.connections_limit())) + ")"));
const qreal ratio = QBtSession::instance()->getRealRatio(h.hash()); const qreal ratio = QBtSession::instance()->getRealRatio(h.hash());
data.add(KEY_PROP_RATIO, ratio > 100. ? QString::fromUtf8("") : QString::number(ratio, 'f', 1)); data.add(KEY_PROP_RATIO, ratio > 100. ? QString::fromUtf8("") : QString::number(ratio, 'f', 1));
} catch(const std::exception&) { } catch(const std::exception& e) {
qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what();
return QString(); return QString();
} }
@ -304,7 +315,7 @@ QString btjson::getPropertiesForTorrent(const QString& hash)
*/ */
QString btjson::getFilesForTorrent(const QString& hash) QString btjson::getFilesForTorrent(const QString& hash)
{ {
CACHED_VARIABLE(JsonList, file_list, CACHE_DURATION_MS); CACHED_VARIABLE_FOR_HASH(JsonList, file_list, CACHE_DURATION_MS, hash);
try { try {
QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash); QTorrentHandle h = QBtSession::instance()->getTorrentHandle(hash);
if (!h.has_metadata()) if (!h.has_metadata())
@ -325,7 +336,8 @@ QString btjson::getFilesForTorrent(const QString& hash)
file_list.append(file_dict); file_list.append(file_dict);
} }
} catch (const std::exception&) { } catch (const std::exception& e) {
qWarning() << Q_FUNC_INFO << "Invalid torrent: " << e.what();
return QString(); return QString();
} }

5
src/webui/jsondict.cpp

@ -49,10 +49,9 @@ void JsonDict::add(const QString& key, const QVariant& value)
const QString& JsonDict::toString() const const QString& JsonDict::toString() const
{ {
static QString str;
if (m_dirty) { if (m_dirty) {
str = "{" + m_items.join(",") + "}"; m_json = "{" + m_items.join(",") + "}";
m_dirty = false; m_dirty = false;
} }
return str; return m_json;
} }

1
src/webui/jsondict.h

@ -43,6 +43,7 @@ public:
private: private:
mutable bool m_dirty; mutable bool m_dirty;
mutable QString m_json;
QStringList m_items; QStringList m_items;
}; };

5
src/webui/jsonlist.cpp

@ -37,12 +37,11 @@ JsonList::JsonList() : m_dirty(false)
const QString& JsonList::toString() const const QString& JsonList::toString() const
{ {
static QString str;
if (m_dirty) { if (m_dirty) {
str = "[" + m_items.join(",") + "]"; m_json = "[" + m_items.join(",") + "]";
m_dirty = false; m_dirty = false;
} }
return str; return m_json;
} }
void JsonList::clear() void JsonList::clear()

1
src/webui/jsonlist.h

@ -45,6 +45,7 @@ public:
private: private:
mutable bool m_dirty; mutable bool m_dirty;
mutable QString m_json;
QStringList m_items; QStringList m_items;
}; };

Loading…
Cancel
Save