Skip to content

Commit 31132b7

Browse files
committed
Fix corrupted tree view on load->reload->load
1 parent 4263755 commit 31132b7

19 files changed

+129
-134
lines changed

src/app/models/treeoperations.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,10 +491,10 @@ void TreeOperations::getUsedMemory(const QList<QByteArray>& keys, int dbIndex,
491491
}
492492

493493
if (progress)
494-
progress->call(std::move(*totalMemory));
494+
progress->call(*totalMemory);
495495

496496
if ((*processedResponses) >= expectedResponses && result) {
497-
result->call(std::move(*totalMemory));
497+
result->call(*totalMemory);
498498
}
499499
}
500500
});

src/modules/common/callbackwithowner.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class CallbackWithOwner
1111
{
1212
public:
1313
CallbackWithOwner(QWeakPointer<Object> owner, std::function<void(Args...)> c)
14-
: m_owner(owner), callback(c)
14+
: m_owner(owner), m_callback(c)
1515
{
1616
}
1717

@@ -23,7 +23,7 @@ class CallbackWithOwner
2323
return;
2424
}
2525

26-
return callback(std::forward<Args>(args)...);
26+
return m_callback(args...);
2727
}
2828

2929
bool isValid()
@@ -32,7 +32,7 @@ class CallbackWithOwner
3232
return !owner.isNull();
3333
}
3434

35-
std::function<void(Args...)> callback;
3635
private:
3736
QWeakPointer<Object> m_owner;
37+
std::function<void(Args...)> m_callback;
3838
};

src/modules/connections-tree/items/abstractnamespaceitem.cpp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ QSharedPointer<TreeItem> resolveItemToRemove(QSharedPointer<TreeItem> item) {
115115

116116
if (!parent || parent->type() == "database") return item;
117117

118-
if (parent->type() == "namespace" && parent->getAllChilds().size() == 0)
118+
if (parent->type() == "namespace" && parent->getAllChilds().empty())
119119
return resolveItemToRemove(parent);
120120

121121
return item;
@@ -254,7 +254,7 @@ void AbstractNamespaceItem::clear() {
254254
}
255255

256256
void AbstractNamespaceItem::clearLoader() {
257-
if (m_childItems.size() == 0) {
257+
if (m_childItems.empty()) {
258258
return;
259259
}
260260

@@ -303,7 +303,7 @@ void AbstractNamespaceItem::sortChilds() {
303303

304304
void AbstractNamespaceItem::renderRawKeys(
305305
const RedisClient::Connection::RawKeysList &keylist, QRegExp filter,
306-
std::function<void()> callback, bool appendNewItems,
306+
QSharedPointer<RenderRawKeysCallback> callback, bool appendNewItems,
307307
bool checkPreRenderedItems, int maxChildItems) {
308308
if (!m_operations) {
309309
return;
@@ -341,12 +341,13 @@ void AbstractNamespaceItem::renderRawKeys(
341341
m_operations, future.result(),
342342
qSharedPointerDynamicCast<AbstractNamespaceItem>(self), settings,
343343
m_model.expandedNamespaces);
344-
callback();
344+
if (callback)
345+
callback->call();
345346
});
346347
}
347348

348349
void AbstractNamespaceItem::ensureLoaderIsCreated() {
349-
if (m_rawChildKeys.size() == 0 || m_childItems.size() == 0) {
350+
if (m_rawChildKeys.empty() || m_childItems.empty()) {
350351
return;
351352
}
352353

@@ -360,13 +361,11 @@ void AbstractNamespaceItem::ensureLoaderIsCreated() {
360361
m_model.childLoaded(getSelf());
361362
}
362363

363-
QHash<QString, std::function<void()>> AbstractNamespaceItem::eventHandlers() {
364+
QHash<QString, std::function<bool ()> > AbstractNamespaceItem::eventHandlers() {
364365
auto events = TreeItem::eventHandlers();
365366

366367
events.insert("analyze_memory_usage", [this]() {
367-
if (m_usedMemory > 0) return;
368-
369-
lock();
368+
if (m_usedMemory > 0) return true;
370369

371370
auto future = m_operations->connectionSupportsMemoryOperations();
372371

@@ -396,6 +395,7 @@ QHash<QString, std::function<void()>> AbstractNamespaceItem::eventHandlers() {
396395
});
397396
});
398397
});
398+
return false;
399399
});
400400

401401
return events;
@@ -415,11 +415,10 @@ void AbstractNamespaceItem::getMemoryUsage(
415415
}
416416

417417
void AbstractNamespaceItem::fetchMore() {
418-
if (m_rawChildKeys.size() == 0) {
418+
if (m_rawChildKeys.empty()) {
419419
return;
420420
}
421421

422-
lock();
423422
clearLoader();
424423

425424
int childsCount = m_childItems.size();
@@ -429,13 +428,15 @@ void AbstractNamespaceItem::fetchMore() {
429428

430429
m_rawChildKeys.clear();
431430

432-
return renderRawKeys(
433-
rawKeys, m_filter,
434-
[this]() {
431+
auto callback = QSharedPointer<RenderRawKeysCallback>(
432+
new RenderRawKeysCallback(getSelf(), [this]() {
435433
ensureLoaderIsCreated();
436434

437435
unlock();
438-
},
436+
}));
437+
438+
return renderRawKeys(
439+
rawKeys, m_filter, callback,
439440
true, false, static_cast<uint>(childsCount) + keysRenderingLimit());
440441
}
441442

@@ -453,7 +454,7 @@ void AbstractNamespaceItem::calculateUsedMemory(
453454
m_usedMemory = result;
454455
emit m_model.itemChanged(getSelf());
455456

456-
if (m_childItems.size() == 0) callback(result);
457+
if (m_childItems.empty()) callback(result);
457458
}));
458459

459460
auto progressCallback = QSharedPointer<Operations::GetUsedMemoryCallback>(

src/modules/connections-tree/items/abstractnamespaceitem.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "memoryusage.h"
99
#include "treeitem.h"
10+
#include "modules/common/callbackwithowner.h"
1011

1112
namespace ConnectionsTree {
1213

@@ -89,13 +90,15 @@ class AbstractNamespaceItem : public QObject, public TreeItem, public MemoryUsag
8990

9091
void sortChilds();
9192

93+
using RenderRawKeysCallback = CallbackWithOwner<TreeItem>;
94+
9295
void renderRawKeys(const RedisClient::Connection::RawKeysList& keylist, QRegExp filter,
93-
std::function<void ()> callback,
96+
QSharedPointer<RenderRawKeysCallback> callback,
9497
bool appendNewItems,
9598
bool checkPreRenderedItems,
9699
int maxChildItems=-1);
97100

98-
QHash<QString, std::function<void()>> eventHandlers() override;
101+
QHash<QString, std::function<bool()>> eventHandlers() override;
99102

100103
void calculateUsedMemory(QSharedPointer<AsyncFuture::Deferred<qlonglong>> parentD, std::function<void(qlonglong)> callback);
101104

src/modules/connections-tree/items/databaseitem.cpp

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ void DatabaseItem::loadKeys(std::function<void()> callback,
5858

5959
QString filter = (m_filter.isEmpty()) ? "" : m_filter.pattern();
6060

61-
auto selfWPtr = getSelf();
62-
auto self = selfWPtr.toStrongRef();
61+
auto self = getSelf().toStrongRef();
6362

6463
if (!self) {
6564
unlock();
@@ -85,25 +84,22 @@ void DatabaseItem::loadKeys(std::function<void()> callback,
8584

8685
m_operations->getDatabases(dbLoadCallback);
8786

88-
auto onKeysRendered = [selfWPtr, this, callback]() {
89-
auto self = selfWPtr.toStrongRef();
90-
91-
if (!self) return;
87+
auto onKeysRendered = QSharedPointer<RenderRawKeysCallback>(
88+
new RenderRawKeysCallback(getSelf(), [this, callback]() {
89+
ensureLoaderIsCreated();
90+
unlock();
9291

93-
ensureLoaderIsCreated();
94-
unlock();
95-
96-
if (!isExpanded()) {
97-
setExpanded(true);
98-
m_model.expandItem(getSelf());
99-
}
92+
if (!isExpanded()) {
93+
setExpanded(true);
94+
m_model.expandItem(getSelf());
95+
}
10096

101-
emit m_model.itemChanged(getSelf());
97+
emit m_model.itemChanged(getSelf());
10298

103-
if (callback) {
104-
callback();
105-
}
106-
};
99+
if (callback) {
100+
callback();
101+
}
102+
}));
107103

108104
auto nsItemsCallback = QSharedPointer<Operations::LoadNamespaceItemsCallback>(
109105
new Operations::LoadNamespaceItemsCallback(
@@ -277,7 +273,7 @@ void DatabaseItem::resetFilter() {
277273
reload();
278274
}
279275

280-
QHash<QString, std::function<void()>> DatabaseItem::eventHandlers() {
276+
QHash<QString, std::function<bool ()> > DatabaseItem::eventHandlers() {
281277
auto events = AbstractNamespaceItem::eventHandlers();
282278

283279
events.insert("click", [this]() {
@@ -286,16 +282,18 @@ QHash<QString, std::function<void()>> DatabaseItem::eventHandlers() {
286282
setExpanded(true);
287283
m_model.expandItem(getSelf());
288284
}
289-
return;
285+
return true;
290286
}
291287

292288
loadKeys();
289+
return false;
293290
});
294291

295292
events.insert("right-click", [this]() {
296-
if (m_childItems.size() != 0) return;
293+
if (m_childItems.size() != 0) return true;
297294

298295
emit m_model.itemChanged(getSelf());
296+
return true;
299297
});
300298

301299
events.insert("add_key", [this]() {
@@ -315,20 +313,12 @@ QHash<QString, std::function<void()>> DatabaseItem::eventHandlers() {
315313
}));
316314

317315
m_operations->openNewKeyDialog(m_dbIndex, callback);
316+
return true;
318317
});
319318

320319
events.insert("reload", [this]() {
321-
if (isLocked()) {
322-
QMessageBox::warning(
323-
nullptr,
324-
QCoreApplication::translate(
325-
"RESP", "Another operation is currently in progress"),
326-
QCoreApplication::translate(
327-
"RESP", "Please wait until another operation will be finished."));
328-
return;
329-
}
330-
331320
reload();
321+
return false;
332322
});
333323

334324
events.insert("flush", [this]() {
@@ -343,19 +333,20 @@ QHash<QString, std::function<void()>> DatabaseItem::eventHandlers() {
343333
getSelf(), [this](const QString&) { unload(); }));
344334
m_operations->flushDb(m_dbIndex, callback);
345335
});
336+
return true;
346337
});
347338

348339
events.insert("console",
349-
[this]() { m_operations->openConsoleTab(m_dbIndex); });
340+
[this]() { m_operations->openConsoleTab(m_dbIndex); return true; });
350341

351-
events.insert("delete_keys", [this]() { m_operations->deleteDbKeys(*this); });
342+
events.insert("delete_keys", [this]() { m_operations->deleteDbKeys(*this); return true; });
352343

353-
events.insert("copy_keys", [this]() { m_operations->copyKeys(*this); });
344+
events.insert("copy_keys", [this]() { m_operations->copyKeys(*this); return true; });
354345

355346
events.insert("rdb_import",
356-
[this]() { m_operations->importKeysFromRdb(*this); });
347+
[this]() { m_operations->importKeysFromRdb(*this); return true; });
357348

358-
events.insert("ttl", [this]() { m_operations->setTTL(*this); });
349+
events.insert("ttl", [this]() { m_operations->setTTL(*this); return true; });
359350

360351
return events;
361352
}

src/modules/connections-tree/items/databaseitem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class DatabaseItem : public AbstractNamespaceItem {
3939
void filterKeys(const QRegExp& filter);
4040
void resetFilter();
4141

42-
QHash<QString, std::function<void()>> eventHandlers() override;
42+
QHash<QString, std::function<bool()>> eventHandlers() override;
4343

4444
private:
4545
QSharedPointer<QTimer> liveUpdateTimer();

src/modules/connections-tree/items/keyitem.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,29 +119,32 @@ void KeyItem::setFullPath(const QByteArray& p) {
119119
emit m_model.itemChanged(getSelf());
120120
}
121121

122-
QHash<QString, std::function<void()>> KeyItem::eventHandlers() {
122+
QHash<QString, std::function<bool()>> KeyItem::eventHandlers() {
123123
auto events = TreeItem::eventHandlers();
124124

125125
events.insert("click", [this]() {
126-
if (!isEnabled()) return;
126+
if (!isEnabled()) return true;
127127

128128
auto parentNs = parentTreeItemToNs(m_parent);
129129

130-
if (!parentNs || !parentNs->operations()) return;
130+
if (!parentNs || !parentNs->operations()) return true;
131131

132132
parentNs->operations()->openKeyTab(
133133
getSelf().toStrongRef().staticCast<KeyItem>(), false);
134+
return true;
134135
});
135136

136137
events.insert("mid-click", [this]() {
137-
if (!isEnabled()) return;
138+
if (!isEnabled()) return true;
138139

139140
auto parentNs = parentTreeItemToNs(m_parent);
140141

141-
if (!parentNs || !parentNs->operations()) return;
142+
if (!parentNs || !parentNs->operations()) return true;
142143

143144
parentNs->operations()->openKeyTab(
144145
getSelf().toStrongRef().staticCast<KeyItem>(), true);
146+
147+
return true;
145148
});
146149

147150
events.insert("delete", [this]() {
@@ -165,6 +168,7 @@ QHash<QString, std::function<void()>> KeyItem::eventHandlers() {
165168

166169
parentNs->operations()->deleteDbKey(*this, callback);
167170
});
171+
return true;
168172
});
169173
return events;
170174
}

src/modules/connections-tree/items/keyitem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class KeyItem : public TreeItem, public MemoryUsage {
4040
void getMemoryUsage(std::function<void(qlonglong)> callback) override;
4141

4242
protected:
43-
QHash<QString, std::function<void()>> eventHandlers() override;
43+
QHash<QString, std::function<bool()>> eventHandlers() override;
4444

4545
private:
4646
QByteArray m_fullPath;

src/modules/connections-tree/items/loadmoreitem.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ bool ConnectionsTree::LoadMoreItem::isEnabled() const
4242
return true;
4343
}
4444

45-
QHash<QString, std::function<void ()> > ConnectionsTree::LoadMoreItem::eventHandlers()
45+
QHash<QString, std::function<bool()> > ConnectionsTree::LoadMoreItem::eventHandlers()
4646
{
47-
QHash<QString, std::function<void()>> events;
47+
QHash<QString, std::function<bool()>> events;
4848
events["click"] = [this]() {
4949
auto parentPtr = m_parent.toStrongRef();
5050
if (!parentPtr) {
51-
return;
51+
return true;
5252
}
5353
parentPtr->fetchMore();
54+
return false;
5455
};
5556
return events;
5657
}

src/modules/connections-tree/items/loadmoreitem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class LoadMoreItem : public TreeItem {
2626
bool isEnabled() const override;
2727

2828
protected:
29-
QHash<QString, std::function<void()>> eventHandlers() override;
29+
QHash<QString, std::function<bool()>> eventHandlers() override;
3030

3131
private:
3232
QWeakPointer<TreeItem> m_parent;

0 commit comments

Comments
 (0)