mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-24 07:15:58 +00:00
redis: support for redis streams
This commit is contained in:
@@ -167,6 +167,11 @@
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (data.errorMessage) {
|
||||||
|
showSnackbarError(data.errorMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newQuery({
|
newQuery({
|
||||||
title: 'Export #',
|
title: 'Export #',
|
||||||
initialData: data,
|
initialData: data,
|
||||||
@@ -252,7 +257,7 @@
|
|||||||
import getElectron from '../utility/getElectron';
|
import getElectron from '../utility/getElectron';
|
||||||
import openNewTab from '../utility/openNewTab';
|
import openNewTab from '../utility/openNewTab';
|
||||||
import AppObjectCore from './AppObjectCore.svelte';
|
import AppObjectCore from './AppObjectCore.svelte';
|
||||||
import { showSnackbarSuccess } from '../utility/snackbar';
|
import { showSnackbarError, showSnackbarSuccess } from '../utility/snackbar';
|
||||||
import { findEngineDriver } from 'dbgate-tools';
|
import { findEngineDriver } from 'dbgate-tools';
|
||||||
import InputTextModal from '../modals/InputTextModal.svelte';
|
import InputTextModal from '../modals/InputTextModal.svelte';
|
||||||
import { getDatabaseInfo, useUsedApps } from '../utility/metadataLoaders';
|
import { getDatabaseInfo, useUsedApps } from '../utility/metadataLoaders';
|
||||||
|
|||||||
@@ -13,8 +13,9 @@
|
|||||||
let item = {};
|
let item = {};
|
||||||
|
|
||||||
const handleSubmit = async () => {
|
const handleSubmit = async () => {
|
||||||
|
if (await onConfirm(item)) {
|
||||||
closeCurrentModal();
|
closeCurrentModal();
|
||||||
onConfirm(item);
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import DbKeyItemDetail from '../dbkeyvalue/DbKeyItemDetail.svelte';
|
import DbKeyItemDetail from '../dbkeyvalue/DbKeyItemDetail.svelte';
|
||||||
import DbKeyAddItemModal from '../modals/DbKeyAddItemModal.svelte';
|
import DbKeyAddItemModal from '../modals/DbKeyAddItemModal.svelte';
|
||||||
|
import ErrorMessageModal from '../modals/ErrorMessageModal.svelte';
|
||||||
|
|
||||||
export let conid;
|
export let conid;
|
||||||
export let database;
|
export let database;
|
||||||
@@ -86,13 +87,18 @@
|
|||||||
showModal(DbKeyAddItemModal, {
|
showModal(DbKeyAddItemModal, {
|
||||||
keyInfo,
|
keyInfo,
|
||||||
onConfirm: async row => {
|
onConfirm: async row => {
|
||||||
await apiCall('database-connections/call-method', {
|
const res = await apiCall('database-connections/call-method', {
|
||||||
conid,
|
conid,
|
||||||
database,
|
database,
|
||||||
method: keyInfo.keyType.addMethod,
|
method: keyInfo.keyType.addMethod,
|
||||||
args: [keyInfo.key, ...keyInfo.keyType.dbKeyFields.map(col => row[col.name])],
|
args: [keyInfo.key, ...keyInfo.keyType.dbKeyFields.map(col => row[col.name])],
|
||||||
});
|
});
|
||||||
|
if (res.errorMessage) {
|
||||||
|
showModal(ErrorMessageModal, { message: res.errorMessage });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
refresh();
|
refresh();
|
||||||
|
return true;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,13 @@
|
|||||||
import { plusExpandIcon } from '../icons/expandIcons';
|
import { plusExpandIcon } from '../icons/expandIcons';
|
||||||
import FontIcon from '../icons/FontIcon.svelte';
|
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 openNewTab from '../utility/openNewTab';
|
import openNewTab from '../utility/openNewTab';
|
||||||
|
import { showSnackbarError } from '../utility/snackbar';
|
||||||
|
|
||||||
import DbKeysSubTree from './DbKeysSubTree.svelte';
|
import DbKeysSubTree from './DbKeysSubTree.svelte';
|
||||||
|
|
||||||
@@ -111,6 +112,11 @@ import InputTextModal from '../modals/InputTextModal.svelte';
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (data.errorMessage) {
|
||||||
|
showSnackbarError(data.errorMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newQuery({
|
newQuery({
|
||||||
title: 'Export #',
|
title: 'Export #',
|
||||||
initialData: data,
|
initialData: data,
|
||||||
|
|||||||
@@ -297,6 +297,14 @@ const driver = {
|
|||||||
switch (method) {
|
switch (method) {
|
||||||
case 'mdel':
|
case 'mdel':
|
||||||
return await this.deleteBranch(pool, args[0]);
|
return await this.deleteBranch(pool, args[0]);
|
||||||
|
case 'xaddjson':
|
||||||
|
let json;
|
||||||
|
try {
|
||||||
|
json = JSON.parse(args[2]);
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error('Value must be valid JSON. ' + e.message);
|
||||||
|
}
|
||||||
|
return await pool.xadd(args[0], args[1] || '*', ..._.flatten(_.toPairs(json)));
|
||||||
}
|
}
|
||||||
return await pool[method](...args);
|
return await pool[method](...args);
|
||||||
},
|
},
|
||||||
@@ -332,6 +340,22 @@ const driver = {
|
|||||||
items: _.chunk(res[1], 2).map((item) => ({ key: item[0], value: item[1] })),
|
items: _.chunk(res[1], 2).map((item) => ({ key: item[0], value: item[1] })),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
case 'stream': {
|
||||||
|
const res = await pool.xrange(key, cursor == 0 ? '-' : cursor, '+', 'COUNT', count);
|
||||||
|
let newCursor = 0;
|
||||||
|
if (res.length > 0) {
|
||||||
|
const id = res[res.length - 1][0];
|
||||||
|
const idParts = id.split('-');
|
||||||
|
newCursor = `${idParts[0]}-${parseInt(idParts[1] + 1)}`;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
cursor: newCursor,
|
||||||
|
items: res.map(([id, vals]) => ({
|
||||||
|
id,
|
||||||
|
value: JSON.stringify(_.fromPairs(_.chunk(vals, 2)), undefined, 2),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -64,6 +64,14 @@ const driver = {
|
|||||||
addMethod: 'hset',
|
addMethod: 'hset',
|
||||||
showItemList: true,
|
showItemList: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'stream',
|
||||||
|
label: 'Stream',
|
||||||
|
dbKeyFields: [{ name: 'id' }, { name: 'value' }],
|
||||||
|
keyColumn: 'id',
|
||||||
|
addMethod: 'xaddjson',
|
||||||
|
showItemList: true,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
showConnectionField: (field, values) => {
|
showConnectionField: (field, values) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user