From 2231bc21cd6ecf35af8320450452456415bdb651 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 17 Oct 2021 10:24:31 +0200 Subject: [PATCH 1/2] #182 support for MySQL binary keys --- packages/tools/src/index.ts | 1 + packages/tools/src/stringTools.ts | 3 +++ packages/web/src/datagrid/DataGridCore.svelte | 12 ++---------- packages/web/src/formview/FormView.svelte | 7 ++----- packages/web/src/utility/clipboard.js | 13 +++++++++++++ plugins/dbgate-plugin-mysql/src/frontend/Dumper.js | 8 +++++++- 6 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 packages/tools/src/stringTools.ts diff --git a/packages/tools/src/index.ts b/packages/tools/src/index.ts index 5485b923a..c16604cd3 100644 --- a/packages/tools/src/index.ts +++ b/packages/tools/src/index.ts @@ -13,3 +13,4 @@ export * from './settingsExtractors'; export * from './filterName'; export * from './diffTools'; export * from './schemaEditorTools'; +export * from './stringTools'; diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts new file mode 100644 index 000000000..d3ba6cbe2 --- /dev/null +++ b/packages/tools/src/stringTools.ts @@ -0,0 +1,3 @@ +export function toHexString(byteArray) { + return byteArray.reduce((output, elem) => output + ('0' + elem.toString(16)).slice(-2), ''); +} diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index 5af89e44b..45bae5a19 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -192,14 +192,6 @@ return `Rows: ${allRowCount.toLocaleString()}`; } - function extractCopiedValue(row, col) { - let value = row[col]; - if (value === undefined) value = _.get(row, col); - if (value === null) return '(NULL)'; - if (value === undefined) return '(NoField)'; - if (_.isPlainObject(value) || _.isArray(value)) return JSON.stringify(value); - return value; - }
@@ -629,5 +627,4 @@ right: 40px; bottom: 20px; } - diff --git a/packages/web/src/utility/clipboard.js b/packages/web/src/utility/clipboard.js index a2b7081c3..a4f046966 100644 --- a/packages/web/src/utility/clipboard.js +++ b/packages/web/src/utility/clipboard.js @@ -1,3 +1,6 @@ +import _ from 'lodash'; +import { toHexString } from 'dbgate-tools'; + export function copyTextToClipboard(text) { const oldFocus = document.activeElement; @@ -58,3 +61,13 @@ export function copyTextToClipboard(text) { if (oldFocus) oldFocus.focus(); } + +export function extractRowCopiedValue(row, col) { + let value = row[col]; + if (value === undefined) value = _.get(row, col); + if (value === null) return '(NULL)'; + if (value === undefined) return '(NoField)'; + if (value.type == 'Buffer' && _.isArray(value.data)) return toHexString(value.data); + if (_.isPlainObject(value) || _.isArray(value)) return JSON.stringify(value); + return value; +} diff --git a/plugins/dbgate-plugin-mysql/src/frontend/Dumper.js b/plugins/dbgate-plugin-mysql/src/frontend/Dumper.js index c944ab357..476acdd26 100644 --- a/plugins/dbgate-plugin-mysql/src/frontend/Dumper.js +++ b/plugins/dbgate-plugin-mysql/src/frontend/Dumper.js @@ -1,4 +1,5 @@ -const { SqlDumper } = global.DBGATE_TOOLS; +const { SqlDumper, toHexString } = global.DBGATE_TOOLS; +const _isArray = require('lodash/isArray'); class Dumper extends SqlDumper { /** @param type {import('dbgate-types').TransformType} */ @@ -63,6 +64,11 @@ class Dumper extends SqlDumper { selectTableIntoNewTable(sourceName, targetName) { this.putCmd('^create ^table %f (^select * ^from %f)', targetName, sourceName); } + + putValue(value) { + if (value.type == 'Buffer' && _isArray(value.data)) this.putRaw(`unhex('${toHexString(value.data)}')`); + else super.putValue(value); + } } module.exports = Dumper; From 5bb9f181d80886705c46009128b46e21f0e718bc Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 17 Oct 2021 10:52:10 +0200 Subject: [PATCH 2/2] editing MySQL binary fiellds --- packages/tools/src/stringTools.ts | 11 ++++++++++- packages/web/src/datagrid/DataGridCell.svelte | 7 ++++++- packages/web/src/datagrid/InplaceEditor.svelte | 18 +++++++++++++++--- packages/web/src/utility/clipboard.js | 4 ++-- .../dbgate-plugin-mysql/src/frontend/Dumper.js | 4 ++-- 5 files changed, 35 insertions(+), 9 deletions(-) diff --git a/packages/tools/src/stringTools.ts b/packages/tools/src/stringTools.ts index d3ba6cbe2..d3a44c5a5 100644 --- a/packages/tools/src/stringTools.ts +++ b/packages/tools/src/stringTools.ts @@ -1,3 +1,12 @@ -export function toHexString(byteArray) { +export function arrayToHexString(byteArray) { return byteArray.reduce((output, elem) => output + ('0' + elem.toString(16)).slice(-2), ''); } + +export function hexStringToArray(inputString) { + var hex = inputString.toString(); + var res = []; + for (var n = 0; n < hex.length; n += 2) { + res.push(parseInt(hex.substr(n, 2), 16)); + } + return res; +} diff --git a/packages/web/src/datagrid/DataGridCell.svelte b/packages/web/src/datagrid/DataGridCell.svelte index ee7bf99af..57fcc169f 100644 --- a/packages/web/src/datagrid/DataGridCell.svelte +++ b/packages/web/src/datagrid/DataGridCell.svelte @@ -37,6 +37,7 @@ import _ from 'lodash'; import ShowFormButton from '../formview/ShowFormButton.svelte'; import { getBoolSettingsValue } from '../settings/settingsTools'; + import { arrayToHexString } from 'dbgate-tools'; export let rowIndex; export let col; @@ -99,7 +100,11 @@ {highlightSpecialCharacters(value)} {/if} {:else if value.type == 'Buffer' && _.isArray(value.data)} - ({value.data.length} bytes) + {#if value.data.length <= 16} + {arrayToHexString(value.data)} + {:else} + ({value.data.length} bytes) + {/if} {:else if _.isPlainObject(value)} (JSON) {:else if _.isArray(value)} diff --git a/packages/web/src/datagrid/InplaceEditor.svelte b/packages/web/src/datagrid/InplaceEditor.svelte index 23fd2c2b6..4a1829a62 100644 --- a/packages/web/src/datagrid/InplaceEditor.svelte +++ b/packages/web/src/datagrid/InplaceEditor.svelte @@ -1,8 +1,19 @@