From 8187191a2d5d7d4e72aced28ff57bcd1bb70a0d8 Mon Sep 17 00:00:00 2001 From: "Sergei.Rider" Date: Tue, 26 Dec 2017 20:44:24 +0300 Subject: [PATCH] #1808 RSV data container Former-commit-id: 3371d61260c6f2b2391b66c82adef8918a326460 --- .../resultset/ResultSetDataContainer.java | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java new file mode 100644 index 0000000000..0befc31662 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetDataContainer.java @@ -0,0 +1,216 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.controls.resultset; + +import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBUtils; +import org.jkiss.dbeaver.model.data.DBDAttributeBinding; +import org.jkiss.dbeaver.model.data.DBDDataFilter; +import org.jkiss.dbeaver.model.data.DBDDataReceiver; +import org.jkiss.dbeaver.model.data.DBDValueMeta; +import org.jkiss.dbeaver.model.exec.DBCAttributeMetaData; +import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.exec.DBCExecutionSource; +import org.jkiss.dbeaver.model.exec.DBCResultSet; +import org.jkiss.dbeaver.model.exec.DBCResultSetMetaData; +import org.jkiss.dbeaver.model.exec.DBCSession; +import org.jkiss.dbeaver.model.exec.DBCStatement; +import org.jkiss.dbeaver.model.exec.DBCStatistics; +import org.jkiss.dbeaver.model.struct.DBSDataContainer; +import org.jkiss.dbeaver.model.struct.DBSObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Client-side data container. + * Wraps RSV model and original data container. + */ +public class ResultSetDataContainer implements DBSDataContainer { + + private static final Log log = Log.getLog(ResultSetDataContainer.class); + + private final ResultSetDataContainer dataContainer; + private final ResultSetModel model; + + public ResultSetDataContainer(ResultSetDataContainer dataContainer, ResultSetModel model) { + this.dataContainer = dataContainer; + this.model = model; + } + + @Override + public String getDescription() { + return dataContainer.getDescription(); + } + + @Override + public DBSObject getParentObject() { + return dataContainer.getParentObject(); + } + + @Override + public DBPDataSource getDataSource() { + return dataContainer.getDataSource(); + } + + @Override + public int getSupportedFeatures() { + return DATA_SELECT | DATA_COUNT; + } + + @Override + public DBCStatistics readData(DBCExecutionSource source, DBCSession session, DBDDataReceiver dataReceiver, DBDDataFilter dataFilter, long firstRow, long maxRows, long flags) throws DBCException { + DBCStatistics statistics = new DBCStatistics(); + + long startTime = System.currentTimeMillis(); + + statistics.setExecuteTime(System.currentTimeMillis() - startTime); + + //LocalSta + ModelResultSet resultSet = new ModelResultSet(session); + long resultCount = 0; + try { + dataReceiver.fetchStart(session, resultSet, firstRow, maxRows); + while (resultSet.nextRow()) { + resultCount++; + dataReceiver.fetchRow(session, resultSet); + } + } finally { + try { + dataReceiver.fetchEnd(session, resultSet); + } catch (DBCException e) { + log.error("Error while finishing result set fetch", e); //$NON-NLS-1$ + } + resultSet.close(); + dataReceiver.close(); + } + statistics.setFetchTime(System.currentTimeMillis() - startTime); + statistics.setRowsFetched(resultCount); + return statistics; + } + + @Override + public long countData(DBCExecutionSource source, DBCSession session, DBDDataFilter dataFilter) throws DBCException { + return model.getRowCount(); + } + + @Override + public String getName() { + return dataContainer.getName(); + } + + @Override + public boolean isPersisted() { + return dataContainer.isPersisted(); + } + + private class ModelResultSet implements DBCResultSet { + + private final DBCSession session; + private ResultSetRow curRow; + + ModelResultSet(DBCSession session) { + this.session = session; + } + + @Override + public DBCSession getSession() { + return session; + } + + @Override + public DBCStatement getSourceStatement() { + return null; + } + + @Override + public Object getAttributeValue(int index) throws DBCException { + return model.getCellValue(model.getVisibleAttribute(index), curRow); + } + + @Override + public Object getAttributeValue(String name) throws DBCException { + DBDAttributeBinding attr = DBUtils.findObject(model.getVisibleAttributes(), name); + if (attr == null) { + throw new DBCException("Attribute '" + name + "' not found"); + } + return model.getCellValue(attr, curRow); + } + + @Override + public DBDValueMeta getAttributeValueMeta(int index) throws DBCException { + return null; + } + + @Override + public DBDValueMeta getRowMeta() throws DBCException { + return null; + } + + @Override + public boolean nextRow() throws DBCException { + if (curRow == null) { + if (model.getRowCount() == 0) { + return false; + } + curRow = model.getRow(0); + } else { + if (curRow.getRowNumber() >= model.getRowCount() - 1) { + return false; + } + curRow = model.getRow(curRow.getRowNumber() + 1); + } + return true; + } + + @Override + public boolean moveTo(int position) throws DBCException { + if (position >= model.getRowCount() - 1) { + return false; + } + curRow = model.getRow(position); + return true; + } + + @Override + public DBCResultSetMetaData getMeta() throws DBCException { + return new DBCResultSetMetaData() { + @Override + public List getAttributes() { + DBDAttributeBinding[] attributes = model.getAttributes(); + List meta = new ArrayList<>(attributes.length); + for (DBDAttributeBinding attribute : attributes) { + meta.add(attribute.getMetaAttribute()); + } + return meta; + } + }; + } + + @Override + public String getResultSetName() throws DBCException { + return "ClientResults"; + } + + @Override + public void close() { + // do nothing + } + } + +} -- GitLab