Redis - ability to skip SETNAME #1077

This commit is contained in:
SPRINX0\prochazka
2025-03-28 08:55:01 +01:00
parent e4671ffdb3
commit 61e35b9773
4 changed files with 44 additions and 6 deletions

View File

@@ -305,6 +305,7 @@ export interface EngineDriver<TClient = any> extends FilterBehaviourProvider {
command: 'backup' | 'restore' command: 'backup' | 'restore'
): { message: string; severity: 'info' | 'error' | 'debug' } | null; ): { message: string; severity: 'info' | 'error' | 'debug' } | null;
getNativeOperationFormArgs(operation: 'backup' | 'restore'): any[]; getNativeOperationFormArgs(operation: 'backup' | 'restore'): any[];
getAdvancedConnectionFields(): any[];
analyserClass?: any; analyserClass?: any;
dumperClass?: any; dumperClass?: any;

View File

@@ -1,13 +1,24 @@
<script lang="ts"> <script lang="ts">
import FormTextField from '../forms/FormTextField.svelte'; import FormTextField from '../forms/FormTextField.svelte';
import { openedConnections, openedSingleDatabaseConnections } from '../stores'; import { extensions, openedConnections, openedSingleDatabaseConnections } from '../stores';
import { getFormContext } from '../forms/FormProviderCore.svelte'; import { getFormContext } from '../forms/FormProviderCore.svelte';
import FormTextAreaField from '../forms/FormTextAreaField.svelte'; import FormTextAreaField from '../forms/FormTextAreaField.svelte';
import FormArgumentList from '../forms/FormArgumentList.svelte';
const { values } = getFormContext(); const { values } = getFormContext();
$: engine = $values.engine;
$: driver = $extensions.drivers.find(x => x.engine == engine);
$: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id); $: isConnected = $openedConnections.includes($values._id) || $openedSingleDatabaseConnections.includes($values._id);
$: advancedFields = driver?.getAdvancedConnectionFields ? driver?.getAdvancedConnectionFields() : null;
</script> </script>
<FormTextAreaField label="Allowed databases, one per line" name="allowedDatabases" disabled={isConnected} rows={8} /> <FormTextAreaField label="Allowed databases, one per line" name="allowedDatabases" disabled={isConnected} rows={8} />
<FormTextField label="Allowed databases regular expression" name="allowedDatabasesRegex" disabled={isConnected} /> <FormTextField label="Allowed databases regular expression" name="allowedDatabasesRegex" disabled={isConnected} />
{#if advancedFields}
<FormArgumentList args={advancedFields} />
{/if}

View File

@@ -81,12 +81,25 @@ function splitCommandLine(str) {
const driver = { const driver = {
...driverBase, ...driverBase,
analyserClass: Analyser, analyserClass: Analyser,
async connect({ server, port, user, password, database, useDatabaseUrl, databaseUrl, treeKeySeparator, ssl }) { async connect({
server,
port,
user,
password,
database,
useDatabaseUrl,
databaseUrl,
treeKeySeparator,
ssl,
skipSetName,
}) {
let db = 0; let db = 0;
let client; let client;
if (useDatabaseUrl) { if (useDatabaseUrl) {
client = new Redis(databaseUrl); client = new Redis(databaseUrl);
await client.client('SETNAME', 'dbgate'); if (!skipSetName) {
await client.client('SETNAME', 'dbgate');
}
} else { } else {
if (_.isString(database) && database.startsWith('db')) db = parseInt(database.substring(2)); if (_.isString(database) && database.startsWith('db')) db = parseInt(database.substring(2));
if (_.isNumber(database)) db = database; if (_.isNumber(database)) db = database;
@@ -96,15 +109,18 @@ const driver = {
passphrase: ssl.password, passphrase: ssl.password,
}; };
} }
client = new Redis({ const connectionOptions = {
host: server, host: server,
port, port,
username: user, username: user,
password, password,
db, db,
connectionName: 'dbgate',
tls: ssl, tls: ssl,
}); };
if (!skipSetName) {
connectionOptions.connectionName = 'dbgate';
}
client = new Redis(connectionOptions);
} }
return { return {

View File

@@ -82,6 +82,16 @@ const driver = {
} }
return ['server', 'port', 'user', 'password', 'isReadOnly', 'treeKeySeparator'].includes(field); return ['server', 'port', 'user', 'password', 'isReadOnly', 'treeKeySeparator'].includes(field);
}, },
getAdvancedConnectionFields() {
return [
{
type: 'checkbox',
name: 'skipSetName',
label: 'Skip SETNAME instruction',
},
];
},
}; };
module.exports = driver; module.exports = driver;