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',