bool TreeOperations::loadDatabases(
std::function<void(RedisClient::DatabaseList)> callback) {
auto connection = m_connection->clone();
m_events->registerLoggerForConnection(*connection);
bool connected = false;
try {
connected = connection->connect(true);
} catch (const RedisClient::Connection::Exception& e) {
emit m_events->error(
QCoreApplication::translate("RDM", "Connection error: ") +
QString(e.what()));
return false;
}
if (!connected) {
emit m_events->error(
QCoreApplication::translate(
"RDM", "Cannot connect to server '%1'. Check log for details.")
.arg(connection->getConfig().name()));
return false;
}
RedisClient::DatabaseList availableDatabeses = connection->getKeyspaceInfo();
if (connection->mode() != RedisClient::Connection::Mode::Cluster) {
// detect all databases
RedisClient::Response scanningResp;
int lastDbIndex =
(availableDatabeses.size() == 0) ? 0 : availableDatabeses.lastKey() + 1;
if (m_dbCount > 0) {
for (int index = lastDbIndex; index < m_dbCount; index++) {
availableDatabeses.insert(index, 0);
}
} else {
uint dbScanLimit = conf().databaseScanLimit();
for (int index = lastDbIndex; index < dbScanLimit; index++) {
try {
QString select_cmd = "select";
QList<QByteArray> select_list;
select_list.append(select_cmd.toLatin1());
scanningResp = connection->commandSync(select_list, QString::number(index));
} catch (const RedisClient::Connection::Exception& e) {
throw ConnectionsTree::Operations::Exception(
QCoreApplication::translate("RDM", "Connection error: ") +
QString(e.what()));
}
if (!scanningResp.isOkMessage()) {
break;
}
availableDatabeses.insert(index, 0);
++lastDbIndex;
}
m_dbCount = lastDbIndex;
}
}
callback(availableDatabeses);
return true;
}