redis: support readonly and database url

This commit is contained in:
Jan Prochazka
2022-03-27 18:34:22 +02:00
parent 11c82b1aac
commit 0e8166577f
4 changed files with 75 additions and 56 deletions

View File

@@ -211,6 +211,10 @@ async function handleLoadKeyInfo({ msgid, key }) {
async function handleCallMethod({ msgid, method, args }) { async function handleCallMethod({ msgid, method, args }) {
return handleDriverDataCore(msgid, driver => { return handleDriverDataCore(msgid, driver => {
if (storedConnection.isReadOnly) {
throw new Error('Connection is read only, cannot call custom methods');
}
ensureExecuteCustomScript(driver); ensureExecuteCustomScript(driver);
return driver.callMethod(systemConnection, method, args); return driver.callMethod(systemConnection, method, args);
}); });

View File

@@ -3,13 +3,13 @@
import AppObjectCore from '../appobj/AppObjectCore.svelte'; import AppObjectCore from '../appobj/AppObjectCore.svelte';
import { plusExpandIcon } from '../icons/expandIcons'; import { plusExpandIcon } from '../icons/expandIcons';
import FontIcon from '../icons/FontIcon.svelte';
import ConfirmModal from '../modals/ConfirmModal.svelte'; import ConfirmModal from '../modals/ConfirmModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte'; import InputTextModal from '../modals/InputTextModal.svelte';
import { showModal } from '../modals/modalTools'; import { showModal } from '../modals/modalTools';
import newQuery from '../query/newQuery'; import newQuery from '../query/newQuery';
import { activeDbKeysStore } from '../stores'; import { activeDbKeysStore } from '../stores';
import { apiCall } from '../utility/api'; import { apiCall } from '../utility/api';
import { getConnectionInfo } from '../utility/metadataLoaders';
import openNewTab from '../utility/openNewTab'; import openNewTab from '../utility/openNewTab';
import { showSnackbarError } from '../utility/snackbar'; import { showSnackbarError } from '../utility/snackbar';
@@ -29,9 +29,11 @@ import { showSnackbarError } from '../utility/snackbar';
let reloadToken = 0; let reloadToken = 0;
// $: console.log(item.text, indentLevel); // $: console.log(item.text, indentLevel);
function createMenu() { async function createMenu() {
const connection = await getConnectionInfo({ conid });
return [ return [
item.key != null && { item.key != null &&
!connection?.isReadOnly && {
label: 'Delete key', label: 'Delete key',
onClick: () => { onClick: () => {
showModal(ConfirmModal, { showModal(ConfirmModal, {
@@ -51,7 +53,8 @@ import { showSnackbarError } from '../utility/snackbar';
}); });
}, },
}, },
item.key != null && { item.key != null &&
!connection?.isReadOnly && {
label: 'Rename key', label: 'Rename key',
onClick: () => { onClick: () => {
showModal(InputTextModal, { showModal(InputTextModal, {
@@ -73,7 +76,8 @@ import { showSnackbarError } from '../utility/snackbar';
}); });
}, },
}, },
item.type == 'dir' && { item.type == 'dir' &&
!connection?.isReadOnly && {
label: 'Reload', label: 'Reload',
onClick: () => { onClick: () => {
reloadToken += 1; reloadToken += 1;

View File

@@ -80,16 +80,22 @@ function splitCommandLine(str) {
const driver = { const driver = {
...driverBase, ...driverBase,
analyserClass: Analyser, analyserClass: Analyser,
async connect({ server, port, password, database }) { async connect({ server, port, password, database, useDatabaseUrl, databaseUrl }) {
let db = 0; let db = 0;
let pool;
if (useDatabaseUrl) {
pool = new Redis(databaseUrl);
} 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;
const pool = new Redis({ pool = new Redis({
host: server, host: server,
port, port,
password, password,
db, db,
}); });
}
return pool; return pool;
}, },
// @ts-ignore // @ts-ignore

View File

@@ -26,6 +26,7 @@ const driver = {
databaseEngineTypes: ['keyvalue'], databaseEngineTypes: ['keyvalue'],
supportedCreateDatabase: false, supportedCreateDatabase: false,
getQuerySplitterOptions: () => redisSplitterOptions, getQuerySplitterOptions: () => redisSplitterOptions,
databaseUrlPlaceholder: 'e.g. redis://:authpassword@127.0.0.1:6380/4',
supportedKeyTypes: [ supportedKeyTypes: [
{ {
name: 'string', name: 'string',
@@ -75,7 +76,11 @@ const driver = {
], ],
showConnectionField: (field, values) => { showConnectionField: (field, values) => {
return ['server', 'port', 'password'].includes(field); if (field == 'useDatabaseUrl') return true;
if (values.useDatabaseUrl) {
return ['databaseUrl', 'isReadOnly'].includes(field);
}
return ['server', 'port', 'password', 'isReadOnly'].includes(field);
}, },
}; };