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;