From d97e278a7eda78efaa1d483bbe7ffb930b84a93f Mon Sep 17 00:00:00 2001 From: galiev_mr Date: Wed, 6 Mar 2019 13:34:31 +0300 Subject: [PATCH 1/4] added prototype data extraction mechanism --- .../utils/pgdiff/IProgressReporter.java | 3 + .../callables/QueriesBatchCallable.java | 43 ++++++- .../utils/pgdiff/loader/jdbc/JdbcType.java | 2 +- .../OSGI-INF/l10n/bundle.properties | 1 + .../OSGI-INF/l10n/bundle_ru_RU.properties | 1 + ru.taximaxim.codekeeper.ui/plugin.xml | 6 + .../ru/taximaxim/codekeeper/ui/UIConsts.java | 1 + .../ui/consoles/UiProgressReporter.java | 23 ++++ .../codekeeper/ui/views/ResultSetView.java | 118 ++++++++++++++++++ 9 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java index aa61d82ce9..2ea3318d05 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java @@ -1,8 +1,11 @@ package cz.startnet.utils.pgdiff; +import java.util.List; + public interface IProgressReporter { void writeMessage(String message); void writeWarning(String message); void writeError(String message); void terminate(); + void showData(List> Object); } diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java index b229d764e7..4fb7b37937 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java @@ -1,9 +1,12 @@ package cz.startnet.utils.pgdiff.loader.callables; import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; +import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.regex.Pattern; @@ -15,6 +18,7 @@ import cz.startnet.utils.pgdiff.IProgressReporter; import cz.startnet.utils.pgdiff.PgDiffUtils; +import cz.startnet.utils.pgdiff.loader.jdbc.JdbcType; import ru.taximaxim.codekeeper.apgdiff.ApgdiffConsts.JDBC_CONSTS; public class QueriesBatchCallable extends StatementCallable { @@ -44,12 +48,15 @@ public String call() throws Exception { List queries = batches.get(0); subMonitor.setWorkRemaining(queries.size()); for (String query : queries) { - currQuery = query; PgDiffUtils.checkCancelled(monitor); - st.execute(query); + currQuery = query; + if (st.execute(query) && reporter != null) { + writeResult(); + } writeWarnings(); writeStatus(query); + subMonitor.worked(1); } } else { @@ -78,7 +85,7 @@ public String call() throws Exception { reporter.writeMessage("Script finished"); } } catch (PSQLException ex) { - if (reporter == null) { + if (reporter == null || ex.getServerErrorMessage() == null) { throw ex; } ServerErrorMessage sem = ex.getServerErrorMessage(); @@ -94,6 +101,36 @@ public String call() throws Exception { return JDBC_CONSTS.JDBC_SUCCESS; } + private void writeResult() throws Exception { + List> results = new ArrayList<>(); + try (ResultSet res = st.getResultSet()) { + + ResultSetMetaData meta = res.getMetaData(); + int count = meta.getColumnCount(); + + // add column names as first list + List names = new ArrayList<>(count); + for (int i = 1; i <= count; i++) { + String type = meta.getColumnTypeName(i); + String dealias = JdbcType.DATA_TYPE_ALIASES.get(type); + names.add(meta.getColumnLabel(i) + '\n' + + (dealias == null ? type : dealias)); + } + results.add(names); + + // add other rows + while (res.next()) { + List row = new ArrayList<>(count); + results.add(row); + for (int i = 1; i <= count; i++) { + row.add(res.getObject(i)); + } + } + } + + reporter.showData(results); + } + private void writeWarnings() throws SQLException { if (reporter == null) { return; diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/jdbc/JdbcType.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/jdbc/JdbcType.java index 8824379ea9..3810a91306 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/jdbc/JdbcType.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/jdbc/JdbcType.java @@ -12,7 +12,7 @@ public class JdbcType{ - private static final Map DATA_TYPE_ALIASES; + public static final Map DATA_TYPE_ALIASES; static { Map aliases = new HashMap<>(); diff --git a/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle.properties b/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle.properties index a628617582..5fa0826fd6 100644 --- a/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle.properties +++ b/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle.properties @@ -88,6 +88,7 @@ templates.name.sqlEditor = SQL Editor Templates view.category.name = pgCodeKeeper Views view.name.DepcyView = pg Dependencies view.name.ProjectOverrideView = Object overrides +view.name.ResultSetView = Query result wizard.name.keeperImportWizard = pgCodeKeeper Project wizard.name.keeperNewMsWizard = pgCodeKeeper MS SQL Project diff --git a/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle_ru_RU.properties b/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle_ru_RU.properties index 7ece9f9b80..3b4fdc5377 100644 --- a/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle_ru_RU.properties +++ b/ru.taximaxim.codekeeper.ui/OSGI-INF/l10n/bundle_ru_RU.properties @@ -88,6 +88,7 @@ templates.name.sqlEditor = \u0428\u0430\u0431\u043B\u043E\u043D\u044B \u0440\u04 view.category.name = \u041F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F pgCodeKeeper view.name.DepcyView = pg \u0417\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 view.name.ProjectOverrideView = \u041F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0435 \u043E\u0431\u044A\u0435\u043A\u0442\u044B +view.name.ResultSetView = \u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 wizard.name.keeperImportWizard = \u041F\u0440\u043E\u0435\u043A\u0442 pgCodeKeeper wizard.name.keeperNewMsWizard = MS SQL \u043F\u0440\u043E\u0435\u043A\u0442 pgCodeKeeper diff --git a/ru.taximaxim.codekeeper.ui/plugin.xml b/ru.taximaxim.codekeeper.ui/plugin.xml index 67bddda9f8..3236c8ca61 100644 --- a/ru.taximaxim.codekeeper.ui/plugin.xml +++ b/ru.taximaxim.codekeeper.ui/plugin.xml @@ -874,6 +874,12 @@ class="ru.taximaxim.codekeeper.ui.views.ProjectOverrideView" icon="icons/lib.gif" category="ru.taximaxim.codekeeper.ui.viewsCategory" /> + > results) { + UiSync.exec(PlatformUI.getWorkbench().getDisplay(), () -> { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + try { + ResultSetView viewPart = (ResultSetView) page.showView(VIEW.RESULT_SET_VIEW); + viewPart.addData(results); + } catch (PartInitException e) { + Log.log(e); + } + }); + + } } diff --git a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java new file mode 100644 index 0000000000..d6703ebb5c --- /dev/null +++ b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java @@ -0,0 +1,118 @@ +package ru.taximaxim.codekeeper.ui.views; + +import java.util.Arrays; +import java.util.List; + +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.ColumnViewer; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.jface.viewers.ViewerCell; +import org.eclipse.jface.viewers.ViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +import ru.taximaxim.codekeeper.apgdiff.fileutils.FileUtils; + +public class ResultSetView extends ViewPart { + + private CTabFolder tabFolder; + + @Override + public void createPartControl(Composite parent) { + tabFolder = new CTabFolder(parent, SWT.BOTTOM); + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.minimumWidth = 700; + tabFolder.setLayoutData(gd); + } + + public void addData(List> results) { + if (results.isEmpty()) { + return; + } + + Composite tabComposite = new Composite(tabFolder, SWT.NONE); + tabComposite.setLayout(new GridLayout()); + tabComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + CTabItem tabItem = new CTabItem(tabFolder, SWT.CLOSE); + tabItem.setText(FileUtils.getFileDate()); + tabItem.setControl(tabComposite); + + TableViewer viewer = new TableViewer(tabComposite); + + viewer.setContentProvider(ArrayContentProvider.getInstance()); + viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); + viewer.getTable().setLinesVisible(true); + viewer.getTable().setHeaderVisible(true); + + List names = results.get(0); + + TableViewerColumn num = new TableViewerColumn(viewer, SWT.LEFT); + num.getColumn().setResizable(true); + num.getColumn().setText(""); + num.setLabelProvider(new RowNumberLabelProvider()); + num.getColumn().setWidth(40); + + for (int i = 0; i < names.size(); i++) { + TableViewerColumn col = new TableViewerColumn(viewer, SWT.LEFT); + col.getColumn().setResizable(true); + col.getColumn().setMoveable(true); + col.getColumn().setText(names.get(i).toString()); + col.setLabelProvider(new IndexedColumnLabelProvider(i)); + col.getColumn().setWidth(150); + } + + viewer.setInput(results.subList(1, results.size())); + tabFolder.setSelection(tabItem); + } + + @Override + public void setFocus() { + tabFolder.setFocus(); + } + + private final class IndexedColumnLabelProvider extends ColumnLabelProvider { + private final int i; + + private IndexedColumnLabelProvider(int i) { + this.i = i; + } + + @Override + public String getText(Object element) { + List l = (List) element; + Object obj = l.get(i); + return obj == null ? null : obj.toString(); + } + } + + private final class RowNumberLabelProvider extends ColumnLabelProvider { + + private TableViewer viewer; + + @Override + protected void initialize(ColumnViewer viewer, ViewerColumn column) { + super.initialize(viewer, column); + this.viewer = null; + if (viewer instanceof TableViewer) { + this.viewer = (TableViewer) viewer; + } + } + + @Override + public void update(ViewerCell cell) { + super.update(cell); + if (viewer != null) { + int index = Arrays.asList(viewer.getTable().getItems()).indexOf(cell.getItem()); + cell.setText("" + (index + 1)); + } + } + } +} From 05e73ee27622e24c82ca0d2e086c47403cffc6f9 Mon Sep 17 00:00:00 2001 From: galiev_mr Date: Wed, 6 Mar 2019 15:21:38 +0300 Subject: [PATCH 2/4] added query preview, NULL as --- .../cz/startnet/utils/pgdiff/IProgressReporter.java | 2 +- .../pgdiff/loader/callables/QueriesBatchCallable.java | 6 +++--- .../codekeeper/ui/consoles/UiProgressReporter.java | 4 ++-- .../taximaxim/codekeeper/ui/views/ResultSetView.java | 11 +++++++++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java index 2ea3318d05..8c5d95acaa 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/IProgressReporter.java @@ -7,5 +7,5 @@ public interface IProgressReporter { void writeWarning(String message); void writeError(String message); void terminate(); - void showData(List> Object); + void showData(String query, List> Object); } diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java index 4fb7b37937..892b3bc0ff 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java @@ -52,7 +52,7 @@ public String call() throws Exception { currQuery = query; if (st.execute(query) && reporter != null) { - writeResult(); + writeResult(query); } writeWarnings(); writeStatus(query); @@ -101,7 +101,7 @@ public String call() throws Exception { return JDBC_CONSTS.JDBC_SUCCESS; } - private void writeResult() throws Exception { + private void writeResult(String query) throws Exception { List> results = new ArrayList<>(); try (ResultSet res = st.getResultSet()) { @@ -128,7 +128,7 @@ private void writeResult() throws Exception { } } - reporter.showData(results); + reporter.showData(query, results); } private void writeWarnings() throws SQLException { diff --git a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/consoles/UiProgressReporter.java b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/consoles/UiProgressReporter.java index f458f08aa9..9aab70f9dd 100644 --- a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/consoles/UiProgressReporter.java +++ b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/consoles/UiProgressReporter.java @@ -58,12 +58,12 @@ public void terminate() { } @Override - public void showData(List> results) { + public void showData(String query, List> results) { UiSync.exec(PlatformUI.getWorkbench().getDisplay(), () -> { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { ResultSetView viewPart = (ResultSetView) page.showView(VIEW.RESULT_SET_VIEW); - viewPart.addData(results); + viewPart.addData(query, results); } catch (PartInitException e) { Log.log(e); } diff --git a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java index d6703ebb5c..ddecd50225 100644 --- a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java +++ b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java @@ -16,6 +16,7 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; import org.eclipse.ui.part.ViewPart; import ru.taximaxim.codekeeper.apgdiff.fileutils.FileUtils; @@ -32,7 +33,7 @@ public void createPartControl(Composite parent) { tabFolder.setLayoutData(gd); } - public void addData(List> results) { + public void addData(String query, List> results) { if (results.isEmpty()) { return; } @@ -45,6 +46,12 @@ public void addData(List> results) { tabItem.setText(FileUtils.getFileDate()); tabItem.setControl(tabComposite); + Label l = new Label(tabComposite, SWT.NONE); + + String preview = query.replaceAll("\\s+", " ").trim(); + l.setText(preview.length() > 60 ? preview.substring(0, 60) + " <...> " : preview); + l.setToolTipText(query); + TableViewer viewer = new TableViewer(tabComposite); viewer.setContentProvider(ArrayContentProvider.getInstance()); @@ -89,7 +96,7 @@ private IndexedColumnLabelProvider(int i) { public String getText(Object element) { List l = (List) element; Object obj = l.get(i); - return obj == null ? null : obj.toString(); + return obj == null ? "" : obj.toString(); } } From 69a5813ef5e916646b4e555c37c8e5c7533f3174 Mon Sep 17 00:00:00 2001 From: galiev_mr Date: Wed, 6 Mar 2019 17:27:00 +0300 Subject: [PATCH 3/4] added copy command --- .../codekeeper/ui/views/ResultSetView.java | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java index ddecd50225..1b4ce2adc1 100644 --- a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java +++ b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java @@ -2,10 +2,12 @@ import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewer; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerCell; @@ -13,12 +15,18 @@ import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.part.ViewPart; +import cz.startnet.utils.pgdiff.PgDiffUtils; import ru.taximaxim.codekeeper.apgdiff.fileutils.FileUtils; public class ResultSetView extends ViewPart { @@ -48,8 +56,8 @@ public void addData(String query, List> results) { Label l = new Label(tabComposite, SWT.NONE); - String preview = query.replaceAll("\\s+", " ").trim(); - l.setText(preview.length() > 60 ? preview.substring(0, 60) + " <...> " : preview); + String preview = query.replaceAll("\\s+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$ + l.setText(preview.length() > 60 ? preview.substring(0, 60) + " <...> " : preview); //$NON-NLS-1$ l.setToolTipText(query); TableViewer viewer = new TableViewer(tabComposite); @@ -59,11 +67,41 @@ public void addData(String query, List> results) { viewer.getTable().setLinesVisible(true); viewer.getTable().setHeaderVisible(true); + viewer.getTable().addKeyListener(new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + if ((e.stateMask & SWT.CTRL) == SWT.CTRL && e.keyCode == 'c') { + IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); + if (selection.isEmpty()) { + return; + } + + List obj = (List) selection.getFirstElement(); + String data = obj.stream().map(o -> { + if (o == null) { + return ""; //$NON-NLS-1$ + } else { + String s = o.toString(); + if (s.isEmpty() || s.contains(",") || s.contains(";") //$NON-NLS-1$ //$NON-NLS-2$ + || s.contains("\n") || s.contains("\"")) { //$NON-NLS-1$ //$NON-NLS-2$ + s = PgDiffUtils.quoteName(s); + } + return s; + } + }).collect(Collectors.joining(",")); //$NON-NLS-1$ + + final Clipboard cb = new Clipboard(viewer.getControl().getDisplay()); + cb.setContents(new Object[] {data}, new Transfer[] {TextTransfer.getInstance()}); + } + } + }); + + List names = results.get(0); TableViewerColumn num = new TableViewerColumn(viewer, SWT.LEFT); num.getColumn().setResizable(true); - num.getColumn().setText(""); num.setLabelProvider(new RowNumberLabelProvider()); num.getColumn().setWidth(40); @@ -96,7 +134,7 @@ private IndexedColumnLabelProvider(int i) { public String getText(Object element) { List l = (List) element; Object obj = l.get(i); - return obj == null ? "" : obj.toString(); + return obj == null ? "" : obj.toString(); //$NON-NLS-1$ } } @@ -118,7 +156,7 @@ public void update(ViewerCell cell) { super.update(cell); if (viewer != null) { int index = Arrays.asList(viewer.getTable().getItems()).indexOf(cell.getItem()); - cell.setText("" + (index + 1)); + cell.setText("" + (index + 1)); //$NON-NLS-1$ } } } From bcdcd0c70e8a0e67579f9fe6c8600647dbcd536b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B2=D1=88=D0=B0=20=D0=90=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= Date: Mon, 11 Mar 2019 09:28:05 +0300 Subject: [PATCH 4/4] ResultSetView: Ctrl+C multiple lines; view icon added view initial positions into perspective definition --- .../callables/QueriesBatchCallable.java | 2 +- .../icons/data_table_row.png | Bin 0 -> 384 bytes ru.taximaxim.codekeeper.ui/plugin.xml | 22 ++++--- .../codekeeper/ui/views/ResultSetView.java | 59 ++++++++++-------- 4 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 ru.taximaxim.codekeeper.ui/icons/data_table_row.png diff --git a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java index 892b3bc0ff..06686e2f3e 100644 --- a/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java +++ b/apgdiff/src/main/java/cz/startnet/utils/pgdiff/loader/callables/QueriesBatchCallable.java @@ -101,7 +101,7 @@ public String call() throws Exception { return JDBC_CONSTS.JDBC_SUCCESS; } - private void writeResult(String query) throws Exception { + private void writeResult(String query) throws SQLException { List> results = new ArrayList<>(); try (ResultSet res = st.getResultSet()) { diff --git a/ru.taximaxim.codekeeper.ui/icons/data_table_row.png b/ru.taximaxim.codekeeper.ui/icons/data_table_row.png new file mode 100644 index 0000000000000000000000000000000000000000..e08d872781a0539eedf39018a9fb2ebaf13df398 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^{2Unfx)>bHL)Z$ zMWH;iBtya7(>EYRFO?lA{>0P8F+}71)boaZhaCjm9zKt}9XUbZ5tG1Eh6_dOw@kUC zu%!D*vWwDI=@r6DxmxU0#L6O$f75H#)R?(;+fS4K-S3WlR&Q8Q%zyBPyNLcS+4IZ| z+rMtzaj>23`0}FdZwg;6)tRmplM}Db@K4vW!$kP)8!?4XZ+$0Jtlq^V(eQ4MaN)*_ zrs4Bf@3Z_E6sj$1w`ac(=vnm%^}e>Z>PvvcB=J X-I3JQ$h&bbC?Gst{an^LB{Ts5$hw>n literal 0 HcmV?d00001 diff --git a/ru.taximaxim.codekeeper.ui/plugin.xml b/ru.taximaxim.codekeeper.ui/plugin.xml index 3236c8ca61..9b028e5864 100644 --- a/ru.taximaxim.codekeeper.ui/plugin.xml +++ b/ru.taximaxim.codekeeper.ui/plugin.xml @@ -878,7 +878,7 @@ id="ru.taximaxim.codekeeper.ui.resultsetview" name="%view.name.ResultSetView" class="ru.taximaxim.codekeeper.ui.views.ResultSetView" - icon="icons/app_icon16.png" + icon="icons/data_table_row.png" category="ru.taximaxim.codekeeper.ui.viewsCategory" /> @@ -943,12 +943,6 @@ relationship="stack" relative="org.eclipse.ui.views.ProgressView"> - - + + + + diff --git a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java index 1b4ce2adc1..be5f7c8f38 100644 --- a/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java +++ b/ru.taximaxim.codekeeper.ui/src/ru/taximaxim/codekeeper/ui/views/ResultSetView.java @@ -2,7 +2,6 @@ import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; @@ -28,6 +27,7 @@ import cz.startnet.utils.pgdiff.PgDiffUtils; import ru.taximaxim.codekeeper.apgdiff.fileutils.FileUtils; +import ru.taximaxim.codekeeper.ui.UIConsts; public class ResultSetView extends ViewPart { @@ -37,7 +37,7 @@ public class ResultSetView extends ViewPart { public void createPartControl(Composite parent) { tabFolder = new CTabFolder(parent, SWT.BOTTOM); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); - gd.minimumWidth = 700; + gd.widthHint = 700; tabFolder.setLayoutData(gd); } @@ -71,29 +71,25 @@ public void addData(String query, List> results) { @Override public void keyPressed(KeyEvent e) { - if ((e.stateMask & SWT.CTRL) == SWT.CTRL && e.keyCode == 'c') { - IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); - if (selection.isEmpty()) { - return; - } + IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); + if (selection.isEmpty() || (e.stateMask & SWT.CTRL) != SWT.CTRL || e.keyCode != 'c') { + return; + } - List obj = (List) selection.getFirstElement(); - String data = obj.stream().map(o -> { - if (o == null) { - return ""; //$NON-NLS-1$ - } else { - String s = o.toString(); - if (s.isEmpty() || s.contains(",") || s.contains(";") //$NON-NLS-1$ //$NON-NLS-2$ - || s.contains("\n") || s.contains("\"")) { //$NON-NLS-1$ //$NON-NLS-2$ - s = PgDiffUtils.quoteName(s); - } - return s; - } - }).collect(Collectors.joining(",")); //$NON-NLS-1$ - - final Clipboard cb = new Clipboard(viewer.getControl().getDisplay()); - cb.setContents(new Object[] {data}, new Transfer[] {TextTransfer.getInstance()}); + StringBuilder sb = new StringBuilder(); + for (Object r : selection.toList()) { + List row = (List) r; + for (Object val : row) { + sb.append(valueForCsv(val)); + sb.append(','); + } + // remove trailing comma + sb.setLength(sb.length() - 1); + sb.append(UIConsts._NL); } + + final Clipboard cb = new Clipboard(viewer.getControl().getDisplay()); + cb.setContents(new Object[] {sb.toString()}, new Transfer[] {TextTransfer.getInstance()}); } }); @@ -123,7 +119,20 @@ public void setFocus() { tabFolder.setFocus(); } - private final class IndexedColumnLabelProvider extends ColumnLabelProvider { + private String valueForCsv(Object val) { + if (val == null) { + return ""; //$NON-NLS-1$ + } + String s = val.toString(); + if (s.isEmpty() || s.indexOf(',') != -1 || s.indexOf(';') != -1 + || s.indexOf('\n') != -1 || s.indexOf('"') != -1) { + return PgDiffUtils.quoteName(s); + } else { + return s; + } + } + + private static class IndexedColumnLabelProvider extends ColumnLabelProvider { private final int i; private IndexedColumnLabelProvider(int i) { @@ -138,7 +147,7 @@ public String getText(Object element) { } } - private final class RowNumberLabelProvider extends ColumnLabelProvider { + private static class RowNumberLabelProvider extends ColumnLabelProvider { private TableViewer viewer;