diff --git a/src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx b/src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx index 0ac07b0..d6cf377 100644 --- a/src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx +++ b/src/renderer/screens/DatabaseScreen/QueryResultViewer/QueryResultTable.tsx @@ -46,7 +46,7 @@ function QueryResultTable({ >(); const [newRowCount, setNewRowCount] = useState(0); const { collector, cellManager } = useEditableResult(); - const { schema, currentDatabase } = useSchema(); + const { schema, currentDatabase, dialect } = useSchema(); const [selectedRowsIndex, setSelectedRowsIndex] = useState([]); const [removeRowsIndex, setRemoveRowsIndex] = useState([]); @@ -112,6 +112,7 @@ function QueryResultTable({ headers, rules, setSelectedRowsIndex, + dialect, }); const headerMemo = useMemo(() => { diff --git a/src/renderer/screens/DatabaseScreen/QueryResultViewer/useDataTableContextMenu.tsx b/src/renderer/screens/DatabaseScreen/QueryResultViewer/useDataTableContextMenu.tsx index 60263a8..ff7cacb 100644 --- a/src/renderer/screens/DatabaseScreen/QueryResultViewer/useDataTableContextMenu.tsx +++ b/src/renderer/screens/DatabaseScreen/QueryResultViewer/useDataTableContextMenu.tsx @@ -9,6 +9,7 @@ import { getDisplayableFromDatabaseRows } from '../../../../libs/TransformResult import BaseType from 'renderer/datatype/BaseType'; import SQLCommonInterface from 'drivers/base/SQLCommonInterface'; import { useSqlExecute } from 'renderer/contexts/SqlExecuteProvider'; +import { QueryDialetType, qb } from 'libs/QueryBuilder'; interface DataTableContextMenuDeps { collector: ResultChangeCollector; @@ -19,6 +20,7 @@ interface DataTableContextMenuDeps { headers: QueryResultHeader[]; rules: TableEditableRule; setSelectedRowsIndex: React.Dispatch>; + dialect: QueryDialetType; } function dataToArray( @@ -52,6 +54,7 @@ export default function useDataTableContextMenu({ headers, rules, setSelectedRowsIndex, + dialect, }: DataTableContextMenuDeps) { const { common } = useSqlExecute(); @@ -107,6 +110,35 @@ export default function useDataTableContextMenu({ window.navigator.clipboard.writeText(markdownString.join('\n')); } + function onCopyInsertSQL() { + const selectedRows = selectedRowsIndex.map( + (rowIndex) => data[rowIndex].data, + ); + + const tableList = Array.from( + new Set(headers.map((header) => header.schema?.table).filter(Boolean)), + ); + + const tableName = + (tableList.length === 1 ? tableList[0] : 'Unknown') ?? 'Unknown'; + + const lines = selectedRows + .map((row) => { + return qb(dialect) + .table(tableName) + .insert( + Object.keys(row).reduce>((a, b) => { + a[b] = row[b].toSQL(dialect); + return a; + }, {}), + ) + .toRawSQL(); + }) + .join(';\n'); + + window.navigator.clipboard.writeText(lines); + } + const lastSelectedRow = selectedRowsIndex.length > 0 ? data[selectedRowsIndex[selectedRowsIndex.length - 1]] @@ -127,7 +159,7 @@ export default function useDataTableContextMenu({ { text: 'As CSV', disabled: true }, { text: 'As JSON', onClick: onCopyAsJson }, { text: 'As Markdown', onClick: onCopyAsMarkdown }, - { text: 'As SQL', disabled: true }, + { text: 'As SQL Insert', onClick: onCopyInsertSQL }, ], }, { @@ -215,5 +247,6 @@ export default function useDataTableContextMenu({ data, rules, common, + dialect, ]); }