diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 9f9310916..ebe5e5186 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -173,6 +173,10 @@ /> {/if} +{#if driver?.showConnectionField('treeKeySeparator', $values)} + +{/if} + {#if driver?.showConnectionField('windowsDomain', $values)} {/if} diff --git a/plugins/dbgate-plugin-redis/src/backend/driver.js b/plugins/dbgate-plugin-redis/src/backend/driver.js index 19728f1e6..ab03f55fa 100644 --- a/plugins/dbgate-plugin-redis/src/backend/driver.js +++ b/plugins/dbgate-plugin-redis/src/backend/driver.js @@ -81,7 +81,7 @@ function splitCommandLine(str) { const driver = { ...driverBase, analyserClass: Analyser, - async connect({ server, port, password, database, useDatabaseUrl, databaseUrl }) { + async connect({ server, port, password, database, useDatabaseUrl, databaseUrl, treeKeySeparator }) { let db = 0; let pool; if (useDatabaseUrl) { @@ -95,6 +95,7 @@ const driver = { password, db, }); + pool.__treeKeySeparator = treeKeySeparator || ':'; } return pool; @@ -146,7 +147,7 @@ const driver = { info .split('\n') .filter((x) => x.trim() && !x.trim().startsWith('#')) - .map((x) => x.split(':')) + .map((x) => x.split(pool.__treeKeySeparator)) ); }, async getVersion(pool) { @@ -164,7 +165,7 @@ const driver = { }, async loadKeys(pool, root = '', filter = null) { - const keys = await this.getKeys(pool, root ? `${root}:*` : '*'); + const keys = await this.getKeys(pool, root ? `${root}${pool.__treeKeySeparator}*` : '*'); const keysFiltered = keys.filter((x) => filterName(filter, x)); const res = this.extractKeysFromLevel(root, keysFiltered); await this.enrichKeyInfo(pool, res); @@ -197,12 +198,12 @@ const driver = { }, extractKeysFromLevel(root, keys) { - const prefix = root ? `${root}:` : ''; - const rootSplit = _.compact(root.split(':')); + const prefix = root ? `${root}${pool.__treeKeySeparator}` : ''; + const rootSplit = _.compact(root.split(pool.__treeKeySeparator)); const res = {}; for (const key of keys) { if (!key.startsWith(prefix)) continue; - const keySplit = key.split(':'); + const keySplit = key.split(pool.__treeKeySeparator); if (keySplit.length > rootSplit.length) { const text = keySplit[rootSplit.length]; if (keySplit.length == rootSplit.length + 1) { @@ -216,9 +217,9 @@ const driver = { res[dctKey].count++; } else { res[dctKey] = { - text: text + ':*', + text: text + pool.__treeKeySeparator + '*', type: 'dir', - root: keySplit.slice(0, rootSplit.length + 1).join(':'), + root: keySplit.slice(0, rootSplit.length + 1).join(pool.__treeKeySeparator), count: 1, }; } diff --git a/plugins/dbgate-plugin-redis/src/frontend/driver.js b/plugins/dbgate-plugin-redis/src/frontend/driver.js index f05e14e7f..95df6fd82 100644 --- a/plugins/dbgate-plugin-redis/src/frontend/driver.js +++ b/plugins/dbgate-plugin-redis/src/frontend/driver.js @@ -78,9 +78,9 @@ const driver = { showConnectionField: (field, values) => { if (field == 'useDatabaseUrl') return true; if (values.useDatabaseUrl) { - return ['databaseUrl', 'isReadOnly'].includes(field); + return ['databaseUrl', 'isReadOnly', 'treeKeySeparator'].includes(field); } - return ['server', 'port', 'password', 'isReadOnly'].includes(field); + return ['server', 'port', 'password', 'isReadOnly', 'treeKeySeparator'].includes(field); }, showConnectionTab: (field) => field == 'sshTunnel',