From 6365e075349e00caa1454cce862e918f2069878f Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Fri, 25 Oct 2024 18:30:34 +0200 Subject: [PATCH 1/2] feat(MySQL): check constraints management support --- src/common/customizations/defaults.ts | 1 + src/common/customizations/mysql.ts | 1 + src/common/interfaces/antares.ts | 13 + src/common/interfaces/customizations.ts | 1 + src/main/ipc-handlers/tables.ts | 13 + src/main/libs/clients/BaseClient.ts | 4 + src/main/libs/clients/MySQLClient.ts | 63 +- src/main/libs/clients/PostgreSQLClient.ts | 2 + .../components/WorkspaceTabNewTable.vue | 43 +- .../components/WorkspaceTabPropsTable.vue | 93 +- .../WorkspaceTabPropsTableChecksModal.vue | 268 ++++ src/renderer/i18n/en-US.ts | 5 + src/renderer/i18n/ru-RU.ts | 1150 ++++++++--------- src/renderer/ipc-api/Tables.ts | 4 + src/renderer/stores/console.ts | 2 +- 15 files changed, 1081 insertions(+), 582 deletions(-) create mode 100644 src/renderer/components/WorkspaceTabPropsTableChecksModal.vue diff --git a/src/common/customizations/defaults.ts b/src/common/customizations/defaults.ts index f6943ef2..0bc3ae4f 100644 --- a/src/common/customizations/defaults.ts +++ b/src/common/customizations/defaults.ts @@ -55,6 +55,7 @@ export const defaults: Customizations = { tableArray: false, tableRealCount: false, tableDuplicate: false, + tableCheck: false, viewSettings: false, triggerSettings: false, triggerFunctionSettings: false, diff --git a/src/common/customizations/mysql.ts b/src/common/customizations/mysql.ts index 01e61679..08b6ebf4 100644 --- a/src/common/customizations/mysql.ts +++ b/src/common/customizations/mysql.ts @@ -47,6 +47,7 @@ export const customizations: Customizations = { tableTruncateDisableFKCheck: true, tableDuplicate: true, tableDdl: true, + tableCheck: true, viewAdd: true, triggerAdd: true, routineAdd: true, diff --git a/src/common/interfaces/antares.ts b/src/common/interfaces/antares.ts index 59a93f19..4ec95939 100644 --- a/src/common/interfaces/antares.ts +++ b/src/common/interfaces/antares.ts @@ -159,6 +159,13 @@ export interface TableForeign { oldName?: string; } +export interface TableCheck { + // eslint-disable-next-line camelcase + _antares_id?: string; + name: string; + clause: string; +} + export interface CreateTableParams { /** Connection UID */ uid?: string; @@ -166,6 +173,7 @@ export interface CreateTableParams { fields: TableField[]; foreigns: TableForeign[]; indexes: TableIndex[]; + checks: TableCheck[]; options: TableOptions; } @@ -193,6 +201,11 @@ export interface AlterTableParams { changes: TableForeign[]; deletions: TableForeign[]; }; + checkChanges: { + additions: TableCheck[]; + changes: TableCheck[]; + deletions: TableCheck[]; + }; options: TableOptions; } diff --git a/src/common/interfaces/customizations.ts b/src/common/interfaces/customizations.ts index 49d253c4..24e9173a 100644 --- a/src/common/interfaces/customizations.ts +++ b/src/common/interfaces/customizations.ts @@ -43,6 +43,7 @@ export interface Customizations { tableArray?: boolean; tableRealCount?: boolean; tableTruncateDisableFKCheck?: boolean; + tableCheck?: boolean; tableDdl?: boolean; viewAdd?: boolean; viewSettings?: boolean; diff --git a/src/main/ipc-handlers/tables.ts b/src/main/ipc-handlers/tables.ts index c0412c8d..a05d2ee4 100644 --- a/src/main/ipc-handlers/tables.ts +++ b/src/main/ipc-handlers/tables.ts @@ -87,6 +87,19 @@ export default (connections: Record) => { } }); + ipcMain.handle('get-table-checks', async (event, params) => { + if (!validateSender(event.senderFrame)) return { status: 'error', response: 'Unauthorized process' }; + + try { + const result = await connections[params.uid].getTableChecks(params); + + return { status: 'success', response: result }; + } + catch (err) { + return { status: 'error', response: err.toString() }; + } + }); + ipcMain.handle('get-table-ddl', async (event, params) => { if (!validateSender(event.senderFrame)) return { status: 'error', response: 'Unauthorized process' }; diff --git a/src/main/libs/clients/BaseClient.ts b/src/main/libs/clients/BaseClient.ts index 244b4ed3..e0426dda 100644 --- a/src/main/libs/clients/BaseClient.ts +++ b/src/main/libs/clients/BaseClient.ts @@ -189,6 +189,10 @@ export abstract class BaseClient { throw new Error('Method "dropSchema" not implemented'); } + getTableChecks (...args: any) { + throw new Error('Method "getTableDll" not implemented'); + } + getTableDll (...args: any) { throw new Error('Method "getTableDll" not implemented'); } diff --git a/src/main/libs/clients/MySQLClient.ts b/src/main/libs/clients/MySQLClient.ts index 86072f69..9d9a8a9a 100644 --- a/src/main/libs/clients/MySQLClient.ts +++ b/src/main/libs/clients/MySQLClient.ts @@ -161,6 +161,8 @@ export class MySQLClient extends BaseClient { this._ssh = new SSH2Promise({ ...this._params.ssh, + reconnect: true, + reconnectTries: 3, debug: process.env.NODE_ENV !== 'production' ? (s) => console.log(s) : null }); @@ -689,6 +691,34 @@ export class MySQLClient extends BaseClient { return rows.length ? rows[0].count : 0; } + async getTableChecks ({ schema, table }: { schema: string; table: string }): Promise { + const { rows } = await this.raw(` + SELECT + CONSTRAINT_NAME as name, + CHECK_CLAUSE as clausole + FROM information_schema.CHECK_CONSTRAINTS + WHERE CONSTRAINT_SCHEMA = "${schema}" + AND CONSTRAINT_NAME IN ( + SELECT + CONSTRAINT_NAME + FROM + information_schema.TABLE_CONSTRAINTS + WHERE + TABLE_SCHEMA = "${schema}" + AND TABLE_NAME = "${table}" + AND CONSTRAINT_TYPE = 'CHECK' + ) + `); + + if (rows.length) { + return rows.map(row => ({ + name: row.name, + clause: row.clausole + })); + } + return []; + } + async getTableOptions ({ schema, table }: { schema: string; table: string }) { /* eslint-disable camelcase */ interface TableOptionsResult { @@ -865,11 +895,13 @@ export class MySQLClient extends BaseClient { fields, foreigns, indexes, + checks, options } = params; const newColumns: string[] = []; const newIndexes: string[] = []; const newForeigns: string[] = []; + const newChecks: string[] = []; let sql = `CREATE TABLE \`${schema}\`.\`${options.name}\``; @@ -910,7 +942,13 @@ export class MySQLClient extends BaseClient { newForeigns.push(`CONSTRAINT \`${foreign.constraintName}\` FOREIGN KEY (\`${foreign.field}\`) REFERENCES \`${foreign.refTable}\` (\`${foreign.refField}\`) ON UPDATE ${foreign.onUpdate} ON DELETE ${foreign.onDelete}`); }); - sql = `${sql} (${[...newColumns, ...newIndexes, ...newForeigns].join(', ')}) COMMENT='${options.comment}', COLLATE='${options.collation}', ENGINE=${options.engine}`; + // ADD TABLE CHECKS + checks.forEach(check => { + if (!check.clause.trim().length) return; + newChecks.push(`${check.name ? `CONSTRAINT \`${check.name}\` ` : ''}CHECK (${check.clause})`); + }); + + sql = `${sql} (${[...newColumns, ...newIndexes, ...newForeigns, ...newChecks].join(', ')}) COMMENT='${options.comment}', COLLATE='${options.collation}', ENGINE=${options.engine}`; return await this.raw(sql); } @@ -924,6 +962,7 @@ export class MySQLClient extends BaseClient { changes, indexChanges, foreignChanges, + checkChanges, options } = params; @@ -931,6 +970,7 @@ export class MySQLClient extends BaseClient { const alterColumnsAdd: string[] = []; const alterColumnsChange: string[] = []; const alterColumnsDrop: string[] = []; + const alterQueryes: string[] = []; // OPTIONS if ('comment' in options) alterColumnsChange.push(`COMMENT='${options.comment}'`); @@ -976,6 +1016,12 @@ export class MySQLClient extends BaseClient { alterColumnsAdd.push(`ADD CONSTRAINT \`${addition.constraintName}\` FOREIGN KEY (\`${addition.field}\`) REFERENCES \`${addition.refTable}\` (\`${addition.refField}\`) ON UPDATE ${addition.onUpdate} ON DELETE ${addition.onDelete}`); }); + // ADD TABLE CHECKS + checkChanges.additions.forEach(addition => { + if (!addition.clause.trim().length) return; + alterColumnsAdd.push(`ADD ${addition.name ? `CONSTRAINT \`${addition.name}\` ` : ''}CHECK (${addition.clause})`); + }); + // CHANGE FIELDS changes.forEach(change => { const typeInfo = this.getTypeInfo(change.type); @@ -987,9 +1033,9 @@ export class MySQLClient extends BaseClient { ${change.zerofill ? 'ZEROFILL' : ''} ${change.nullable ? 'NULL' : 'NOT NULL'} ${change.autoIncrement ? 'AUTO_INCREMENT' : ''} + ${change.collation ? `COLLATE ${change.collation}` : ''} ${change.default !== null ? `DEFAULT ${change.default || '\'\''}` : ''} ${change.comment ? `COMMENT '${change.comment}'` : ''} - ${change.collation ? `COLLATE ${change.collation}` : ''} ${change.onUpdate ? `ON UPDATE ${change.onUpdate}` : ''} ${change.after ? `AFTER \`${change.after}\`` : 'FIRST'}`); }); @@ -1020,6 +1066,13 @@ export class MySQLClient extends BaseClient { alterColumnsChange.push(`ADD CONSTRAINT \`${change.constraintName}\` FOREIGN KEY (\`${change.field}\`) REFERENCES \`${change.refTable}\` (\`${change.refField}\`) ON UPDATE ${change.onUpdate} ON DELETE ${change.onDelete}`); }); + // CHANGE CHECK TABLE + checkChanges.changes.forEach(change => { + if (!change.clause.trim().length) return; + alterQueryes.push(`${sql} DROP CONSTRAINT \`${change.name}\``); + alterQueryes.push(`${sql} ADD ${change.name ? `CONSTRAINT \`${change.name}\` ` : ''}CHECK (${change.clause})`); + }); + // DROP FIELDS deletions.forEach(deletion => { alterColumnsDrop.push(`DROP COLUMN \`${deletion.name}\``); @@ -1038,7 +1091,11 @@ export class MySQLClient extends BaseClient { alterColumnsDrop.push(`DROP FOREIGN KEY \`${deletion.constraintName}\``); }); - const alterQueryes = []; + // DROP CHECK TABLE + checkChanges.deletions.forEach(deletion => { + alterQueryes.push(`${sql} DROP CONSTRAINT \`${deletion.name}\``); + }); + if (alterColumnsAdd.length) alterQueryes.push(sql+alterColumnsAdd.join(', ')); if (alterColumnsChange.length) alterQueryes.push(sql+alterColumnsChange.join(', ')); if (alterColumnsDrop.length) alterQueryes.push(sql+alterColumnsDrop.join(', ')); diff --git a/src/main/libs/clients/PostgreSQLClient.ts b/src/main/libs/clients/PostgreSQLClient.ts index 08ffd238..4c83256a 100644 --- a/src/main/libs/clients/PostgreSQLClient.ts +++ b/src/main/libs/clients/PostgreSQLClient.ts @@ -168,6 +168,8 @@ export class PostgreSQLClient extends BaseClient { try { this._ssh = new SSH2Promise({ ...this._params.ssh, + reconnect: true, + reconnectTries: 3, debug: process.env.NODE_ENV !== 'production' ? (s) => console.log(s) : null }); diff --git a/src/renderer/components/WorkspaceTabNewTable.vue b/src/renderer/components/WorkspaceTabNewTable.vue index 9449f833..1b512f99 100644 --- a/src/renderer/components/WorkspaceTabNewTable.vue +++ b/src/renderer/components/WorkspaceTabNewTable.vue @@ -72,6 +72,19 @@ /> {{ t('database.foreignKeys') }} +
@@ -183,11 +196,19 @@ @hide="hideForeignModal" @foreigns-update="foreignsUpdate" /> +
+ + diff --git a/src/renderer/i18n/en-US.ts b/src/renderer/i18n/en-US.ts index 0b7003ef..3eefdd7d 100644 --- a/src/renderer/i18n/en-US.ts +++ b/src/renderer/i18n/en-US.ts @@ -126,6 +126,7 @@ export const enUS = { insert: 'Insert', indexes: 'Indexes', foreignKeys: 'Foreign keys', + tableChecks: 'Table checks', length: 'Length', unsigned: 'Unsigned', default: 'Default', @@ -190,12 +191,15 @@ export const enUS = { addNewField: 'Add new field', manageIndexes: 'Manage indexes', manageForeignKeys: 'Manage foreign keys', + manageTableChecks: 'Manage table checks', allowNull: 'Allow NULL', zeroFill: 'Zero fill', customValue: 'Custom value', onUpdate: 'On update', deleteField: 'Delete field', createNewIndex: 'Create new index', + createNewCheck: 'Create new check', + checkClause: 'Check clause', addToIndex: 'Add to index', createNewTable: 'Create new table', emptyTable: 'Empty table', @@ -205,6 +209,7 @@ export const enUS = { emptyConfirm: 'Do you confirm to empty', thereAreNoIndexes: 'There are no indexes', thereAreNoForeign: 'There are no foreign keys', + thereAreNoTableChecks: 'There are no table checks', createNewForeign: 'Create new foreign key', referenceTable: 'Ref. table', referenceField: 'Ref. field', diff --git a/src/renderer/i18n/ru-RU.ts b/src/renderer/i18n/ru-RU.ts index 739603e5..2a9f6add 100644 --- a/src/renderer/i18n/ru-RU.ts +++ b/src/renderer/i18n/ru-RU.ts @@ -1,578 +1,578 @@ export const ruRU = { - general: { - edit: 'Редактировать', - save: 'Сохранить', - close: 'Закрыть', - delete: 'Удалить', - confirm: 'Подтвердить', - cancel: 'Отмена', - send: 'Отправить', - refresh: 'Обновить', - autoRefresh: 'Авто-обновление', - version: 'Версия', - donate: 'Пожертвование', - run: 'Выполнить', - results: 'Отображено', - size: 'Размер', - mimeType: 'Mime-Тип', - download: 'Скачать', - add: 'Добавить', - data: 'Данные', - properties: 'Свойства', - insert: 'Вставить', - name: 'Название', - clear: 'Удалить', - seconds: 'Секунды', - options: 'Опции', - discard: 'Отказаться', - stay: 'Оставить', - author: 'Автор', - upload: 'Загрузки', - browse: 'Обзор', - content: 'Содержимое', - cut: 'Вырезать', - copy: 'Копировать', - paste: 'Вставить', - tools: 'Инструменты', - format: 'Отформатировать', - all: 'Все', - duplicate: 'Дубликат', - new: 'Новый', - history: 'История', - select: 'Выбрать', - filter: 'Фильтр', - change: 'Изменить', - includes: 'Включая', - completed: 'Завершено', - aborted: 'Прервано', - disabled: 'Отключено', - enable: 'Включить', - disable: 'Выключить', - contributors: 'Участники', - pin: 'Закрепить', - unpin: 'Открепить', - folder: 'Директория | Директории', - deleteConfirm: 'Подтверждаете ли вы удаление', - uploadFile: 'Загрузить файл', - manualValue: 'Установить значение вручную', - selectAll: 'Выбрать все', - pageNumber: 'Номер страницы', - directoryPath: 'Путь к каталогу', - actionSuccessful: '{action} успешно', - outputFormat: 'Формат вывода', - singleFile: 'Один {ext} файл', - zipCompressedFile: 'ZIP сжатие {ext} файла', - include: 'Включая', - none: 'Нет', - singleQuote: 'Одинарная кавычка', - doubleQuote: 'Двойная кавычка', - copyName: 'Скопировать имя', - search: 'Поиск', - title: 'Название', - archive: 'Архив', - undo: 'Отменить', - moveTo: 'Переместить в', - }, - connection: { - connectionName: 'Название соединения', - client: 'Клиент', - hostName: 'Название хоста', - port: 'Порт', - user: 'Пользователь', - password: 'Пароль', - credentials: 'Полномочия', - connect: 'Подключиться', - connected: 'Подключено', - disconnect: 'Отключиться', - disconnected: 'Отключено', - ssl: 'SSL', - privateKey: 'Закрытый ключ', - certificate: 'Сертификат', - caCertificate: 'CA сертификат', - ciphers: 'Шифры', - sshTunnel: 'SSH туннель', - passphrase: 'Кодовая фраза', - connectionString: 'Строка подключения', - addConnection: 'Добавить подключение', - createConnection: 'Создать подключение', - createNewConnection: 'Создать новое подключение', - askCredentials: 'Спрашивать учетные данные', - testConnection: 'Тест подключения', - editConnection: 'Редактировать подключение', - deleteConnection: 'Удалить подключение', - connectionSuccessfullyMade: 'Соединение успешно установлено!', - enableSsl: 'Включить SSL', - enableSsh: 'Включить SSH', - readOnlyMode: 'Режим только чтение', - untrustedConnection: 'Ненадежное соединение', - allConnections: 'Все соединения', - searchForConnections: 'Поиск соединений', - keepAliveInterval: 'Интервал поддержания соединения', - singleConnection: 'Одно соединение', - connection: 'Соединение', - }, - database: { - schema: 'Схема', - type: 'Тип', - foreignKeys: 'Внешние ключи', - length: 'Длина', - unsigned: 'Беззнаковое', - default: 'По умолчанию', - comment: 'Комментарий', - collation: 'Сопоставление', - key: 'Ключ | Ключи', - order: 'Порядок', - expression: 'Выражение', - autoIncrement: 'Авто-увеличение', - engine: 'Движок', - field: 'Поле | Поля', - approximately: 'Примерно', - total: 'Всего', - table: 'Таблица', - view: 'Представление', - indexes: 'Индексы', - definer: 'Определитель', - algorithm: 'Алгоритм', - trigger: 'Триггер | Триггеры', - storedRoutine: 'Хранимая процедура | Хранимые процедуры', - scheduler: 'Планировщик | Планировщики', - event: 'Событие', - parameters: 'Параметры', - function: 'Функция | Функции', - deterministic: 'Детерминированный', - context: 'Контекст', - export: 'Экспорт', - import: 'Импорт', - returns: 'Вернуть', - timing: 'Сроки', - state: 'Состояние', - execution: 'Выполнение', - starts: 'Начало', - ends: 'Конец', - variables: 'Переменные', - processes: 'Процессы', - database: 'База данных', - array: 'Массив', - structure: 'Структура', - row: 'Строка | Строки', - cell: 'Ячейка | Ячейки', - triggerFunction: 'Функция запуска | Функции запуска', - routine: 'Хранимая процедура', - commit: 'Подтвердить', - rollback: 'Откатить', - resultsTable: 'Таблица с результатом', - ddl: 'DDL', - drop: 'Удалить', - unableEditFieldWithoutPrimary: 'Невозможно отредактировать поле без первичного ключа в наборе результатов', - editCell: 'Редактировать ячейку', - deleteRows: 'Удалить строку | Удалить {count} строк', - confirmToDeleteRows: 'Подтверждаете удаление строки? | Подтверждаете удаление {count} строк?', - addNewRow: 'Добавить новую строку', - numberOfInserts: 'Количество вставок', - affectedRows: 'Задействовано строк', - createNewDatabase: 'Создать новую БД', - databaseName: 'Название БД', - serverDefault: 'По-умолчанию на сервере', - deleteDatabase: 'Удалить БД', - editDatabase: 'Редактировать БД', - clearChanges: 'Удалить изменения', - addNewField: 'Добавить новое поле', - manageIndexes: 'Управление индексами', - manageForeignKeys: 'Управление внешними ключами', - allowNull: 'Разрешить NULL', - zeroFill: 'Заполнить нулями', - customValue: 'Пользовательское значение', - onUpdate: 'При обновлении', - deleteField: 'Удалить поле', - createNewIndex: 'Создать новый индекс', - addToIndex: 'Добавить индекс', - createNewTable: 'Создать новую таблицу', - emptyTable: 'Очистить таблицу', - deleteTable: 'Удалить таблицу', - emptyConfirm: 'Подтверждаете очистку?', - thereAreNoIndexes: 'Индексов нет', - thereAreNoForeign: 'Внешних ключей нет', - createNewForeign: 'Создать новый внешний ключ', - referenceTable: 'Ссылка на таблицу', - referenceField: 'Ссылка на поле', - foreignFields: 'Сторонние поля', - invalidDefault: 'Недопустимое значение', - onDelete: 'При удалении', - selectStatement: 'Оператор выбора', - triggerStatement: 'Оператор триггера', - sqlSecurity: 'SQL безопасность', - updateOption: 'Опции обновления', - deleteView: 'Удалить представление', - createNewView: 'Создать новое представление', - deleteTrigger: 'Удалить триггер', - createNewTrigger: 'Создать новый триггер', - currentUser: 'Текущий пользователь', - routineBody: 'Тело процедуры', - dataAccess: 'Доступ к данным', - thereAreNoParameters: 'Параметры отсутствуют', - createNewParameter: 'Создать новый параметр', - createNewRoutine: 'Создание новой хранимой процедуры', - deleteRoutine: 'Удаление хранимой процедуры', - functionBody: 'Тело функции', - createNewFunction: 'Создать новую функцию', - deleteFunction: 'Удалить функцию', - schedulerBody: 'Тело планировщика', - createNewScheduler: 'Создать новый планировщик', - deleteScheduler: 'Удалить планировщик', - preserveOnCompletion: 'Сохранение по завершении', - tableFiller: 'Фильтр таблицы', - fakeDataLanguage: 'Язык поддельных данных', - queryDuration: 'Длительность запроса', - setNull: 'Установить NULL', - processesList: 'Список процессов', - processInfo: 'Информация о процессе', - manageUsers: 'Управление пользователями', - createNewSchema: 'Создать новую схему', - schemaName: 'Название схемы', - editSchema: 'Редактировать схему', - deleteSchema: 'Удалить схему', - duplicateTable: 'Клонировать таблицу', - noSchema: 'Нет схемы', - runQuery: 'Выполнить запрос', - thereAreNoTableFields: 'В таблице нет полей', - newTable: 'Новая таблица', - newView: 'Новое представление', - newTrigger: 'Новый триггер', - newRoutine: 'Новая хранимая процедура', - newFunction: 'Новая функция', - newScheduler: 'Новый планировщик', - newTriggerFunction: 'Новая функция триггера', - thereAreNoQueriesYet: 'Запросы пока отсутствуют', - searchForQueries: 'Поиск по запросам', - killProcess: 'Убить процесс', - exportSchema: 'Экспорт схемы', - importSchema: 'Импорт схемы', - newInsertStmtEvery: 'Новый INSERT оператор для каждых', - processingTableExport: 'Обработка {table}', - fetchingTableExport: 'Получение данных из {table}', - writingTableExport: 'Запись данных в {table}', - checkAllTables: 'Выбрать у всех таблицы', - uncheckAllTables: 'Убрать со всех таблиц', - killQuery: 'Убить запрос', - insertRow: 'Вставить строку | Вставить строки', - commitMode: 'Режим подтверждения транзакций', - autoCommit: 'Авто-подтверждение', - manualCommit: 'Ручное подтверждение', - disableFKChecks: 'Отключить проверку внешних ключей', - formatQuery: 'Отформатировать запрос', - queryHistory: 'История запросов', - clearQuery: 'Очистить запрос', - fillCell: 'Заполнить ячейку', - executeSelectedQuery: 'Выполнить выделенный запрос', - noResultsPresent: 'Данные отсутствуют', - sqlExportOptions: 'Опции SQL экспорта', - targetTable: 'Целевая таблица', - importQueryErrors: 'Внимание: {n} ошибка возникла | Внимание: {n} ошибок произошло', - executedQueries: '{n} запрос выполнен | {n} запросов выполнено', - insert: 'Вставить', - materializedview: 'Материализованное представление | Материализованные представления', - exportTable: 'Экспорт таблицы', - createNewMaterializedView: 'Создать новое материализованное представление', - newMaterializedView: 'Новое материализованное представление', - switchDatabase: 'Переключить базу данных', - searchForElements: 'Поиск элементов', - searchForSchemas: 'Поиск схем', - savedQueries: 'Сохранённые запросы', - }, - application: { - settings: 'Настройки', - general: 'Общие', - themes: 'Темы', - update: 'Обновить', - about: 'О программе', - language: 'Язык', - light: 'Светлая', - dark: 'Темная', - autoCompletion: 'Авто-дополнение', - application: 'Приложение', - editor: 'Редактор', - scratchpad: 'Заметки', - changelog: 'Журнал изменений', - small: 'Малый', - medium: 'Средний', - large: 'Большой', - console: 'Консоль', - shortcuts: 'Горячие клавиши', - appearance: 'Внешний вид', - color: 'Цвет', - label: 'Метка', - icon: 'Иконка', - madeWithJS: 'Сделано с 💛 и JavaScript!', - checkForUpdates: 'Проверить обновления', - noUpdatesAvailable: 'Обновлений не найдено', - checkingForUpdate: 'Поиск обновлений', - checkFailure: 'Не удалось проверить обновления, пожалуйста, попробуйте позже', - updateAvailable: 'Доступно обновление', - downloadingUpdate: 'Скачать обновление', - updateDownloaded: 'Обновление скачано', - restartToInstall: 'Перезапустить Antares для установки', - notificationsTimeout: 'Тайм-аут уведомлений', - openNewTab: 'Открыть новую вкладку', - unsavedChanges: 'Несохраненные изменения', - discardUnsavedChanges: 'У вас имеются несохраненные данные. Закрытие этой вкладки приведёт к их отмене.', - applicationTheme: 'Тема приложения', - editorTheme: 'Редактировать тему', - wrapLongLines: 'Перенос длинных строк', - includeBetaUpdates: 'Получать бета-версии обновлений', - markdownSupported: 'Поддержка Markdown', - plantATree: 'Посадить дерево', - dataTabPageSize: 'Размер страницы вкладки ДАННЫЕ', - noOpenTabs: 'Открытых вкладок нет, перейдите по левой панели или:', - restorePreviousSession: 'Восстановить предыдущую сессию', - closeTab: 'Закрыть вкладку', - goToDownloadPage: 'Перейти на страницу загрузки', - disableBlur: 'Отключить размытие', - missingOrIncompleteTranslation: 'Отсутствующий или неполный перевод?', - findOutHowToContribute: 'Узнайте, как внести свой вклад', - disableScratchpad: 'Отключить заметки', - reportABug: 'Сообщить о баге', - nextTab: 'Следующая вкладка', - previousTab: 'Предыдущая вкладка', - selectTabNumber: 'Выбрать вкладку под номером {param}', - toggleConsole: 'Переключиться на консоль', - addShortcut: 'Добавить горячую клавишу', - editShortcut: 'Изменить горячую клавишу', - deleteShortcut: 'Удалить горячую клавишу', - restoreDefaults: 'Восстановить по-умолчанию', - restoreDefaultsQuestion: 'Вы подтверждаете восстановление значений по-умолчанию?', - registerAShortcut: 'Зарегистрировать горячие клавиши', - invalidShortcutMessage: 'Невозможно использовать эту комбинацию, попробуйте ещё', - shortcutAlreadyExists: 'Такая комбинация уже существует', - saveContent: 'Сохранить содержимое', - openAllConnections: 'Открыть все соединения', - openSettings: 'Открыть настройки', - openScratchpad: 'Открыть заметки', - runOrReload: 'Выполнить или обновить', - openFilter: 'Открыть фильтр', - nextResultsPage: 'Следующая страница', - previousResultsPage: 'Предыдущая страница', - editFolder: 'Изменить папку', - folderName: 'Название папки', - deleteFolder: 'Удалить папки', - editConnectionAppearance: 'Изменить внешний вид соединения', - defaultCopyType: 'Тип копирования по-умолчанию', - showTableSize: 'Показывать размер таблицы в сайдбаре', - showTableSizeDescription: + general: { + edit: 'Редактировать', + save: 'Сохранить', + close: 'Закрыть', + delete: 'Удалить', + confirm: 'Подтвердить', + cancel: 'Отмена', + send: 'Отправить', + refresh: 'Обновить', + autoRefresh: 'Авто-обновление', + version: 'Версия', + donate: 'Пожертвование', + run: 'Выполнить', + results: 'Отображено', + size: 'Размер', + mimeType: 'Mime-Тип', + download: 'Скачать', + add: 'Добавить', + data: 'Данные', + properties: 'Свойства', + insert: 'Вставить', + name: 'Название', + clear: 'Удалить', + seconds: 'Секунды', + options: 'Опции', + discard: 'Отказаться', + stay: 'Оставить', + author: 'Автор', + upload: 'Загрузки', + browse: 'Обзор', + content: 'Содержимое', + cut: 'Вырезать', + copy: 'Копировать', + paste: 'Вставить', + tools: 'Инструменты', + format: 'Отформатировать', + all: 'Все', + duplicate: 'Дубликат', + new: 'Новый', + history: 'История', + select: 'Выбрать', + filter: 'Фильтр', + change: 'Изменить', + includes: 'Включая', + completed: 'Завершено', + aborted: 'Прервано', + disabled: 'Отключено', + enable: 'Включить', + disable: 'Выключить', + contributors: 'Участники', + pin: 'Закрепить', + unpin: 'Открепить', + folder: 'Директория | Директории', + deleteConfirm: 'Подтверждаете ли вы удаление', + uploadFile: 'Загрузить файл', + manualValue: 'Установить значение вручную', + selectAll: 'Выбрать все', + pageNumber: 'Номер страницы', + directoryPath: 'Путь к каталогу', + actionSuccessful: '{action} успешно', + outputFormat: 'Формат вывода', + singleFile: 'Один {ext} файл', + zipCompressedFile: 'ZIP сжатие {ext} файла', + include: 'Включая', + none: 'Нет', + singleQuote: 'Одинарная кавычка', + doubleQuote: 'Двойная кавычка', + copyName: 'Скопировать имя', + search: 'Поиск', + title: 'Название', + archive: 'Архив', + undo: 'Отменить', + moveTo: 'Переместить в' + }, + connection: { + connectionName: 'Название соединения', + client: 'Клиент', + hostName: 'Название хоста', + port: 'Порт', + user: 'Пользователь', + password: 'Пароль', + credentials: 'Полномочия', + connect: 'Подключиться', + connected: 'Подключено', + disconnect: 'Отключиться', + disconnected: 'Отключено', + ssl: 'SSL', + privateKey: 'Закрытый ключ', + certificate: 'Сертификат', + caCertificate: 'CA сертификат', + ciphers: 'Шифры', + sshTunnel: 'SSH туннель', + passphrase: 'Кодовая фраза', + connectionString: 'Строка подключения', + addConnection: 'Добавить подключение', + createConnection: 'Создать подключение', + createNewConnection: 'Создать новое подключение', + askCredentials: 'Спрашивать учетные данные', + testConnection: 'Тест подключения', + editConnection: 'Редактировать подключение', + deleteConnection: 'Удалить подключение', + connectionSuccessfullyMade: 'Соединение успешно установлено!', + enableSsl: 'Включить SSL', + enableSsh: 'Включить SSH', + readOnlyMode: 'Режим только чтение', + untrustedConnection: 'Ненадежное соединение', + allConnections: 'Все соединения', + searchForConnections: 'Поиск соединений', + keepAliveInterval: 'Интервал поддержания соединения', + singleConnection: 'Одно соединение', + connection: 'Соединение' + }, + database: { + schema: 'Схема', + type: 'Тип', + foreignKeys: 'Внешние ключи', + length: 'Длина', + unsigned: 'Беззнаковое', + default: 'По умолчанию', + comment: 'Комментарий', + collation: 'Сопоставление', + key: 'Ключ | Ключи', + order: 'Порядок', + expression: 'Выражение', + autoIncrement: 'Авто-увеличение', + engine: 'Движок', + field: 'Поле | Поля', + approximately: 'Примерно', + total: 'Всего', + table: 'Таблица', + view: 'Представление', + indexes: 'Индексы', + definer: 'Определитель', + algorithm: 'Алгоритм', + trigger: 'Триггер | Триггеры', + storedRoutine: 'Хранимая процедура | Хранимые процедуры', + scheduler: 'Планировщик | Планировщики', + event: 'Событие', + parameters: 'Параметры', + function: 'Функция | Функции', + deterministic: 'Детерминированный', + context: 'Контекст', + export: 'Экспорт', + import: 'Импорт', + returns: 'Вернуть', + timing: 'Сроки', + state: 'Состояние', + execution: 'Выполнение', + starts: 'Начало', + ends: 'Конец', + variables: 'Переменные', + processes: 'Процессы', + database: 'База данных', + array: 'Массив', + structure: 'Структура', + row: 'Строка | Строки', + cell: 'Ячейка | Ячейки', + triggerFunction: 'Функция запуска | Функции запуска', + routine: 'Хранимая процедура', + commit: 'Подтвердить', + rollback: 'Откатить', + resultsTable: 'Таблица с результатом', + ddl: 'DDL', + drop: 'Удалить', + unableEditFieldWithoutPrimary: 'Невозможно отредактировать поле без первичного ключа в наборе результатов', + editCell: 'Редактировать ячейку', + deleteRows: 'Удалить строку | Удалить {count} строк', + confirmToDeleteRows: 'Подтверждаете удаление строки? | Подтверждаете удаление {count} строк?', + addNewRow: 'Добавить новую строку', + numberOfInserts: 'Количество вставок', + affectedRows: 'Задействовано строк', + createNewDatabase: 'Создать новую БД', + databaseName: 'Название БД', + serverDefault: 'По-умолчанию на сервере', + deleteDatabase: 'Удалить БД', + editDatabase: 'Редактировать БД', + clearChanges: 'Удалить изменения', + addNewField: 'Добавить новое поле', + manageIndexes: 'Управление индексами', + manageForeignKeys: 'Управление внешними ключами', + allowNull: 'Разрешить NULL', + zeroFill: 'Заполнить нулями', + customValue: 'Пользовательское значение', + onUpdate: 'При обновлении', + deleteField: 'Удалить поле', + createNewIndex: 'Создать новый индекс', + addToIndex: 'Добавить индекс', + createNewTable: 'Создать новую таблицу', + emptyTable: 'Очистить таблицу', + deleteTable: 'Удалить таблицу', + emptyConfirm: 'Подтверждаете очистку?', + thereAreNoIndexes: 'Индексов нет', + thereAreNoForeign: 'Внешних ключей нет', + createNewForeign: 'Создать новый внешний ключ', + referenceTable: 'Ссылка на таблицу', + referenceField: 'Ссылка на поле', + foreignFields: 'Сторонние поля', + invalidDefault: 'Недопустимое значение', + onDelete: 'При удалении', + selectStatement: 'Оператор выбора', + triggerStatement: 'Оператор триггера', + sqlSecurity: 'SQL безопасность', + updateOption: 'Опции обновления', + deleteView: 'Удалить представление', + createNewView: 'Создать новое представление', + deleteTrigger: 'Удалить триггер', + createNewTrigger: 'Создать новый триггер', + currentUser: 'Текущий пользователь', + routineBody: 'Тело процедуры', + dataAccess: 'Доступ к данным', + thereAreNoParameters: 'Параметры отсутствуют', + createNewParameter: 'Создать новый параметр', + createNewRoutine: 'Создание новой хранимой процедуры', + deleteRoutine: 'Удаление хранимой процедуры', + functionBody: 'Тело функции', + createNewFunction: 'Создать новую функцию', + deleteFunction: 'Удалить функцию', + schedulerBody: 'Тело планировщика', + createNewScheduler: 'Создать новый планировщик', + deleteScheduler: 'Удалить планировщик', + preserveOnCompletion: 'Сохранение по завершении', + tableFiller: 'Фильтр таблицы', + fakeDataLanguage: 'Язык поддельных данных', + queryDuration: 'Длительность запроса', + setNull: 'Установить NULL', + processesList: 'Список процессов', + processInfo: 'Информация о процессе', + manageUsers: 'Управление пользователями', + createNewSchema: 'Создать новую схему', + schemaName: 'Название схемы', + editSchema: 'Редактировать схему', + deleteSchema: 'Удалить схему', + duplicateTable: 'Клонировать таблицу', + noSchema: 'Нет схемы', + runQuery: 'Выполнить запрос', + thereAreNoTableFields: 'В таблице нет полей', + newTable: 'Новая таблица', + newView: 'Новое представление', + newTrigger: 'Новый триггер', + newRoutine: 'Новая хранимая процедура', + newFunction: 'Новая функция', + newScheduler: 'Новый планировщик', + newTriggerFunction: 'Новая функция триггера', + thereAreNoQueriesYet: 'Запросы пока отсутствуют', + searchForQueries: 'Поиск по запросам', + killProcess: 'Убить процесс', + exportSchema: 'Экспорт схемы', + importSchema: 'Импорт схемы', + newInsertStmtEvery: 'Новый INSERT оператор для каждых', + processingTableExport: 'Обработка {table}', + fetchingTableExport: 'Получение данных из {table}', + writingTableExport: 'Запись данных в {table}', + checkAllTables: 'Выбрать у всех таблицы', + uncheckAllTables: 'Убрать со всех таблиц', + killQuery: 'Убить запрос', + insertRow: 'Вставить строку | Вставить строки', + commitMode: 'Режим подтверждения транзакций', + autoCommit: 'Авто-подтверждение', + manualCommit: 'Ручное подтверждение', + disableFKChecks: 'Отключить проверку внешних ключей', + formatQuery: 'Отформатировать запрос', + queryHistory: 'История запросов', + clearQuery: 'Очистить запрос', + fillCell: 'Заполнить ячейку', + executeSelectedQuery: 'Выполнить выделенный запрос', + noResultsPresent: 'Данные отсутствуют', + sqlExportOptions: 'Опции SQL экспорта', + targetTable: 'Целевая таблица', + importQueryErrors: 'Внимание: {n} ошибка возникла | Внимание: {n} ошибок произошло', + executedQueries: '{n} запрос выполнен | {n} запросов выполнено', + insert: 'Вставить', + materializedview: 'Материализованное представление | Материализованные представления', + exportTable: 'Экспорт таблицы', + createNewMaterializedView: 'Создать новое материализованное представление', + newMaterializedView: 'Новое материализованное представление', + switchDatabase: 'Переключить базу данных', + searchForElements: 'Поиск элементов', + searchForSchemas: 'Поиск схем', + savedQueries: 'Сохранённые запросы' + }, + application: { + settings: 'Настройки', + general: 'Общие', + themes: 'Темы', + update: 'Обновить', + about: 'О программе', + language: 'Язык', + light: 'Светлая', + dark: 'Темная', + autoCompletion: 'Авто-дополнение', + application: 'Приложение', + editor: 'Редактор', + scratchpad: 'Заметки', + changelog: 'Журнал изменений', + small: 'Малый', + medium: 'Средний', + large: 'Большой', + console: 'Консоль', + shortcuts: 'Горячие клавиши', + appearance: 'Внешний вид', + color: 'Цвет', + label: 'Метка', + icon: 'Иконка', + madeWithJS: 'Сделано с 💛 и JavaScript!', + checkForUpdates: 'Проверить обновления', + noUpdatesAvailable: 'Обновлений не найдено', + checkingForUpdate: 'Поиск обновлений', + checkFailure: 'Не удалось проверить обновления, пожалуйста, попробуйте позже', + updateAvailable: 'Доступно обновление', + downloadingUpdate: 'Скачать обновление', + updateDownloaded: 'Обновление скачано', + restartToInstall: 'Перезапустить Antares для установки', + notificationsTimeout: 'Тайм-аут уведомлений', + openNewTab: 'Открыть новую вкладку', + unsavedChanges: 'Несохраненные изменения', + discardUnsavedChanges: 'У вас имеются несохраненные данные. Закрытие этой вкладки приведёт к их отмене.', + applicationTheme: 'Тема приложения', + editorTheme: 'Редактировать тему', + wrapLongLines: 'Перенос длинных строк', + includeBetaUpdates: 'Получать бета-версии обновлений', + markdownSupported: 'Поддержка Markdown', + plantATree: 'Посадить дерево', + dataTabPageSize: 'Размер страницы вкладки ДАННЫЕ', + noOpenTabs: 'Открытых вкладок нет, перейдите по левой панели или:', + restorePreviousSession: 'Восстановить предыдущую сессию', + closeTab: 'Закрыть вкладку', + goToDownloadPage: 'Перейти на страницу загрузки', + disableBlur: 'Отключить размытие', + missingOrIncompleteTranslation: 'Отсутствующий или неполный перевод?', + findOutHowToContribute: 'Узнайте, как внести свой вклад', + disableScratchpad: 'Отключить заметки', + reportABug: 'Сообщить о баге', + nextTab: 'Следующая вкладка', + previousTab: 'Предыдущая вкладка', + selectTabNumber: 'Выбрать вкладку под номером {param}', + toggleConsole: 'Переключиться на консоль', + addShortcut: 'Добавить горячую клавишу', + editShortcut: 'Изменить горячую клавишу', + deleteShortcut: 'Удалить горячую клавишу', + restoreDefaults: 'Восстановить по-умолчанию', + restoreDefaultsQuestion: 'Вы подтверждаете восстановление значений по-умолчанию?', + registerAShortcut: 'Зарегистрировать горячие клавиши', + invalidShortcutMessage: 'Невозможно использовать эту комбинацию, попробуйте ещё', + shortcutAlreadyExists: 'Такая комбинация уже существует', + saveContent: 'Сохранить содержимое', + openAllConnections: 'Открыть все соединения', + openSettings: 'Открыть настройки', + openScratchpad: 'Открыть заметки', + runOrReload: 'Выполнить или обновить', + openFilter: 'Открыть фильтр', + nextResultsPage: 'Следующая страница', + previousResultsPage: 'Предыдущая страница', + editFolder: 'Изменить папку', + folderName: 'Название папки', + deleteFolder: 'Удалить папки', + editConnectionAppearance: 'Изменить внешний вид соединения', + defaultCopyType: 'Тип копирования по-умолчанию', + showTableSize: 'Показывать размер таблицы в сайдбаре', + showTableSizeDescription: 'Только MySQL/MariaDB. Включение этого параметра может повлиять на производительность схемы с большим количеством таблиц.', - searchForSchemas: 'Поиск схем', - searchForElements: 'Поиск элементов', - switchSearchMethod: 'Переключить способ поиска', - closeAllTabs: 'Закрыть все вкладки', - closeOtherTabs: 'Закрыть остальные вкладки', - closeTabsToLeft: 'Закрыть вкладки слева', - closeTabsToRight: 'Закрыть вкладки справа', - phpArray: 'PHP массив', - event: 'Событие', - customIcon: 'Пользовательская иконка', - fileName: 'Имя файла', - choseFile: 'Выбрать файл', - data: 'Данные', - password: 'Пароль', - required: 'Обязательный', - newFolder: 'Новая папка', - outOfFolder: 'Вне папки', - csvFieldDelimiter: 'Разделитель полей CSV', - csvLinesTerminator: 'Терминатор строк CSV', - csvStringDelimiter: 'Разделитель строк CSV', - csvIncludeHeader: 'Включить заголовок', - csvExportOptions: 'Опции экспорта CSV', - exportData: 'Экспорт данных', - exportDataExplanation: + searchForSchemas: 'Поиск схем', + searchForElements: 'Поиск элементов', + switchSearchMethod: 'Переключить способ поиска', + closeAllTabs: 'Закрыть все вкладки', + closeOtherTabs: 'Закрыть остальные вкладки', + closeTabsToLeft: 'Закрыть вкладки слева', + closeTabsToRight: 'Закрыть вкладки справа', + phpArray: 'PHP массив', + event: 'Событие', + customIcon: 'Пользовательская иконка', + fileName: 'Имя файла', + choseFile: 'Выбрать файл', + data: 'Данные', + password: 'Пароль', + required: 'Обязательный', + newFolder: 'Новая папка', + outOfFolder: 'Вне папки', + csvFieldDelimiter: 'Разделитель полей CSV', + csvLinesTerminator: 'Терминатор строк CSV', + csvStringDelimiter: 'Разделитель строк CSV', + csvIncludeHeader: 'Включить заголовок', + csvExportOptions: 'Опции экспорта CSV', + exportData: 'Экспорт данных', + exportDataExplanation: 'Экспорт сохранённых соединений в Antares. Вам будет предложено ввести пароль для шифрования экспортируемого файла.', - importData: 'Импорт данных', - importDataExplanation: 'Импортирует файл .antares, содержащий соединения. Вам нужно будет ввести пароль, заданный во время экспорта.', - includeConnectionPasswords: 'Включить пароли соединений', - includeFolders: 'Включить папки', - encryptionPassword: 'Пароль шифрования', - encryptionPasswordError: 'Пароль шифрования должен содержать не менее 8 символов.', - ignoreDuplicates: 'Игнорировать дубликаты', - wrongImportPassword: 'Неверный пароль импорта', - wrongFileFormat: 'Неверный формат файла', - dataImportSuccess: 'Данные успешно импортированы', - note: 'Заметка | Заметки', - thereAreNoNotesYet: 'Заметок пока нет', - addNote: 'Добавить заметку', - editNote: 'Редактировать заметку', - saveAsNote: 'Сохранить как заметку', - showArchivedNotes: 'Показать архивированные заметки', - hideArchivedNotes: 'Скрыть архивированные заметки', - tag: 'Тег', - saveFile: 'Сохранить файл', - saveFileAs: 'Сохранить файл как', - openFile: 'Открыть файл', - openNotes: 'Открыть заметки', - debugConsole: 'Отладочная консоль', - executedQueries: 'Выполненные запросы', - sizeLimitError: 'Превышен максимальный размер {size}', - }, - faker: { - address: 'Адрес', - commerce: 'Коммерция', - company: 'Компания', - database: 'База данных', - date: 'Дата', - finance: 'Финансы', - git: 'Git', - hacker: 'Хакер', - internet: 'Интернет', - lorem: 'Лорем', - name: 'Имя', - music: 'Музыка', - phone: 'Телефон', - random: 'Случайный', - system: 'Система', - time: 'Время', - vehicle: 'Средство передвижения', - zipCode: 'Почтовый код', - zipCodeByState: 'Почтовый код города', - city: 'Город', - cityPrefix: 'Префикс города', - citySuffix: 'Суфикс города', - streetName: 'Название улицы', - streetAddress: 'Адрес улицы', - streetSuffix: 'Суфикс улицы', - streetPrefix: 'Префикс улицы', - secondaryAddress: 'Дополнительный адрес', - county: 'Округ', - country: 'Страна', - countryCode: 'Код страны', - state: 'Область', - stateAbbr: 'Аббревиатура области', - latitude: 'Широта', - longitude: 'Долгота', - direction: 'Направление', - cardinalDirection: 'Кардинальное направление', - ordinalDirection: 'Порядковое направление', - nearbyGPSCoordinate: 'Ближайшая GPS-координата', - timeZone: 'Часовой пояс', - color: 'Цвет', - department: 'Отдел', - productName: 'Имя продукта', - price: 'Прайс', - productAdjective: 'Относящееся к продукту', - productMaterial: 'Материал продукта', - product: 'Продукт', - productDescription: 'Описание продукта', - suffixes: 'Суфиксы', - companyName: 'Название компании', - companySuffix: 'Суфикс компании', - catchPhrase: 'Крылатая фраза', - bs: 'BS', - catchPhraseAdjective: 'Крылатая фраза прилагательное', - catchPhraseDescriptor: 'Дескриптор крылатой фразы', - catchPhraseNoun: 'Крылатая фраза существительное', - bsAdjective: 'BS прилагательное', - bsBuzz: 'BS жужжать', - bsNoun: 'BS существительное', - column: 'Колонка', - type: 'Тип', - collation: 'Сопоставление', - engine: 'Движок', - past: 'Прошлое', - now: 'Сейчас', - future: 'Будущее', - between: 'Между', - recent: 'Недавнее', - soon: 'Вскоре', - month: 'Месяц', - weekday: 'День недели', - account: 'Аккаунт', - accountName: 'Имя аккаунта', - routingNumber: 'Номер маршрута', - mask: 'Маска', - amount: 'Сумма', - transactionType: 'Тип транзакции', - currencyCode: 'Код валюты', - currencyName: 'Название валюты', - currencySymbol: 'Символ валюты', - bitcoinAddress: 'Bitcoin кошелек', - litecoinAddress: 'Litecoin кошелек', - creditCardNumber: 'Номер кредитной карты', - creditCardCVV: 'CVV код', - ethereumAddress: 'Ethereum кошелек', - iban: 'Iban', - bic: 'Bic', - transactionDescription: 'Описание транзакции', - branch: 'Ветка', - commitEntry: 'Коммит', - commitMessage: 'Сообщение коммита', - commitSha: 'SHA коммита', - shortSha: 'Короткий SHA', - abbreviation: 'Сокращение', - adjective: 'Прилагательное', - noun: 'Существительное', - verb: 'Глагол', - ingverb: 'Пословица', - phrase: 'Фраза', - avatar: 'Аватар', - email: 'Почта', - exampleEmail: 'Пример почты', - userName: 'Логин', - protocol: 'Протокол', - url: 'Url', - domainName: 'Название домена', - domainSuffix: 'Суфикс домена', - domainWord: 'Слово домена', - ip: 'Ip', - ipv6: 'Ipv6', - userAgent: 'User agent', - mac: 'MAC-адрес', - password: 'Пароль', - word: 'Слово', - words: 'Слова', - sentence: 'Предложение', - slug: 'Slug', - sentences: 'Предложения', - paragraph: 'Параграф', - paragraphs: 'Параграфы', - text: 'Текст', - lines: 'Линии', - genre: 'Жанр', - firstName: 'Имя', - lastName: 'Фамилия', - middleName: 'Отчество', - findName: 'Полное имя', - jobTitle: 'Название задания', - gender: 'Пол', - prefix: 'Префикс', - suffix: 'Суфикс', - title: 'Заголовок', - jobDescriptor: 'Описание задания', - jobArea: 'Область задания', - jobType: 'Тип задания', - phoneNumber: 'Номер телефона', - phoneNumberFormat: 'Формат номера телефона', - phoneFormats: 'Формат номеров телефона', - number: 'Номер', - float: 'Дробное число', - arrayElement: 'Элемент массива', - arrayElements: 'Элементы массива', - objectElement: 'Элемент объекта', - uuid: 'Uuid', - boolean: 'Логический', - image: 'Изображение', - locale: 'Локаль', - alpha: 'Буквенный', - alphaNumeric: 'Буквенно-цифровой', - hexaDecimal: 'Шестнадцатеричный', - fileName: 'Имя файла', - commonFileName: 'Общее имя файла', - mimeType: 'Mime-тип', - commonFileType: 'Общий тип файлов', - commonFileExt: 'Общее расширение файлов', - fileType: 'Тип файла', - fileExt: 'Расширение файла', - directoryPath: 'Путь к каталогу', - filePath: 'Путь к файлу', - semver: 'Semver', - manufacturer: 'Производитель', - model: 'Модель', - fuel: 'Топливо', - vin: 'Vin', - }, -} + importData: 'Импорт данных', + importDataExplanation: 'Импортирует файл .antares, содержащий соединения. Вам нужно будет ввести пароль, заданный во время экспорта.', + includeConnectionPasswords: 'Включить пароли соединений', + includeFolders: 'Включить папки', + encryptionPassword: 'Пароль шифрования', + encryptionPasswordError: 'Пароль шифрования должен содержать не менее 8 символов.', + ignoreDuplicates: 'Игнорировать дубликаты', + wrongImportPassword: 'Неверный пароль импорта', + wrongFileFormat: 'Неверный формат файла', + dataImportSuccess: 'Данные успешно импортированы', + note: 'Заметка | Заметки', + thereAreNoNotesYet: 'Заметок пока нет', + addNote: 'Добавить заметку', + editNote: 'Редактировать заметку', + saveAsNote: 'Сохранить как заметку', + showArchivedNotes: 'Показать архивированные заметки', + hideArchivedNotes: 'Скрыть архивированные заметки', + tag: 'Тег', + saveFile: 'Сохранить файл', + saveFileAs: 'Сохранить файл как', + openFile: 'Открыть файл', + openNotes: 'Открыть заметки', + debugConsole: 'Отладочная консоль', + executedQueries: 'Выполненные запросы', + sizeLimitError: 'Превышен максимальный размер {size}' + }, + faker: { + address: 'Адрес', + commerce: 'Коммерция', + company: 'Компания', + database: 'База данных', + date: 'Дата', + finance: 'Финансы', + git: 'Git', + hacker: 'Хакер', + internet: 'Интернет', + lorem: 'Лорем', + name: 'Имя', + music: 'Музыка', + phone: 'Телефон', + random: 'Случайный', + system: 'Система', + time: 'Время', + vehicle: 'Средство передвижения', + zipCode: 'Почтовый код', + zipCodeByState: 'Почтовый код города', + city: 'Город', + cityPrefix: 'Префикс города', + citySuffix: 'Суфикс города', + streetName: 'Название улицы', + streetAddress: 'Адрес улицы', + streetSuffix: 'Суфикс улицы', + streetPrefix: 'Префикс улицы', + secondaryAddress: 'Дополнительный адрес', + county: 'Округ', + country: 'Страна', + countryCode: 'Код страны', + state: 'Область', + stateAbbr: 'Аббревиатура области', + latitude: 'Широта', + longitude: 'Долгота', + direction: 'Направление', + cardinalDirection: 'Кардинальное направление', + ordinalDirection: 'Порядковое направление', + nearbyGPSCoordinate: 'Ближайшая GPS-координата', + timeZone: 'Часовой пояс', + color: 'Цвет', + department: 'Отдел', + productName: 'Имя продукта', + price: 'Прайс', + productAdjective: 'Относящееся к продукту', + productMaterial: 'Материал продукта', + product: 'Продукт', + productDescription: 'Описание продукта', + suffixes: 'Суфиксы', + companyName: 'Название компании', + companySuffix: 'Суфикс компании', + catchPhrase: 'Крылатая фраза', + bs: 'BS', + catchPhraseAdjective: 'Крылатая фраза прилагательное', + catchPhraseDescriptor: 'Дескриптор крылатой фразы', + catchPhraseNoun: 'Крылатая фраза существительное', + bsAdjective: 'BS прилагательное', + bsBuzz: 'BS жужжать', + bsNoun: 'BS существительное', + column: 'Колонка', + type: 'Тип', + collation: 'Сопоставление', + engine: 'Движок', + past: 'Прошлое', + now: 'Сейчас', + future: 'Будущее', + between: 'Между', + recent: 'Недавнее', + soon: 'Вскоре', + month: 'Месяц', + weekday: 'День недели', + account: 'Аккаунт', + accountName: 'Имя аккаунта', + routingNumber: 'Номер маршрута', + mask: 'Маска', + amount: 'Сумма', + transactionType: 'Тип транзакции', + currencyCode: 'Код валюты', + currencyName: 'Название валюты', + currencySymbol: 'Символ валюты', + bitcoinAddress: 'Bitcoin кошелек', + litecoinAddress: 'Litecoin кошелек', + creditCardNumber: 'Номер кредитной карты', + creditCardCVV: 'CVV код', + ethereumAddress: 'Ethereum кошелек', + iban: 'Iban', + bic: 'Bic', + transactionDescription: 'Описание транзакции', + branch: 'Ветка', + commitEntry: 'Коммит', + commitMessage: 'Сообщение коммита', + commitSha: 'SHA коммита', + shortSha: 'Короткий SHA', + abbreviation: 'Сокращение', + adjective: 'Прилагательное', + noun: 'Существительное', + verb: 'Глагол', + ingverb: 'Пословица', + phrase: 'Фраза', + avatar: 'Аватар', + email: 'Почта', + exampleEmail: 'Пример почты', + userName: 'Логин', + protocol: 'Протокол', + url: 'Url', + domainName: 'Название домена', + domainSuffix: 'Суфикс домена', + domainWord: 'Слово домена', + ip: 'Ip', + ipv6: 'Ipv6', + userAgent: 'User agent', + mac: 'MAC-адрес', + password: 'Пароль', + word: 'Слово', + words: 'Слова', + sentence: 'Предложение', + slug: 'Slug', + sentences: 'Предложения', + paragraph: 'Параграф', + paragraphs: 'Параграфы', + text: 'Текст', + lines: 'Линии', + genre: 'Жанр', + firstName: 'Имя', + lastName: 'Фамилия', + middleName: 'Отчество', + findName: 'Полное имя', + jobTitle: 'Название задания', + gender: 'Пол', + prefix: 'Префикс', + suffix: 'Суфикс', + title: 'Заголовок', + jobDescriptor: 'Описание задания', + jobArea: 'Область задания', + jobType: 'Тип задания', + phoneNumber: 'Номер телефона', + phoneNumberFormat: 'Формат номера телефона', + phoneFormats: 'Формат номеров телефона', + number: 'Номер', + float: 'Дробное число', + arrayElement: 'Элемент массива', + arrayElements: 'Элементы массива', + objectElement: 'Элемент объекта', + uuid: 'Uuid', + boolean: 'Логический', + image: 'Изображение', + locale: 'Локаль', + alpha: 'Буквенный', + alphaNumeric: 'Буквенно-цифровой', + hexaDecimal: 'Шестнадцатеричный', + fileName: 'Имя файла', + commonFileName: 'Общее имя файла', + mimeType: 'Mime-тип', + commonFileType: 'Общий тип файлов', + commonFileExt: 'Общее расширение файлов', + fileType: 'Тип файла', + fileExt: 'Расширение файла', + directoryPath: 'Путь к каталогу', + filePath: 'Путь к файлу', + semver: 'Semver', + manufacturer: 'Производитель', + model: 'Модель', + fuel: 'Топливо', + vin: 'Vin' + } +}; diff --git a/src/renderer/ipc-api/Tables.ts b/src/renderer/ipc-api/Tables.ts index 6a432c91..05c71d91 100644 --- a/src/renderer/ipc-api/Tables.ts +++ b/src/renderer/ipc-api/Tables.ts @@ -36,6 +36,10 @@ export default class { return ipcRenderer.invoke('get-table-indexes', unproxify(params)); } + static getTableChecks (params: { uid: string; schema: string; table: string }): Promise { + return ipcRenderer.invoke('get-table-checks', unproxify(params)); + } + static getTableDll (params: { uid: string; schema: string; table: string }): Promise> { return ipcRenderer.invoke('get-table-ddl', unproxify(params)); } diff --git a/src/renderer/stores/console.ts b/src/renderer/stores/console.ts index 89a7de92..7677ef98 100644 --- a/src/renderer/stores/console.ts +++ b/src/renderer/stores/console.ts @@ -10,7 +10,7 @@ export interface QueryLog { } export interface DebugLog { - level: 'log' | 'info' | 'warn' | 'error'; + level: 'log' | 'info' | 'warn' | 'error' | string; process: 'renderer' | 'main' | 'worker'; message: string; date: Date; From dfa7cf9905a4d0a79eaed823a14477574b329dfa Mon Sep 17 00:00:00 2001 From: Fabio Di Stasio Date: Fri, 25 Oct 2024 18:32:07 +0200 Subject: [PATCH 2/2] perf: added more notifications in debug console --- src/renderer/stores/notifications.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/renderer/stores/notifications.ts b/src/renderer/stores/notifications.ts index 9c01383e..62d0954b 100644 --- a/src/renderer/stores/notifications.ts +++ b/src/renderer/stores/notifications.ts @@ -1,6 +1,8 @@ import { uidGen } from 'common/libs/uidGen'; import { defineStore } from 'pinia'; +import { useConsoleStore } from './console'; + export interface Notification { uid: string; status: string; @@ -15,6 +17,13 @@ export const useNotificationsStore = defineStore('notifications', { addNotification (payload: { status: string; message: string }) { const notification: Notification = { uid: uidGen('N'), ...payload }; this.notifications.unshift(notification); + + useConsoleStore().putLog('debug', { + level: notification.status, + process: 'renderer', + message: notification.message, + date: new Date() + }); }, removeNotification (uid: string) { this.notifications = (this.notifications as Notification[]).filter(item => item.uid !== uid);