From d31da4a055952ed6fb5ae5e796cbeab291c6b624 Mon Sep 17 00:00:00 2001 From: Lykin <137850705+tiny-craft@users.noreply.github.com> Date: Thu, 14 Dec 2023 16:35:37 +0800 Subject: [PATCH] perf: refresh key summary after crud value content --- backend/services/browser_service.go | 46 +++-- .../content_value/ContentValueHash.vue | 13 +- .../content_value/ContentValueList.vue | 11 +- .../content_value/ContentValueSet.vue | 13 +- .../content_value/ContentValueStream.vue | 12 +- .../content_value/ContentValueString.vue | 1 - .../content_value/ContentValueZSet.vue | 13 +- .../components/dialogs/AddFieldsDialog.vue | 110 +++++++----- .../src/components/dialogs/NewKeyDialog.vue | 6 +- .../src/components/sidebar/BrowserPane.vue | 2 +- .../src/components/sidebar/BrowserTree.vue | 1 + frontend/src/stores/browser.js | 164 ++++++++++++++---- frontend/src/stores/tab.js | 21 ++- 13 files changed, 272 insertions(+), 141 deletions(-) diff --git a/backend/services/browser_service.go b/backend/services/browser_service.go index 9d26af9..50feb11 100644 --- a/backend/services/browser_service.go +++ b/backend/services/browser_service.go @@ -562,47 +562,59 @@ func (b *browserService) GetKeySummary(param types.KeySummaryParam) (resp types. client, ctx := item.client, item.ctx key := strutil.DecodeRedisKey(param.Key) - var keyType string - var dur time.Duration - keyType, err = client.Type(ctx, key).Result() + + pipe := client.Pipeline() + typeVal := pipe.Type(ctx, key) + ttlVal := pipe.TTL(ctx, key) + sizeVal := pipe.MemoryUsage(ctx, key, 0) + _, err = pipe.Exec(ctx) if err != nil { resp.Msg = err.Error() return } - if keyType == "none" { + if typeVal.Err() != nil { + resp.Msg = typeVal.Err().Error() + return + } + data := types.KeySummary{ + Type: strings.ToLower(typeVal.Val()), + Size: sizeVal.Val(), + } + if data.Type == "none" { resp.Msg = "key not exists" return } - var data types.KeySummary - data.Type = strings.ToLower(keyType) - if dur, err = client.TTL(ctx, key).Result(); err != nil { + if ttlVal.Err() != nil { data.TTL = -1 } else { - if dur < 0 { + if ttlVal.Val() < 0 { data.TTL = -1 } else { - data.TTL = int64(dur.Seconds()) + data.TTL = int64(ttlVal.Val().Seconds()) } } - data.Size, _ = client.MemoryUsage(ctx, key, 0).Result() switch data.Type { case "string": - data.Length, _ = client.StrLen(ctx, key).Result() + data.Length, err = client.StrLen(ctx, key).Result() case "list": - data.Length, _ = client.LLen(ctx, key).Result() + data.Length, err = client.LLen(ctx, key).Result() case "hash": - data.Length, _ = client.HLen(ctx, key).Result() + data.Length, err = client.HLen(ctx, key).Result() case "set": - data.Length, _ = client.SCard(ctx, key).Result() + data.Length, err = client.SCard(ctx, key).Result() case "zset": - data.Length, _ = client.ZCard(ctx, key).Result() + data.Length, err = client.ZCard(ctx, key).Result() case "stream": - data.Length, _ = client.XLen(ctx, key).Result() + data.Length, err = client.XLen(ctx, key).Result() default: - resp.Msg = "unknown key type" + err = errors.New("unknown key type") + } + + if err != nil { + resp.Msg = err.Error() return } diff --git a/frontend/src/components/content_value/ContentValueHash.vue b/frontend/src/components/content_value/ContentValueHash.vue index 40fca3d..d2fe5fc 100644 --- a/frontend/src/components/content_value/ContentValueHash.vue +++ b/frontend/src/components/content_value/ContentValueHash.vue @@ -205,12 +205,13 @@ const actionColumn = { onEdit: () => startEdit(index + 1, row.k, row.v), onDelete: async () => { try { - const { removed, success, msg } = await browserStore.removeHashField( - props.name, - props.db, - keyName.value, - row.k, - ) + const { removed, success, msg } = await browserStore.removeHashField({ + server: props.name, + db: props.db, + key: keyName.value, + field: row.k, + reload: false, + }) if (success) { props.value.splice(index, 1) $message.success(i18n.t('dialogue.delete_key_succ', { key: row.k })) diff --git a/frontend/src/components/content_value/ContentValueList.vue b/frontend/src/components/content_value/ContentValueList.vue index 6a370df..584a1a8 100644 --- a/frontend/src/components/content_value/ContentValueList.vue +++ b/frontend/src/components/content_value/ContentValueList.vue @@ -183,14 +183,13 @@ const actionColumn = { }, onDelete: async () => { try { - const { success, msg } = await browserStore.removeListItem( - props.name, - props.db, - keyName.value, + const { success, msg } = await browserStore.removeListItem({ + server: props.name, + db: props.db, + key: keyName.value, index, - ) + }) if (success) { - props.value.splice(index, 1) $message.success(i18n.t('dialogue.delete_key_succ', { key: `#${index + 1}` })) } else { $message.error(msg) diff --git a/frontend/src/components/content_value/ContentValueSet.vue b/frontend/src/components/content_value/ContentValueSet.vue index 8074bdb..716c6c1 100644 --- a/frontend/src/components/content_value/ContentValueSet.vue +++ b/frontend/src/components/content_value/ContentValueSet.vue @@ -180,14 +180,13 @@ const actionColumn = { }, onDelete: async () => { try { - const { success, msg } = await browserStore.removeSetItem( - props.name, - props.db, - keyName.value, - row.v, - ) + const { success, msg } = await browserStore.removeSetItem({ + server: props.name, + db: props.db, + key: keyName.value, + value: row.v, + }) if (success) { - // props.value.splice(index, 1) $message.success(i18n.t('dialogue.delete_key_succ', { key: row.v })) } else { $message.error(msg) diff --git a/frontend/src/components/content_value/ContentValueStream.vue b/frontend/src/components/content_value/ContentValueStream.vue index 0bc2240..d344b68 100644 --- a/frontend/src/components/content_value/ContentValueStream.vue +++ b/frontend/src/components/content_value/ContentValueStream.vue @@ -120,12 +120,12 @@ const actionColumn = { }, onDelete: async () => { try { - const { success, msg } = await browserStore.removeStreamValues( - props.name, - props.db, - keyName.value, - row.id, - ) + const { success, msg } = await browserStore.removeStreamValues({ + server: props.name, + db: props.db, + key: keyName.value, + ids: row.id, + }) if (success) { $message.success(i18n.t('dialogue.delete_key_succ', { key: row.id })) } else { diff --git a/frontend/src/components/content_value/ContentValueString.vue b/frontend/src/components/content_value/ContentValueString.vue index b9a1ba8..64ba1da 100644 --- a/frontend/src/components/content_value/ContentValueString.vue +++ b/frontend/src/components/content_value/ContentValueString.vue @@ -145,7 +145,6 @@ const onSave = async () => { decode: viewAs.decode, }) if (success) { - // await browserStore.loadKeyDetail({ server: props.name, db: props.db, key: keyName.value }) $message.success(i18n.t('interface.save_value_succ')) } else { $message.error(msg) diff --git a/frontend/src/components/content_value/ContentValueZSet.vue b/frontend/src/components/content_value/ContentValueZSet.vue index bbeb2a3..bac9ca9 100644 --- a/frontend/src/components/content_value/ContentValueZSet.vue +++ b/frontend/src/components/content_value/ContentValueZSet.vue @@ -227,14 +227,13 @@ const actionColumn = { onEdit: () => startEdit(index + 1, row.s, row.v), onDelete: async () => { try { - const { success, msg } = await browserStore.removeZSetItem( - props.name, - props.db, - keyName.value, - row.v, - ) + const { success, msg } = await browserStore.removeZSetItem({ + server: props.name, + db: props.db, + key: keyName.value, + value: row.v, + }) if (success) { - // props.value.splice(index, 1) $message.success(i18n.t('dialogue.delete_key_succ', { key: row.v })) } else { $message.error(msg) diff --git a/frontend/src/components/dialogs/AddFieldsDialog.vue b/frontend/src/components/dialogs/AddFieldsDialog.vue index 961ec77..a934efb 100644 --- a/frontend/src/components/dialogs/AddFieldsDialog.vue +++ b/frontend/src/components/dialogs/AddFieldsDialog.vue @@ -9,7 +9,7 @@ import AddListValue from '@/components/new_value/AddListValue.vue' import AddHashValue from '@/components/new_value/AddHashValue.vue' import AddZSetValue from '@/components/new_value/AddZSetValue.vue' import NewStreamValue from '@/components/new_value/NewStreamValue.vue' -import { isEmpty, size, slice } from 'lodash' +import { get, isEmpty, size, slice } from 'lodash' import useBrowserStore from 'stores/browser.js' import useTabStore from 'stores/tab.js' @@ -22,7 +22,7 @@ const newForm = reactive({ type: '', opType: 0, value: null, - reload: true, + reload: false, }) const addValueComponent = { @@ -89,88 +89,102 @@ const onAdd = async () => { value = defaultValue[type] } const keyName = isEmpty(keyCode) ? key : keyCode - let updated = false + let success = false + let msg = '' switch (type) { case types.LIST: { let data if (newForm.opType === 1) { - data = await browserStore.prependListItem({ server, db, key: keyName, values: value }) + data = await browserStore.prependListItem({ + server, + db, + key: keyName, + values: value, + reload: newForm.reload, + }) } else { - data = await browserStore.appendListItem({ server, db, key: keyName, values: value }) - } - const { success, msg } = data - if (success) { - updated = true - $message.success(i18n.t('dialogue.handle_succ')) - } else { - $message.error(msg) + data = await browserStore.appendListItem({ + server, + db, + key: keyName, + values: value, + reload: newForm.reload, + }) } + success = get(data, 'success') + msg = get(data, 'msg') } break case types.HASH: { - const { success, msg } = await browserStore.addHashField(server, db, keyName, newForm.opType, value) - if (success) { - updated = true - $message.success(i18n.t('dialogue.handle_succ')) - } else { - $message.error(msg) - } + const data = await browserStore.addHashField({ + server, + db, + key: keyName, + action: newForm.opType, + fieldItems: value, + reload: newForm.reload, + }) + success = get(data, 'success') + msg = get(data, 'msg') } break case types.SET: { - const { success, msg } = await browserStore.addSetItem(server, db, keyName, value) - if (success) { - updated = true - $message.success(i18n.t('dialogue.handle_succ')) - } else { - $message.error(msg) - } + const data = await browserStore.addSetItem({ + server, + db, + key: keyName, + value, + reload: newForm.reload, + }) + success = get(data, 'success') + msg = get(data, 'msg') } break case types.ZSET: { - const { success, msg } = await browserStore.addZSetItem(server, db, keyName, newForm.opType, value) - if (success) { - updated = true - $message.success(i18n.t('dialogue.handle_succ')) - } else { - $message.error(msg) - } + const data = await browserStore.addZSetItem({ + server, + db, + key: keyName, + action: newForm.opType, + vs: value, + reload: newForm.reload, + }) + success = get(data, 'success') + msg = get(data, 'msg') } break case types.STREAM: { if (size(value) > 2) { - const { success, msg } = await browserStore.addStreamValue( + const data = await browserStore.addStreamValue({ server, db, - keyName, - value[0], - slice(value, 1), - ) - if (success) { - updated = true - $message.success(i18n.t('dialogue.handle_succ')) - } else { - $message.error(msg) - } + key: keyName, + id: value[0], + values: slice(value, 1), + reload: newForm.reload, + }) + success = get(data, 'success') + msg = get(data, 'msg') } } break } - if (updated) { - if (newForm.reload) { - browserStore.reloadKey({ server, db, key: keyName }) - } + if (success) { + $message.success(i18n.t('dialogue.handle_succ')) + } else if (!isEmpty(msg)) { + $message.error(msg) } + dialogStore.closeAddFieldsDialog() } catch (e) { $message.error(e.message) diff --git a/frontend/src/components/dialogs/NewKeyDialog.vue b/frontend/src/components/dialogs/NewKeyDialog.vue index 73e5876..0770ad6 100644 --- a/frontend/src/components/dialogs/NewKeyDialog.vue +++ b/frontend/src/components/dialogs/NewKeyDialog.vue @@ -46,7 +46,7 @@ const options = computed(() => { label: t, })) }) -const addValueComponent = { +const newValueComponent = { [types.STRING]: NewStringValue, [types.HASH]: NewHashValue, [types.LIST]: NewListValue, @@ -136,7 +136,7 @@ const onAdd = async () => { if (success) { // select current key tabStore.setSelectedKeys(server, nodeKey) - browserStore.loadKeySummary({ server, db, key }) + browserStore.loadKeySummary({ server, db, key, clearValue: true }) } else if (!isEmpty(msg)) { $message.error(msg) } @@ -206,7 +206,7 @@ const onClose = () => { - + diff --git a/frontend/src/components/sidebar/BrowserPane.vue b/frontend/src/components/sidebar/BrowserPane.vue index 1cfcc17..3d9b4e8 100644 --- a/frontend/src/components/sidebar/BrowserPane.vue +++ b/frontend/src/components/sidebar/BrowserPane.vue @@ -166,7 +166,7 @@ const handleSelectDB = async (db) => { await browserStore.openDatabase(props.server, db) await nextTick() await connectionStore.saveLastDB(props.server, db) - tabStore.upsertTab({ server: props.server, db }) + tabStore.upsertTab({ server: props.server, db, clearValue: true }) // browserTreeRef.value?.resetExpandKey(props.server, db) fullyLoaded.value = await browserStore.loadMoreKeys(props.server, db) browserTreeRef.value?.refreshTree() diff --git a/frontend/src/components/sidebar/BrowserTree.vue b/frontend/src/components/sidebar/BrowserTree.vue index 48497af..5dfe772 100644 --- a/frontend/src/components/sidebar/BrowserTree.vue +++ b/frontend/src/components/sidebar/BrowserTree.vue @@ -288,6 +288,7 @@ const onUpdateSelectedKeys = (keys, options) => { server: props.server, db, key: redisKey, + clearValue: true, }) } return diff --git a/frontend/src/stores/browser.js b/frontend/src/stores/browser.js index 6fcb392..ed57691 100644 --- a/frontend/src/stores/browser.js +++ b/frontend/src/stores/browser.js @@ -413,9 +413,10 @@ const useBrowserStore = defineStore('browser', { * @param {string} server * @param {number} db * @param {string|number[]} [key] null or blank indicate that update tab to display normal content (blank content or server status) + * @param {boolean} [clearValue] * @return {Promise} */ - async loadKeySummary({ server, db, key }) { + async loadKeySummary({ server, db, key, clearValue }) { try { const tab = useTabStore() if (!isEmpty(key)) { @@ -438,6 +439,7 @@ const useBrowserStore = defineStore('browser', { key: k, size, length, + clearValue, }) return } else { @@ -458,9 +460,9 @@ const useBrowserStore = defineStore('browser', { ttl: -1, key: null, keyCode: null, - value: null, size: 0, length: 0, + clearValue, }) } catch (e) { $message.error('') @@ -511,7 +513,7 @@ const useBrowserStore = defineStore('browser', { const tab = useTabStore() try { tab.updateLoading({ server, db, loading: true }) - await this.loadKeySummary({ server, db, key }) + await this.loadKeySummary({ server, db, key, clearValue: true }) await this.loadKeyDetail({ server, db, key, decode, format, matchPattern, reset: true }) } finally { tab.updateLoading({ server, db, loading: false }) @@ -1065,6 +1067,8 @@ const useBrowserStore = defineStore('browser', { } const tab = useTabStore() tab.updateValue({ server, db, key, value }) + + this.loadKeySummary({ server, db, key }) return { success, nodeKey: `${server}/db${db}#${ConnectionType.RedisValue}/${key}`, @@ -1096,6 +1100,7 @@ const useBrowserStore = defineStore('browser', { * @param {formatTypes} [retFormat] * @param {boolean} [refresh] * @param {number} [index] index for retrieve affect entries quickly + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean, [updated]: {}}>} */ async setHash({ @@ -1110,6 +1115,7 @@ const useBrowserStore = defineStore('browser', { retDecode, retFormat, index, + reload, }) { try { const { data, success, msg } = await SetHashValue({ @@ -1150,6 +1156,12 @@ const useBrowserStore = defineStore('browser', { index: [index], }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success, updated } } else { return { success, msg } @@ -1166,9 +1178,10 @@ const useBrowserStore = defineStore('browser', { * @param {string|number[]} key * @param {number }action 0:ignore duplicated fields 1:overwrite duplicated fields * @param {string[]} fieldItems field1, value1, filed2, value2... + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean, [updated]: [], [added]: []}>} */ - async addHashField(server, db, key, action, fieldItems) { + async addHashField({ server, db, key, action, fieldItems, reload }) { try { const { data, success, msg } = await AddHashField(server, db, key, action, fieldItems) if (success) { @@ -1180,6 +1193,12 @@ const useBrowserStore = defineStore('browser', { if (!isEmpty(added)) { tab.insertValueEntries({ server, db, key, type: 'hash', entries: added }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success, updated, added } } else { return { success: false, msg } @@ -1195,9 +1214,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number[]} key * @param {string} field + * @param {boolean} reload * @returns {Promise<{[msg]: {}, success: boolean, [removed]: string[]}>} */ - async removeHashField(server, db, key, field) { + async removeHashField({ server, db, key, field, reload }) { try { const { data, success, msg } = await SetHashValue({ server, db, key, field, newField: '' }) if (success) { @@ -1206,6 +1226,12 @@ const useBrowserStore = defineStore('browser', { // const tab = useTabStore() // tab.removeValueEntries({ server, db, key, type: 'hash', entries: removed }) // } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success, removed } } else { return { success, msg } @@ -1215,32 +1241,16 @@ const useBrowserStore = defineStore('browser', { } }, - /** - * insert list item - * @param {string} connName - * @param {number} db - * @param {string|number[]} key - * @param {int} action 0: push to head, 1: push to tail - * @param {string[]}values - * @returns {Promise<*|{msg, success: boolean}>} - */ - async addListItem(connName, db, key, action, values) { - try { - return AddListItem(connName, db, key, action, values) - } catch (e) { - return { success: false, msg: e.message } - } - }, - /** * prepend item to head of list * @param {string} server * @param {number} db * @param {string|number[]} key * @param {string[]} values + * @param {boolean} reload * @returns {Promise<{[msg]: string, success: boolean, [item]: []}>} */ - async prependListItem({ server, db, key, values }) { + async prependListItem({ server, db, key, values, reload }) { try { const { data, success, msg } = await AddListItem(server, db, key, 0, values) if (success) { @@ -1255,6 +1265,12 @@ const useBrowserStore = defineStore('browser', { entries: left, prepend: true, }) + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } } return { success, item: left } } else { @@ -1271,9 +1287,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number[]} key * @param {string[]} values + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean, [item]: any[]}>} */ - async appendListItem({ server, db, key, values }) { + async appendListItem({ server, db, key, values, reload }) { try { const { data, success, msg } = await AddListItem(server, db, key, 1, values) if (success) { @@ -1289,6 +1306,12 @@ const useBrowserStore = defineStore('browser', { entries: right, prepend: false, }) + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } } return { success, item: right } } else { @@ -1310,6 +1333,7 @@ const useBrowserStore = defineStore('browser', { * @param {formatTypes} format * @param {decodeTypes} [retDecode] * @param {formatTypes} [retFormat] + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ async updateListItem({ @@ -1322,6 +1346,7 @@ const useBrowserStore = defineStore('browser', { format = formatTypes.RAW, retDecode, retFormat, + reload, }) { try { const { data, success, msg } = await SetListItem({ @@ -1358,6 +1383,12 @@ const useBrowserStore = defineStore('browser', { entries: removedIndex, }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success, msg } @@ -1373,9 +1404,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number[]} key * @param {number} index + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean, [removed]: string[]}>} */ - async removeListItem(server, db, key, index) { + async removeListItem({ server, db, key, index, reload }) { try { const { data, success, msg } = await SetListItem({ server, db, key, index }) if (success) { @@ -1390,6 +1422,12 @@ const useBrowserStore = defineStore('browser', { type: 'list', entries: removedIndexes, }) + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } } return { success, removed } } else { @@ -1406,9 +1444,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number} key * @param {string|string[]} value + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ - async addSetItem(server, db, key, value) { + async addSetItem({ server, db, key, value, reload }) { try { if ((!value) instanceof Array) { value = [value] @@ -1420,6 +1459,12 @@ const useBrowserStore = defineStore('browser', { const tab = useTabStore() tab.insertValueEntries({ server, db, key, type: 'set', entries: added }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success, msg } @@ -1440,6 +1485,7 @@ const useBrowserStore = defineStore('browser', { * @param {formatTypes} [format] * @param {decodeTypes} [retDecode] * @param {formatTypes} [retFormat] + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ async updateSetItem({ @@ -1452,6 +1498,7 @@ const useBrowserStore = defineStore('browser', { format = formatTypes.RAW, retDecode, retFormat, + reload, }) { try { const { data, success, msg } = await UpdateSetItem({ @@ -1475,6 +1522,12 @@ const useBrowserStore = defineStore('browser', { if (!isEmpty(added)) { tab.insertValueEntries({ server, db, key, type: 'set', entries: added }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success: false, msg } @@ -1490,9 +1543,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number[]} key * @param {string} value + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ - async removeSetItem(server, db, key, value) { + async removeSetItem({ server, db, key, value, reload }) { try { const { data, success, msg } = await SetSetItem(server, db, key, true, [value]) if (success) { @@ -1502,6 +1556,12 @@ const useBrowserStore = defineStore('browser', { const removedValues = map(removed, 'v') tab.removeValueEntries({ server, db, key, type: 'set', entries: removedValues }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success, msg } @@ -1518,9 +1578,10 @@ const useBrowserStore = defineStore('browser', { * @param {string|number[]} key * @param {number} action * @param {Object.} vs value: score + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ - async addZSetItem(server, db, key, action, vs) { + async addZSetItem({ server, db, key, action, vs, reload }) { try { const { data, success, msg } = await AddZSetValue(server, db, key, action, vs) if (success) { @@ -1532,6 +1593,12 @@ const useBrowserStore = defineStore('browser', { if (!isEmpty(updated)) { tab.updateValueEntries({ server, db, key, type: 'zset', entries: updated }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success, msg } @@ -1554,6 +1621,7 @@ const useBrowserStore = defineStore('browser', { * @param {decodeTypes} [retDecode] * @param {formatTypes} [retFormat] * @param {number} [index] index for retrieve affect entries quickly + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ async updateZSetItem({ @@ -1568,6 +1636,7 @@ const useBrowserStore = defineStore('browser', { retDecode, retFormat, index, + reload, }) { try { const { data, success, msg } = await UpdateZSetValue({ @@ -1598,6 +1667,12 @@ const useBrowserStore = defineStore('browser', { if (!isEmpty(replaced)) { tab.replaceValueEntries({ server, db, key, type: 'zset', entries: replaced, index: [index] }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success, updated, removed } } else { return { success, msg } @@ -1613,9 +1688,10 @@ const useBrowserStore = defineStore('browser', { * @param {number} db * @param {string|number[]} key * @param {string} value + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean, [removed]: []}>} */ - async removeZSetItem(server, db, key, value) { + async removeZSetItem({ server, db, key, value, reload }) { try { const { data, success, msg } = await UpdateZSetValue({ server, db, key, value, newValue: '', score: 0 }) if (success) { @@ -1625,6 +1701,12 @@ const useBrowserStore = defineStore('browser', { const removeValues = map(removed, 'v') tab.removeValueEntries({ server, db, key, type: 'zset', entries: removeValues }) } + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success, removed } } else { return { success, msg } @@ -1641,9 +1723,10 @@ const useBrowserStore = defineStore('browser', { * @param {string|number[]} key * @param {string} id * @param {string[]} values field1, value1, filed2, value2... + * @param {boolean} [reload] * @returns {Promise<{[msg]: string, success: boolean}>} */ - async addStreamValue(server, db, key, id, values) { + async addStreamValue({ server, db, key, id, values, reload }) { try { const { data = {}, success, msg } = await AddStreamValue(server, db, key, id, values) if (success) { @@ -1657,6 +1740,12 @@ const useBrowserStore = defineStore('browser', { type: 'stream', entries: added, }) + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } } return { success } } else { @@ -1669,21 +1758,28 @@ const useBrowserStore = defineStore('browser', { /** * remove stream field - * @param {string} connName + * @param {string} server * @param {number} db * @param {string|number[]} key * @param {string[]|string} ids + * @param {boolean} [reload] * @returns {Promise<{[msg]: {}, success: boolean}>} */ - async removeStreamValues(connName, db, key, ids) { + async removeStreamValues({ server, db, key, ids, reload }) { if (typeof ids === 'string') { ids = [ids] } try { - const { data = {}, success, msg } = await RemoveStreamValues(connName, db, key, ids) + const { data = {}, success, msg } = await RemoveStreamValues(server, db, key, ids) if (success) { const tab = useTabStore() - tab.removeValueEntries({ server: connName, db, key, type: 'stream', entries: ids }) + tab.removeValueEntries({ server, db, key, type: 'stream', entries: ids }) + if (reload === true) { + this.reloadKey({ server, db, key }) + } else { + // reload summary only + this.loadKeySummary({ server, db, key }) + } return { success } } else { return { success, msg } diff --git a/frontend/src/stores/tab.js b/frontend/src/stores/tab.js index e5d8a4e..d962d78 100644 --- a/frontend/src/stores/tab.js +++ b/frontend/src/stores/tab.js @@ -162,7 +162,7 @@ const useTabStore = defineStore('tab', { }, openBlank(server) { - this.upsertTab({ server }) + this.upsertTab({ server, clearValue: true }) }, /** @@ -177,9 +177,10 @@ const useTabStore = defineStore('tab', { * @param {number} [size] * @param {number} [length] * @param {string} [matchPattern] + * @param {boolean} [clearValue] * @param {*} [value] */ - upsertTab({ subTab, server, db, type, ttl, key, keyCode, size, length, matchPattern = '' }) { + upsertTab({ subTab, server, db, type, ttl, key, keyCode, size, length, matchPattern = '', clearValue }) { let tabIndex = findIndex(this.tabList, { name: server }) if (tabIndex === -1) { this.tabList.push({ @@ -213,7 +214,9 @@ const useTabStore = defineStore('tab', { tab.size = size tab.length = length tab.matchPattern = matchPattern - tab.value = undefined + if (clearValue === true) { + tab.value = undefined + } } this._setActivatedIndex(tabIndex, true, subTab) // this.activatedTab = tab.name @@ -224,14 +227,16 @@ const useTabStore = defineStore('tab', { * @param {string} server * @param {number} db * @param {string} key - * @param {*} value + * @param {*} [value] * @param {string} [format] * @param {string] [decode] * @param {string} [matchPattern] * @param {boolean} [reset] * @param {boolean} [end] keep end status if not set + * @param {number} [size] + * @param {number} [length] */ - updateValue({ server, db, key, value, format, decode, matchPattern, reset, end }) { + updateValue({ server, db, key, value, format, decode, matchPattern, reset, end, size = -1, length = -1 }) { const tabData = find(this.tabList, { name: server, db, key }) if (tabData == null) { return @@ -240,6 +245,12 @@ const useTabStore = defineStore('tab', { tabData.format = format || tabData.format tabData.decode = decode || tabData.decode tabData.matchPattern = matchPattern || '' + if (size >= 0) { + tabData.size = size + } + if (length >= 0) { + tabData.length = length + } if (typeof end === 'boolean') { tabData.end = end }