Skip to content

Commit 6263ef0

Browse files
committed
Move hi-level connection code to qredisclient
1 parent d3a2bed commit 6263ef0

File tree

6 files changed

+41
-94
lines changed

6 files changed

+41
-94
lines changed

src/app/models/treeoperations.cpp

Lines changed: 26 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "treeoperations.h"
22
#include <qredisclient/redisclient.h>
3-
#include <qredisclient/utils/compat.h>
43
#include "app/widgets/consoletabs.h"
54
#include "app/models/connectionconf.h"
65
#include "console/consoletab.h"
@@ -14,98 +13,47 @@ TreeOperations::TreeOperations(QSharedPointer<RedisClient::Connection> connectio
1413
{
1514
}
1615

17-
void TreeOperations::getDatabases(std::function<void (ConnectionsTree::Operations::DatabaseList)> callback)
16+
void TreeOperations::getDatabases(std::function<void (RedisClient::DatabaseList)> callback)
1817
{
19-
using namespace RedisClient;
20-
21-
// Get keys count
22-
Response result;
23-
try {
24-
result = m_connection->commandSync("info");
25-
} catch (const RedisClient::Connection::Exception& e) {
26-
throw ConnectionsTree::Operations::Exception("Connection error:\n\n" + QString(e.what()));
18+
if (!m_connection->isConnected()) {
19+
try {
20+
m_connection->connect(true);
21+
} catch (const RedisClient::Connection::Exception& e) {
22+
throw ConnectionsTree::Operations::Exception("Connection error: " + QString(e.what()));
23+
}
2724
}
2825

29-
DatabaseList availableDatabeses;
30-
QSet<int> loadedDatabeses;
26+
RedisClient::DatabaseList availableDatabeses = m_connection->getKeyspaceInfo();
3127

32-
if (result.isErrorMessage()) {
33-
return callback(availableDatabeses);
34-
}
28+
//detect all databases
29+
RedisClient::Response scanningResp;
30+
int dbIndex = (availableDatabeses.size() == 0)? 0 : availableDatabeses.lastKey() + 1;
3531

36-
// Parse keyspace info
37-
QString keyspaceInfo = result.getValue().toString();
38-
QRegularExpression getDbAndKeysCount("^db(\\d+):keys=(\\d+)");
39-
getDbAndKeysCount.setPatternOptions(QRegularExpression::MultilineOption);
40-
QRegularExpressionMatchIterator iter = getDbAndKeysCount.globalMatch(keyspaceInfo);
41-
while (iter.hasNext()) {
42-
QRegularExpressionMatch match = iter.next();
43-
int dbIndex = match.captured(1).toInt();
44-
availableDatabeses.push_back({dbIndex, match.captured(2).toInt()});
45-
loadedDatabeses.insert(dbIndex);
46-
}
32+
while (true) {
33+
try {
34+
scanningResp = m_connection->commandSync("select", QString::number(dbIndex));
35+
} catch (const RedisClient::Connection::Exception& e) {
36+
throw ConnectionsTree::Operations::Exception("Connection error: " + QString(e.what()));
37+
}
4738

48-
int dbCount = (loadedDatabeses.isEmpty())? 0 : *std::max_element(loadedDatabeses.begin(),
49-
loadedDatabeses.end());
50-
//detect more db if needed
51-
if (dbCount == 0) {
52-
Response scanningResp;
53-
do {
54-
try {
55-
scanningResp = m_connection->commandSync("select", QString::number(dbCount));
56-
} catch (const RedisClient::Connection::Exception& e) {
57-
throw ConnectionsTree::Operations::Exception("Connection error: " + QString(e.what()));
58-
}
59-
} while (scanningResp.isOkMessage() && ++dbCount);
60-
}
39+
if (!scanningResp.isOkMessage())
40+
break;
6141

62-
// build db list
63-
for (int dbIndex = 0; dbIndex < dbCount; ++dbIndex)
64-
{
65-
if (loadedDatabeses.contains(dbIndex))
66-
continue;
67-
availableDatabeses.push_back({dbIndex, 0});
42+
availableDatabeses.insert(dbIndex, 0);
43+
++dbIndex;
6844
}
6945

70-
std::sort(availableDatabeses.begin(), availableDatabeses.end(),
71-
[](QPair<int, int> l, QPair<int, int> r) {
72-
return l.first < r.first;
73-
});
74-
7546
return callback(availableDatabeses);
7647
}
7748

78-
void TreeOperations::getDatabaseKeys(uint dbIndex, std::function<void (const RawKeysList &, const QString &)> callback)
49+
void TreeOperations::getDatabaseKeys(uint dbIndex, std::function<void (const RedisClient::Connection::RawKeysList &, const QString &)> callback)
7950
{
8051
QString keyPattern = static_cast<ConnectionConfig>(m_connection->getConfig()).keysPattern();
8152

82-
if (m_connection->getServerVersion() >= 2.8) {
83-
QList<QByteArray> rawCmd {
84-
"scan", "0", "MATCH", keyPattern.toUtf8(), "COUNT", "10000"
85-
};
86-
QSharedPointer<RedisClient::ScanCommand> keyCmd(new RedisClient::ScanCommand(rawCmd, dbIndex));
87-
88-
try {
89-
m_connection->retrieveCollection(keyCmd, [this, callback](QVariant r, QString err)
90-
{
91-
if (!err.isEmpty())
92-
callback(RawKeysList(), QString("Cannot load keys: %1").arg(err));
93-
94-
callback(convertQVariantList(r.toList()), QString());
95-
});
96-
} catch (const RedisClient::Connection::Exception& error) {
97-
callback(RawKeysList(), QString("Cannot load keys: %1").arg(error.what()));
98-
}
99-
} else {
100-
try {
101-
m_connection->command({"KEYS", keyPattern.toUtf8()}, this,
102-
[this, callback](RedisClient::Response r, QString)
103-
{
104-
callback(convertQVariantList(r.getValue().toList()), QString());
105-
}, dbIndex);
106-
} catch (const RedisClient::Connection::Exception& error) {
107-
callback(RawKeysList(), QString("Cannot load keys: %1").arg(error.what()));
108-
}
53+
try {
54+
m_connection->getDatabaseKeys(callback, keyPattern, dbIndex);
55+
} catch (const RedisClient::Connection::Exception& error) {
56+
callback(RedisClient::Connection::RawKeysList(), QString("Cannot load keys: %1").arg(error.what()));
10957
}
11058
}
11159

src/app/models/treeoperations.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ class TreeOperations : public QObject, public ConnectionsTree::Operations
1616
TreeOperations(QSharedPointer<RedisClient::Connection> connection,
1717
ConsoleTabs& tabs);
1818

19-
void getDatabases(std::function<void(DatabaseList)>) override;
19+
void getDatabases(std::function<void(RedisClient::DatabaseList)>) override;
2020

21-
void getDatabaseKeys(uint dbIndex, std::function<void(const RawKeysList&, const QString&)>) override;
21+
void getDatabaseKeys(uint dbIndex, std::function<void(const RedisClient::Connection::RawKeysList&, const QString&)>) override;
2222

2323
void disconnect() override;
2424

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
2+
#include <qredisclient/connection.h>
23
#include "treeitem.h"
34
#include "connections-tree/operations.h"
45
#include <QtConcurrent>
@@ -49,14 +50,14 @@ protected slots:
4950
void reload();
5051
void filterKeys(const QRegExp& filter);
5152
void resetFilter();
52-
void renderRawKeys(const Operations::RawKeysList& rawKeys);
53+
void renderRawKeys(const RedisClient::Connection::RawKeysList& rawKeys);
5354

5455
private:
5556
class KeysTreeRenderer
5657
{
5758
public:
5859
static QSharedPointer<DatabaseKeys> renderKeys(QSharedPointer<Operations> operations,
59-
Operations::RawKeysList keys,
60+
RedisClient::Connection::RawKeysList keys,
6061
QRegExp filter,
6162
QString namespaceSeparator,
6263
QSharedPointer<DatabaseItem>);
@@ -79,7 +80,7 @@ protected slots:
7980
QSharedPointer<DatabaseKeys> m_keys;
8081
QFutureWatcher<QSharedPointer<DatabaseKeys>> m_keysLoadingWatcher;
8182
QWeakPointer<TreeItem> m_parent;
82-
Operations::RawKeysList m_rawKeys;
83+
RedisClient::Connection::RawKeysList m_rawKeys;
8384
QRegExp m_filter;
8485
ParentView* m_parentView;
8586
};

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,17 +166,17 @@ void ServerItem::load()
166166
m_locked = true;
167167
emit updateIcon();
168168

169-
std::function<void(Operations::DatabaseList)> callback = [this](Operations::DatabaseList databases) {
169+
std::function<void(RedisClient::DatabaseList)> callback = [this](RedisClient::DatabaseList databases) {
170170

171171
if (databases.size() == 0)
172172
{
173173
m_locked = false;
174174
return;
175175
}
176176

177-
Operations::DatabaseList::const_iterator db = databases.constBegin();
177+
RedisClient::DatabaseList::const_iterator db = databases.constBegin();
178178
while (db != databases.constEnd()) {
179-
QSharedPointer<TreeItem> database((new DatabaseItem(db->first, db->second, m_operations, m_self)));
179+
QSharedPointer<TreeItem> database((new DatabaseItem(db.key(), db.value(), m_operations, m_self)));
180180

181181
QObject::connect(dynamic_cast<QObject*>(database.data()), SIGNAL(keysLoaded(unsigned int)),
182182
this, SIGNAL(keysLoadedInDatabase(unsigned int)));

src/modules/connections-tree/operations.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22
#include <QString>
3-
#include <QHash>
3+
#include <QMap>
44
#include <QSharedPointer>
55
#include <QStringList>
66
#include <functional>
@@ -22,16 +22,14 @@ namespace ConnectionsTree {
2222
/**
2323
* List of databases with keys counters
2424
* @emit databesesLoaded
25-
**/
26-
typedef QVector<QPair<int, int>> DatabaseList;
27-
virtual void getDatabases(std::function<void(DatabaseList)>) = 0;
25+
**/
26+
virtual void getDatabases(std::function<void(QMap<int, int>)>) = 0;
2827

2928
/**
3029
* @brief getDatabaseKeys
3130
* @param dbIndex
32-
*/
33-
typedef QList<QByteArray> RawKeysList;
34-
virtual void getDatabaseKeys(uint dbIndex, std::function<void(const RawKeysList&, const QString&)>) = 0;
31+
*/
32+
virtual void getDatabaseKeys(uint dbIndex, std::function<void(const QList<QByteArray>&, const QString&)>) = 0;
3533

3634
/**
3735
* Cancel all operations & close connection

0 commit comments

Comments
 (0)