diff --git a/packages/tools/src/dbKeysLoader.ts b/packages/tools/src/dbKeysLoader.ts
index 428ca10ab..42c36923d 100644
--- a/packages/tools/src/dbKeysLoader.ts
+++ b/packages/tools/src/dbKeysLoader.ts
@@ -176,7 +176,7 @@ export function dbKeys_reloadFolder(tree: DbKeysTreeModel, root: string): DbKeys
};
}
-function addFlatItems(tree: DbKeysTreeModel, root: string, res: DbKeysNodeModel[]) {
+function addFlatItems(tree: DbKeysTreeModel, root: string, res: DbKeysNodeModel[], visitedRoots: string[] = []) {
const item = tree.dirsByKey[root];
if (!item.isExpanded) {
return false;
@@ -185,7 +185,11 @@ function addFlatItems(tree: DbKeysTreeModel, root: string, res: DbKeysNodeModel[
for (const child of children) {
res.push(child);
if (child.type == 'dir') {
- addFlatItems(tree, child.root, res);
+ if (visitedRoots.includes(child.root)) {
+ console.warn('Redis: preventing infinite loop for root', child.root);
+ return false;
+ }
+ addFlatItems(tree, child.root, res, [...visitedRoots, root]);
}
}
}
diff --git a/packages/web/src/widgets/DbKeysSubTree.svelte b/packages/web/src/widgets/DbKeysSubTree.svelte
index 5138474f2..b8e026839 100644
--- a/packages/web/src/widgets/DbKeysSubTree.svelte
+++ b/packages/web/src/widgets/DbKeysSubTree.svelte
@@ -17,11 +17,24 @@
export let model: DbKeysTreeModel;
export let changeModel: DbKeysChangeModelFunction;
+ export let parentRoots = [];
+
$: items = model.childrenByKey[root] ?? [];
{#each items as item}
-
+
{/each}
{#if model.dirsByKey[root]?.shouldLoadNext}
diff --git a/packages/web/src/widgets/DbKeysTreeNode.svelte b/packages/web/src/widgets/DbKeysTreeNode.svelte
index afb968be6..10b869b59 100644
--- a/packages/web/src/widgets/DbKeysTreeNode.svelte
+++ b/packages/web/src/widgets/DbKeysTreeNode.svelte
@@ -31,6 +31,7 @@
export let item;
export let indentLevel = 0;
export let filter;
+ export let parentRoots = [];
export let model: DbKeysTreeModel;
export let changeModel: DbKeysChangeModelFunction;
@@ -179,7 +180,7 @@
{item.text}
-->
-{#if isExpanded}
+{#if isExpanded && !parentRoots.includes(item.root)}
{/if}
diff --git a/plugins/dbgate-plugin-redis/src/backend/driver.js b/plugins/dbgate-plugin-redis/src/backend/driver.js
index aab53f939..b1a7d1b98 100644
--- a/plugins/dbgate-plugin-redis/src/backend/driver.js
+++ b/plugins/dbgate-plugin-redis/src/backend/driver.js
@@ -260,7 +260,7 @@ const driver = {
extractKeysFromLevel(dbhan, root, keys) {
const prefix = root ? `${root}${dbhan.treeKeySeparator}` : '';
- const rootSplit = _.compact(root.split(dbhan.treeKeySeparator));
+ const rootSplit = root == '' ? [] : root.split(dbhan.treeKeySeparator);
const res = {};
for (const key of keys) {
if (!key.startsWith(prefix)) continue;