From dc96693fc937cfd8de5901976d158de55b817c09 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Fri, 17 May 2019 01:46:56 +0300 Subject: [PATCH] PG: ref cursors reading support Former-commit-id: fd5a033857ffcd49007d8613a5b48d11dc14a3f8 --- .../data/PostgreRefCursorValueHandler.java | 25 ++++++++----------- .../ui/data/dialogs/CursorViewDialog.java | 12 ++++++++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreRefCursorValueHandler.java b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreRefCursorValueHandler.java index fb2330d31a..65cbe909b7 100644 --- a/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreRefCursorValueHandler.java +++ b/plugins/org.jkiss.dbeaver.ext.postgresql/src/org/jkiss/dbeaver/ext/postgresql/model/data/PostgreRefCursorValueHandler.java @@ -16,30 +16,18 @@ */ package org.jkiss.dbeaver.ext.postgresql.model.data; -import org.jkiss.code.NotNull; -import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.ext.postgresql.PostgreUtils; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataSource; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataType; -import org.jkiss.dbeaver.ext.postgresql.model.PostgreDataTypeAttribute; -import org.jkiss.dbeaver.model.data.DBDComposite; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement; import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet; import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession; -import org.jkiss.dbeaver.model.impl.jdbc.JDBCStructImpl; -import org.jkiss.dbeaver.model.impl.jdbc.data.JDBCComposite; -import org.jkiss.dbeaver.model.impl.jdbc.data.JDBCCompositeStatic; +import org.jkiss.dbeaver.model.impl.jdbc.data.JDBCCursor; import org.jkiss.dbeaver.model.impl.jdbc.data.handlers.JDBCStructValueHandler; import org.jkiss.dbeaver.model.struct.DBSTypedObject; +import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Struct; -import java.sql.Types; -import java.util.Collection; -import java.util.Iterator; /** * PostgreArrayValueHandler @@ -52,7 +40,14 @@ public class PostgreRefCursorValueHandler extends JDBCStructValueHandler { protected Object fetchColumnValue(DBCSession session, JDBCResultSet resultSet, DBSTypedObject type, int index) throws DBCException, SQLException { // Fetch as string (#1735) // Fetching cursor as object will close it so it won;'t be possible to use cursor in consequent queries - return resultSet.getString(index); + Object object = resultSet.getObject(index); + if (object instanceof ResultSet) { + return new JDBCCursor( + (JDBCSession) session, + (ResultSet) object, + type.getTypeName()); + } + return object; } @Override diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/dialogs/CursorViewDialog.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/dialogs/CursorViewDialog.java index c959b62331..f5eb4b94b3 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/dialogs/CursorViewDialog.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/dialogs/CursorViewDialog.java @@ -179,7 +179,12 @@ public class CursorViewDialog extends ValueViewDialog implements IResultSetConta @Override public IResultSetDecorator createResultSetDecorator() { - return new QueryResultsDecorator(); + return new QueryResultsDecorator() { + @Override + public long getDecoratorFeatures() { + return FEATURE_PANELS | FEATURE_STATUS_BAR; + } + }; } private class CursorDataContainer implements DBSDataContainer { @@ -197,6 +202,11 @@ public class CursorViewDialog extends ValueViewDialog implements IResultSetConta { DBCStatistics statistics = new DBCStatistics(); DBRProgressMonitor monitor = session.getProgressMonitor(); + try { + value.moveTo((int) firstRow); + } catch (DBCException e) { + log.debug(e); + } DBCResultSet dbResult = value; try { long startTime = System.currentTimeMillis(); -- GitLab