diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 21cd3efc2..871e6da1d 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -396,17 +396,17 @@ functionName: 'tableReader', }, hasPermission('dbops/model/edit') && { - label: _t('dbObject.dropCollection', { defaultMessage: 'Drop collection/container'}), + label: _t('dbObject.dropCollection', { defaultMessage: 'Drop collection/container' }), isDropCollection: true, requiresWriteAccess: true, }, hasPermission('dbops/table/rename') && { - label: _t('dbObject.renameCollection', { defaultMessage: 'Rename collection/container'}), + label: _t('dbObject.renameCollection', { defaultMessage: 'Rename collection/container' }), isRenameCollection: true, requiresWriteAccess: true, }, hasPermission('dbops/table/backup') && { - label: _t('dbObject.createCollectionBackup', { defaultMessage: 'Create collection/container backup'}), + label: _t('dbObject.createCollectionBackup', { defaultMessage: 'Create collection/container backup' }), isDuplicateCollection: true, requiresWriteAccess: true, }, @@ -590,7 +590,10 @@ }); } else if (menu.isDropCollection) { showModal(ConfirmModal, { - message: _t('dbObject.confirmDropCollection', { defaultMessage: 'Really drop collection {name}?', values: { name: data.pureName } }), + message: _t('dbObject.confirmDropCollection', { + defaultMessage: 'Really drop collection {name}?', + values: { name: data.pureName }, + }), onConfirm: async () => { const dbid = _.pick(data, ['conid', 'database']); runOperationOnDatabase(dbid, { @@ -621,7 +624,10 @@ const driver = await getDriver(); showModal(ConfirmModal, { - message: _t('dbObject.confirmCloneCollection', { defaultMessage: 'Really create collection/container copy named {name}?', values: { name: newName } }), + message: _t('dbObject.confirmCloneCollection', { + defaultMessage: 'Really create collection/container copy named {name}?', + values: { name: newName }, + }), onConfirm: async () => { const dbid = _.pick(data, ['conid', 'database']); runOperationOnDatabase(dbid, { @@ -721,9 +727,7 @@ if (!item.submenu) { if (!item) return item; - return {...item, - label: _tval(item.label) - }; + return { ...item, label: _tval(item.label) }; } return { ...item, @@ -773,7 +777,9 @@ openNewTab( { // title: getObjectTitle(connection, schemaName, pureName), - title: tabComponent ? getObjectTitle(connection, schemaName, pureName) : _t('dbObject.query', { defaultMessage: 'Query #' }), + title: tabComponent + ? getObjectTitle(connection, schemaName, pureName) + : _t('dbObject.query', { defaultMessage: 'Query #' }), focused: tabComponent == null, tooltip, icon: @@ -1040,6 +1046,7 @@ import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate'; import { getBoolSettingsValue, getOpenDetailOnArrowsSettings } from '../settings/settingsTools'; import { isProApp } from '../utility/proTools'; + import formatFileSize from '../utility/formatFileSize'; export let data; export let passProps; @@ -1068,6 +1075,9 @@ if (data.tableRowCount != null) { res.push(`${formatRowCount(data.tableRowCount)} rows`); } + if (data.sizeBytes) { + res.push(formatFileSize(data.sizeBytes)); + } if (data.tableEngine) { res.push(data.tableEngine); } diff --git a/plugins/dbgate-plugin-mysql/src/backend/sql/tableModifications.js b/plugins/dbgate-plugin-mysql/src/backend/sql/tableModifications.js index 3925a298f..a6d3c9fa1 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/sql/tableModifications.js +++ b/plugins/dbgate-plugin-mysql/src/backend/sql/tableModifications.js @@ -3,6 +3,7 @@ select TABLE_NAME as pureName, TABLE_TYPE as objectType, TABLE_ROWS as tableRowCount, + DATA_LENGTH + INDEX_LENGTH as sizeBytes, case when ENGINE='InnoDB' then CREATE_TIME else coalesce(UPDATE_TIME, CREATE_TIME) end as modifyDate from information_schema.tables where TABLE_SCHEMA = '#DATABASE#' diff --git a/plugins/dbgate-plugin-mysql/src/backend/sql/tables.js b/plugins/dbgate-plugin-mysql/src/backend/sql/tables.js index 216e8c43b..e88946f12 100644 --- a/plugins/dbgate-plugin-mysql/src/backend/sql/tables.js +++ b/plugins/dbgate-plugin-mysql/src/backend/sql/tables.js @@ -4,6 +4,7 @@ select TABLE_ROWS as tableRowCount, ENGINE as tableEngine, TABLE_COMMENT as objectComment, + DATA_LENGTH + INDEX_LENGTH as sizeBytes, case when ENGINE='InnoDB' then CREATE_TIME else coalesce(UPDATE_TIME, CREATE_TIME) end as modifyDate from information_schema.tables where TABLE_SCHEMA = '#DATABASE#' and (TABLE_TYPE='BASE TABLE' or TABLE_TYPE='SYSTEM VERSIONED') and TABLE_NAME =OBJECT_ID_CONDITION; diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index b41da63ee..dfb24af3a 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -255,6 +255,7 @@ class Analyser extends DatabaseAnalyser { const newTable = { pureName: table.pure_name, schemaName: table.schema_name, + sizeBytes: table.size_bytes, objectId: `tables:${table.schema_name}.${table.pure_name}`, contentHash: table.hash_code_columns ? `${table.hash_code_columns}-${table.hash_code_constraints}` : null, }; @@ -410,6 +411,7 @@ class Analyser extends DatabaseAnalyser { objectId: `tables:${x.schema_name}.${x.pure_name}`, pureName: x.pure_name, schemaName: x.schema_name, + sizeBytes: x.size_bytes, contentHash: `${x.hash_code_columns}-${x.hash_code_constraints}`, })) : null, diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js b/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js index 9e9f2b735..37b004655 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/tableList.js @@ -1,5 +1,6 @@ module.exports = ` -select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name" +select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_name", + pg_relation_size('"'||infoTables.table_schema||'"."'||infoTables.table_name||'"') as "size_bytes" from information_schema.tables infoTables where infoTables.table_type not like '%VIEW%' and ('tables:' || infoTables.table_schema || '.' || infoTables.table_name) =OBJECT_ID_CONDITION diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js b/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js index dc7f526ce..8d87142d0 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/tableModifications.js @@ -16,7 +16,8 @@ select infoTables.table_schema as "schema_name", infoTables.table_name as "pure_ )) as "hash_code_constraints" from information_schema.table_constraints infoConstraints where infoConstraints.table_schema = infoTables.table_schema and infoConstraints.table_name = infoTables.table_name - ) + ), + pg_relation_size('"'||infoTables.table_schema||'"."'||infoTables.table_name||'"') as "size_bytes" from information_schema.tables infoTables where infoTables.table_type not like '%VIEW%'