# HG changeset patch # User Matthias Bläsing # Date 1363537022 -3600 # Branch dataview-rework-2 # Node ID 61e4fac73562f9e5918b8cf240bed966ae20d1cf # Parent e74678ab4d8715613a32c9c144f9aac9bd195790 Handle multiple resultsets from sql diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataView.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataView.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataView.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataView.java @@ -43,6 +43,7 @@ */ package org.netbeans.modules.db.dataview.output; +import java.awt.BorderLayout; import java.awt.Component; import java.sql.SQLException; import java.util.ArrayList; @@ -50,7 +51,11 @@ import java.util.Collections; import java.util.List; import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; import org.netbeans.api.db.explorer.DatabaseConnection; +import org.netbeans.modules.db.dataview.meta.DBColumn; import org.netbeans.modules.db.dataview.meta.DBException; import org.openide.awt.StatusDisplayer; import org.openide.util.Mutex; @@ -67,16 +72,17 @@ * @author Ahimanikya Satapathy */ public class DataView { - + private static final int MAX_TAB_LENGTH = 25; private DatabaseConnection dbConn; private List errMessages = new ArrayList(); private String sqlString; // Once Set, Data View assumes it will never change private SQLStatementGenerator stmtGenerator; private SQLExecutionHelper execHelper; - private DataViewPageContext dataPage; - private DataViewUI dataViewUI; + private final List dataPage = new ArrayList(); + private final List dataViewUI = new ArrayList(); + private JComponent container; + private int initialPageSize = org.netbeans.modules.db.dataview.api.DataViewPageContext.getStoredPageSize(); private boolean nbOutputComponent = false; - private boolean hasResultSet = false; private int updateCount; private long executionTime; @@ -97,8 +103,10 @@ dv.dbConn = dbConn; dv.sqlString = sqlString.trim(); dv.nbOutputComponent = false; + if(pageSize > 0) { + dv.initialPageSize = pageSize; + } try { - dv.dataPage = new DataViewPageContext(pageSize); dv.execHelper = new SQLExecutionHelper(dv); dv.execHelper.initialDataLoad(); dv.stmtGenerator = new SQLStatementGenerator(); @@ -120,20 +128,37 @@ * @param dataView DataView Object created using create() * @return a JComponent that after rending the given dataview */ - public List createComponents() { + public synchronized List createComponents() { List results; - if (!hasResultSet) { + if (! hasResultSet()) { return Collections.emptyList(); } + + if(dataPage.size() > 1) { + container = new JTabbedPane(); + } else { + container = new JPanel(new BorderLayout()); + } - synchronized (this) { - DataViewDBTable tblMeta = dataPage.getTableMetaData(); - this.dataViewUI = new DataViewUI(this, dataPage, nbOutputComponent); - dataPage.getModel().setEditable(tblMeta == null ? false : tblMeta.hasOneTable()); + for (int i = 0; i < dataPage.size(); i++) { + DataViewUI ui = new DataViewUI(this, dataPage.get(i), nbOutputComponent); + ui.setName("Result Set " + i); + dataViewUI.add(ui); + container.add(ui); resetToolbar(hasExceptions()); } + + String sql = getSQLString(); + if (sql.length() > MAX_TAB_LENGTH) { + String trimmed = NbBundle.getMessage(DataViewUI.class, "DataViewUI_TrimmedTabName", sql.substring(0, Math.min(sql.length(), MAX_TAB_LENGTH))); + container.setName(trimmed); + } else { + container.setName(sql); + } + container.setToolTipText(sql); + results = new ArrayList(); - results.add(dataViewUI); + results.add(container); return results; } @@ -152,7 +177,7 @@ * @return true if the statement executed has ResultSet, false otherwise. */ public boolean hasResultSet() { - return hasResultSet; + return dataPage.size() > 0; } /** @@ -190,25 +215,40 @@ */ public JButton[] getEditButtons() { assert nbOutputComponent != false; - return dataViewUI.getEditButtons(); + return dataViewUI.get(0).getEditButtons(); } public synchronized void setEditable(boolean editable) { - getDataViewPageContext().getModel().setEditable(editable); + for(DataViewPageContext pageContext: dataPage) { + pageContext.getModel().setEditable(editable); + } } // Used by org.netbeans.modules.db.dataview.api.DataViewPageContext#getPageSize public int getPageSize() { - if (dataViewUI == null) { - return -1; - } - return dataViewUI.getPageSize(); + if (dataViewUI.isEmpty()) { + return initialPageSize; + } + return dataViewUI.get(0).getPageSize(); } // Non API modules follow - DataViewPageContext getDataViewPageContext() { - return dataPage; + List getPageContexts() { + return this.dataPage; + } + + DataViewPageContext getPageContext(int i) { + return this.dataPage.get(i); + } + + DataViewPageContext addPageContext(DataViewDBTable table) { + DataViewPageContext pageContext = new + DataViewPageContext(initialPageSize); + this.dataPage.add(pageContext); + pageContext.setTableMetaData(table); + pageContext.getModel().setColumns(table.getColumns().toArray(new DBColumn[0])); + return pageContext; } DatabaseConnection getDatabaseConnection() { @@ -219,10 +259,6 @@ return sqlString; } - DataViewTableUIModel getDataViewTableUIModel() { - return dataViewUI.getDataViewTableUIModel(); - } - SQLExecutionHelper getSQLExecutionHelper() { if (execHelper == null) { execHelper = new SQLExecutionHelper(this); @@ -237,8 +273,22 @@ return stmtGenerator; } + public void resetEditable() { + for(DataViewPageContext pageContext: dataPage) { + pageContext.resetEditableState(); + } + } + public boolean isEditable() { - return getDataViewPageContext().getModel().isEditable(); + if(dataPage.isEmpty()) { + return false; + } else { + boolean editable = true; + for(DataViewPageContext pageContext: dataPage) { + editable &= pageContext.getModel().isEditable(); + } + return editable; + } } synchronized void disableButtons() { @@ -247,7 +297,9 @@ @Override public void run() { - dataViewUI.disableButtons(); + for(DataViewUI ui: dataViewUI) { + ui.disableButtons(); + } } }); errMessages.clear(); @@ -258,13 +310,13 @@ @Override public void run() { - if (dataViewUI != null) { - if (dataViewUI.getParent() != null) { - dataViewUI.getParent().remove(dataViewUI); + if (container != null) { + if (container != null) { + container.getParent().remove(container); } - dataViewUI.removeAll(); - dataViewUI.repaint(); - dataViewUI.revalidate(); + container.removeAll(); + container.repaint(); + container.revalidate(); } } }); @@ -305,15 +357,13 @@ @Override public void run() { - dataViewUI.resetToolbar(wasError); + for(DataViewUI ui: dataViewUI) { + ui.resetToolbar(wasError); + } } }); } - void setHasResultSet(boolean hasResultSet) { - this.hasResultSet = hasResultSet; - } - void setUpdateCount(int updateCount) { this.updateCount = updateCount; } @@ -321,7 +371,7 @@ void setExecutionTime(long executionTime) { this.executionTime = executionTime; } - + private DataView() { } } diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewActionHandler.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewActionHandler.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewActionHandler.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewActionHandler.java @@ -61,11 +61,11 @@ private final DataViewUI dataViewUI; private final DataView dataView; - DataViewActionHandler(DataViewUI dataViewUI, DataView dataView) { + DataViewActionHandler(DataViewUI dataViewUI, DataView dataView, DataViewPageContext pageContext) { this.dataView = dataView; this.dataViewUI = dataViewUI; - this.dataPage = dataView.getDataViewPageContext(); + this.dataPage = pageContext; this.execHelper = dataView.getSQLExecutionHelper(); } @@ -85,7 +85,7 @@ synchronized (dataView) { if (selectedOnly) { DataViewTableUI rsTable = dataViewUI.getDataViewTableUI(); - DataViewTableUIModel updatedRowCtx = dataView.getDataViewTableUIModel(); + DataViewTableUIModel updatedRowCtx = dataPage.getModel(); int[] rows = rsTable.getSelectedRows(); for (int i = 0; i < rows.length; i++) { int row = rsTable.convertRowIndexToModel(rows[i]); @@ -97,7 +97,7 @@ dataViewUI.setCommitEnabled(false); } } else { - dataView.getDataViewTableUIModel().removeAllUpdates(true); + dataPage.getModel().removeAllUpdates(true); dataViewUI.setCancelEnabled(false); dataViewUI.setCommitEnabled(false); } @@ -157,7 +157,7 @@ void insertActionPerformed() { DBTable table = dataPage.getTableMetaData().getTable(0); - InsertRecordDialog dialog = new InsertRecordDialog(dataView, table); + InsertRecordDialog dialog = new InsertRecordDialog(dataView, dataPage, table); dialog.setLocationRelativeTo(WindowManager.getDefault().getMainWindow()); dialog.setVisible(true); } @@ -167,7 +167,7 @@ String confirmMsg = NbBundle.getMessage(DataViewActionHandler.class, "MSG_confirm_truncate_table") + dataPage.getTableMetaData().getTable(0).getDisplayName(); if ((showYesAllDialog(confirmMsg, confirmMsg)).equals(NotifyDescriptor.YES_OPTION)) { - execHelper.executeTruncate(dataPage.getTableMetaData().getTable(0)); + execHelper.executeTruncate(dataPage, dataPage.getTableMetaData().getTable(0)); } } @@ -182,7 +182,7 @@ String msg = NbBundle.getMessage(DataViewActionHandler.class, "MSG_confirm_permanent_delete"); if ((showYesAllDialog(msg, NbBundle.getMessage(DataViewActionHandler.class, "MSG_confirm_delete"))).equals(NotifyDescriptor.YES_OPTION)) { DBTable table = dataPage.getTableMetaData().getTable(0); - execHelper.executeDeleteRow(table, rsTable); + execHelper.executeDeleteRow(dataPage, table, rsTable); } } } diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewPageContext.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewPageContext.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewPageContext.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewPageContext.java @@ -78,6 +78,11 @@ DataViewDBTable old = this.tableMetaData; this.tableMetaData = tableMetaData; firePropertyChange(PROP_tableMetaData, old, tableMetaData); + resetEditableState(); + } + + void resetEditableState() { + model.setEditable(tableMetaData == null ? false : tableMetaData.hasOneTable()); } int getPageSize() { @@ -134,7 +139,11 @@ return totalRows; } - synchronized void setTotalRows(int totalCount) { + synchronized void setTotalRows(Integer totalCount) { + // Move logic from SQLExectionHelper + if(totalCount == null) { + totalCount = -1; + } int oldTotalRows = this.totalRows; this.totalRows = totalCount; firePropertyChange(PROP_totalRows, oldTotalRows, totalCount); diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewUI.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewUI.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewUI.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/DataViewUI.java @@ -160,20 +160,12 @@ this.setLayout(new BorderLayout()); this.setBorder(BorderFactory.createEmptyBorder()); - String sql = dataView.getSQLString(); - if (sql.length() > MAX_TAB_LENGTH) { - String trimmed = NbBundle.getMessage(DataViewUI.class, "DataViewUI_TrimmedTabName", sql.substring(0, Math.min(sql.length(), MAX_TAB_LENGTH))); - this.setName(trimmed); - } else { - this.setName(sql); - } - this.setToolTipText(sql); // Main pannel with toolbars JPanel panel = initializeMainPanel(nbOutputComponent); this.add(panel, BorderLayout.NORTH); - actionHandler = new DataViewActionHandler(this, dataView); + actionHandler = new DataViewActionHandler(this, dataView, pageContext); //add resultset data panel dataPanel = new DataViewTableUI(this, actionHandler, dataView, pageContext); diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java @@ -101,11 +101,13 @@ private final ResultSetTableModel insertDataModel; private final DBTable insertTable; private final DataView dataView; + private final DataViewPageContext pageContext; InsertRecordTableUI insertRecordTableUI; private JXTableRowHeader rowHeader; - public InsertRecordDialog(DataView dataView, DBTable insertTable) { + public InsertRecordDialog(DataView dataView, DataViewPageContext pageContext, DBTable insertTable) { super(WindowManager.getDefault().getMainWindow(), true); + this.pageContext = pageContext; this.dataView = dataView; this.insertTable = insertTable; @@ -388,7 +390,7 @@ try { Object[] insertedRow = getInsertValues(i); insertSQL = stmtBldr.generateInsertStatement(insertTable, insertedRow); - RequestProcessor.Task task = execHelper.executeInsertRow(insertTable, insertSQL, insertedRow); + RequestProcessor.Task task = execHelper.executeInsertRow(pageContext, insertTable, insertSQL, insertedRow); task.waitFinished(); wasException = dataView.hasExceptions(); } catch (DBException ex) { diff --git a/db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java b/db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java --- a/db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java +++ b/db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java @@ -85,6 +85,7 @@ // the RequestProcessor used for executing statements. private final RequestProcessor rp = new RequestProcessor("SQLStatementExecution", 20, true); // NOI18N private int resultSetScrollType = ResultSet.TYPE_FORWARD_ONLY; + private boolean supportesMultipleResultSets = false; SQLExecutionHelper(DataView dataView) { this.dataView = dataView; @@ -145,6 +146,12 @@ LOGGER.log(Level.WARNING, "Exception while querying database for scrollable resultset support"); } + try { + supportesMultipleResultSets = conn.getMetaData().supportsMultipleResultSets(); + } catch (SQLException ex) { + LOGGER.log(Level.INFO, "Database driver throws exception when checking for multiple resultset support."); + } + DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn); String sql = dataView.getSQLString(); @@ -157,8 +164,11 @@ return; } - executeSQLStatement(stmt, sql); + // Read multiple Resultsets + boolean resultSet = executeSQLStatement(stmt, sql); + // @todo: This needs clearing up => in light of request for + // the ability to disable autocommit, this need to go if (dataView.getUpdateCount() != -1) { if (!conn.getAutoCommit()) { conn.commit(); @@ -166,56 +176,90 @@ return; } - ResultSet rs = null; - if (Thread.interrupted()) { return; } - if (dataView.hasResultSet()) { - rs = stmt.getResultSet(); - } - if (rs == null) { + // @todo: This needs clearing up => in light of request for + // the ability to disable autocommit, this need to go + if (! resultSet) { if (!conn.getAutoCommit()) { conn.commit(); } return; } - Collection tables = dbMeta.generateDBTables( - rs, sql, isSelectStatement(sql)); - DataViewDBTable dvTable = new DataViewDBTable(tables); - dataView.getDataViewPageContext().getModel().setColumns( - dvTable.getColumns().toArray(new DBColumn[0])); - dataView.getDataViewPageContext().setTableMetaData(dvTable); - if (resultSetNeedsReloading(dvTable)) { - executeSQLStatement(stmt, sql); - rs = stmt.getResultSet(); + + boolean needReread = false; + ResultSet rs = null; + int count = 0; + + do { + if (resultSet) { + rs = stmt.getResultSet(); + + Collection tables = dbMeta.generateDBTables( + rs, sql, isSelectStatement(sql)); + DataViewDBTable dvTable = new DataViewDBTable(tables); + + DataViewPageContext pageContext = dataView.addPageContext( + dvTable); + + needReread |= resultSetNeedsReloading(dvTable); + + if(! needReread) { + loadDataFrom(pageContext, rs, true); + } + } else { + // @todo: Do somethink intelligent with the updatecounts + count = stmt.getUpdateCount(); + if (count >= 0) { + } else { + } + } + if(supportesMultipleResultSets) { + resultSet = stmt.getMoreResults(); + } else { + resultSet = false; + } + } while (resultSet || count != -1); + + if (needReread) { + + resultSet = resultSet = executeSQLStatement(stmt, sql); + + int res = -1; + + do { + if (resultSet) { + res++; + rs = stmt.getResultSet(); + + DataViewPageContext pageContext = dataView.getPageContext( + res); + + if (!needReread) { + loadDataFrom(pageContext, rs, true); + } + } else { + // @todo: Do somethink intelligent with the updatecounts + count = stmt.getUpdateCount(); + if (count >= 0) { + } else { + } + } + if(supportesMultipleResultSets) { + resultSet = stmt.getMoreResults(); + } else { + resultSet = false; + } + } while (resultSet || count != -1); } - loadDataFrom(dvTable, rs); - - if (Thread.interrupted()) { - return; - } - - Integer result = null; - - if (rs.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE - || rs.getType() == ResultSet.TYPE_SCROLL_SENSITIVE) { - try { - rs.last(); - result = rs.getRow(); - } catch (SQLException ex) { - LOGGER.log(Level.INFO, - "Failed to jump to end of SQL Statement [{0}], cause: {1}", - new Object[]{sql, ex}); - } - } - - setTotalCount(result); - + DataViewUtils.closeResources(rs); } catch (SQLException sqlEx) { this.ex = sqlEx; + } catch (Exception ex) { + System.out.println(ex); } finally { DataViewUtils.closeResources(stmt); synchronized (Loader.this) { @@ -264,7 +308,10 @@ } } - RequestProcessor.Task executeInsertRow(final DBTable table, final String insertSQL, final Object[] insertedRow) { + RequestProcessor.Task executeInsertRow(final DataViewPageContext pageContext, + final DBTable table, + final String insertSQL, + final Object[] insertedRow) { String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_insert"); SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "") { @@ -301,20 +348,20 @@ @Override public void finished() { - dataView.setEditable(true); + dataView.resetEditable(); commitOrRollback(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_insert_command")); } @Override protected void executeOnSucess() { - if (dataView.getDataViewPageContext().getTotalRows() < 0) { - dataView.getDataViewPageContext().setTotalRows(0); - dataView.getDataViewPageContext().first(); + if (pageContext.getTotalRows() < 0) { + pageContext.setTotalRows(0); + pageContext.first(); } - dataView.getDataViewPageContext().incrementRowSize(1); + pageContext.incrementRowSize(1); // refresh when required - if (dataView.getDataViewPageContext().refreshRequiredOnInsert()) { + if (pageContext.refreshRequiredOnInsert()) { SQLExecutionHelper.this.executeQuery(); } else { reinstateToolbar(); @@ -327,7 +374,7 @@ return task; } - void executeDeleteRow(final DBTable table, final DataViewTableUI rsTable) { + void executeDeleteRow(final DataViewPageContext pageContext, final DBTable table, final DataViewTableUI rsTable) { String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_delete"); final int[] rows = rsTable.getSelectedRows(); for(int i = 0; i < rows.length; i++) { @@ -378,13 +425,13 @@ @Override public void finished() { - dataView.setEditable(true); + dataView.resetEditable(); commitOrRollback(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_delete_command")); } @Override protected void executeOnSucess() { - dataView.getDataViewPageContext().decrementRowSize(rows.length); + pageContext.decrementRowSize(rows.length); SQLExecutionHelper.this.executeQuery(); } }; @@ -466,13 +513,13 @@ @Override public void finished() { - dataView.setEditable(true); + dataView.resetEditable(); commitOrRollback(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_update_command")); } @Override protected void executeOnSucess() { - DataViewTableUIModel tblContext = dataView.getDataViewTableUIModel(); + DataViewTableUIModel tblContext = rsTable.getModel(); for (Integer key : keysToRemove) { tblContext.removeUpdateForSelectedRow(key, false); } @@ -485,7 +532,7 @@ } // Truncate is allowed only when there is single table used in the query. - void executeTruncate(final DBTable dbTable) { + void executeTruncate(final DataViewPageContext pageContext, final DBTable dbTable) { String msg = NbBundle.getMessage(SQLExecutionHelper.class, "MSG_truncate_table_progress"); String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_truncate"); SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, msg) { @@ -516,8 +563,8 @@ @Override protected void executeOnSucess() { - dataView.getDataViewPageContext().setTotalRows(0); - dataView.getDataViewPageContext().first(); + pageContext.setTotalRows(0); + pageContext.first(); SQLExecutionHelper.this.executeQuery(); } }; @@ -545,46 +592,53 @@ } boolean getTotal = false; + + // Get total row count + for (DataViewPageContext pageContext : dataView.getPageContexts()) { + if (pageContext.getTotalRows() == -1) { + getTotal = true; + break; + } + } - // Get total row count - if (dataView.getDataViewPageContext().getTotalRows() == -1) { - getTotal = true; - } stmt = prepareSQLStatement(conn, sql, getTotal); - // Execute the query + // Execute the query and retrieve all resultsets + // using: http://www.xyzws.com/Javafaq/how-to-use-methods-getresultset-or-getupdatecount-to-retrieve-the-results/175 try { if (Thread.interrupted()) { return; } - executeSQLStatement(stmt, sql); - if (dataView.hasResultSet()) { - ResultSet rs = stmt.getResultSet(); - loadDataFrom(dataView.getDataViewPageContext().getTableMetaData(), - rs); + + boolean resultSet = executeSQLStatement(stmt, sql); + + ResultSet rs = null; + int res = -1; + int count = 0; - if (getTotal) { - Integer result = null; + do { + if (resultSet) { + res++; + DataViewPageContext pageContext = dataView.getPageContext( + res); + rs = stmt.getResultSet(); - if (rs.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE - || rs.getType() == ResultSet.TYPE_SCROLL_SENSITIVE) { - try { - rs.last(); - result = rs.getRow(); - } catch (SQLException ex) { - LOGGER.log(Level.INFO, - "Failed to jump to end of SQL Statement [{0}], cause: {1}", - new Object[]{sql, ex}); - } + loadDataFrom(pageContext, rs, getTotal); + } else { + // @todo: Do somethink intelligent with the updatecounts + count = stmt.getUpdateCount(); + if (count >= 0) { + } else { } - - setTotalCount(result); } - - DataViewUtils.closeResources(rs); - } else { - return; - } + if(supportesMultipleResultSets) { + resultSet = stmt.getMoreResults(); + } else { + resultSet = false; + } + } while (resultSet || count != -1); + + DataViewUtils.closeResources(rs); } catch (SQLException sqlEx) { String title = NbBundle.getMessage(SQLExecutionHelper.class, "MSG_error"); String msg = NbBundle.getMessage(SQLExecutionHelper.class, "Confirm_Close"); @@ -596,14 +650,12 @@ } throw sqlEx; } - - } @Override public void finished() { DataViewUtils.closeResources(stmt); - dataView.setEditable(lastEditState); + dataView.resetEditable(); synchronized (dataView) { if (error) { dataView.setErrorStatusText(ex); @@ -631,16 +683,16 @@ task.schedule(0); } - void loadDataFrom(DataViewDBTable tblMeta, ResultSet rs) throws SQLException { + void loadDataFrom(DataViewPageContext pageContext, ResultSet rs, boolean getTotal) throws SQLException { if (rs == null) { return; } - int pageSize = dataView.getDataViewPageContext().getPageSize(); - int startFrom = dataView.getDataViewPageContext().getCurrentPos(); + int pageSize = pageContext.getPageSize(); + int startFrom = pageContext.getCurrentPos(); List rows = new ArrayList(); - int colCnt = tblMeta.getColumnCount(); + int colCnt = pageContext.getTableMetaData().getColumnCount(); try { boolean hasNext = false; boolean needSlowSkip = true; @@ -677,7 +729,8 @@ Object[] row = new Object[colCnt]; for (int i = 0; i < colCnt; i++) { - row[i] = DBReadWriteHelper.readResultSet(rs, tblMeta.getColumn(i), i + 1); + row[i] = DBReadWriteHelper.readResultSet(rs, + pageContext.getTableMetaData().getColumn(i), i + 1); } rows.add(row); rowCnt++; @@ -688,19 +741,29 @@ hasNext = false; } } + + if (getTotal) { + Integer result = null; + + if (rs.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE + || rs.getType() == ResultSet.TYPE_SCROLL_SENSITIVE) { + try { + rs.last(); + result = rs.getRow(); + } catch (SQLException ex) { + LOGGER.log(Level.INFO, + "Failed to jump to end of SQL Statement '{0}' - cause: {1}", + new Object[]{dataView.getSQLString(), ex}); + } + } + + pageContext.setTotalRows(result); + } } catch (SQLException e) { LOGGER.log(Level.SEVERE, "Failed to set up table model.", e); // NOI18N throw e; } finally { - dataView.getDataViewPageContext().getModel().setData(rows); - } - } - - void setTotalCount(Integer count) { - if (count == null) { - dataView.getDataViewPageContext().setTotalRows(-1); - } else { - dataView.getDataViewPageContext().setTotalRows(count); + pageContext.getModel().setData(rows); } } @@ -710,11 +773,10 @@ stmt = conn.prepareCall(sql, resultSetScrollType, ResultSet.CONCUR_READ_ONLY); } else if (isSelectStatement(sql)) { stmt = conn.createStatement(resultSetScrollType, ResultSet.CONCUR_READ_ONLY); - int pageSize = dataView.getDataViewPageContext().getPageSize(); - - // hint to fetch "pagesize" elements en-block + + // set a reasonable fetchsize try { - stmt.setFetchSize(pageSize); + stmt.setFetchSize(50); } catch (SQLException e) { // ignore - used only as a hint to the driver to optimize LOGGER.log(Level.WARNING, "Unable to set Fetch size", e); // NOI18N @@ -725,10 +787,23 @@ // only usable for "non-total" resultsets if (!needTotal) { try { - stmt.setMaxRows( - dataView.getDataViewPageContext().getCurrentPos() + pageSize); + Integer maxRows = 0; + for (DataViewPageContext pageContext : dataView.getPageContexts()) { + int currentRows = pageContext.getCurrentPos(); + int pageSize = pageContext.getPageSize(); + if (pageSize <= 0) { + maxRows = 0; + break; + } else { + maxRows = Math.max(maxRows, currentRows + pageSize); + } + } + stmt.setMaxRows(maxRows); } catch (SQLException exc) { LOGGER.log(Level.WARNING, "Unable to set Max row count", exc); // NOI18N + try { + stmt.setMaxRows(0); + } catch (SQLException ex) {} } } } else { @@ -759,14 +834,13 @@ long executionTime = System.currentTimeMillis() - startTime; synchronized (dataView) { - dataView.setHasResultSet(isResultSet); dataView.setUpdateCount(stmt.getUpdateCount()); dataView.setExecutionTime(executionTime); } return isResultSet; } - private void executePreparedStatement(PreparedStatement stmt) throws SQLException { + private boolean executePreparedStatement(PreparedStatement stmt) throws SQLException { long startTime = System.currentTimeMillis(); boolean isResultSet = stmt.execute(); @@ -775,10 +849,10 @@ dataView.setInfoStatusText(NbBundle.getMessage(SQLExecutionHelper.class, "MSG_execution_success", execTimeStr)); synchronized (dataView) { - dataView.setHasResultSet(isResultSet); dataView.setUpdateCount(stmt.getUpdateCount()); dataView.setExecutionTime(executionTime); } + return isResultSet; } private boolean isSelectStatement(String queryString) { diff --git a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewDBTableTest.java b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewDBTableTest.java --- a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewDBTableTest.java +++ b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewDBTableTest.java @@ -99,7 +99,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); DBTable result = instance.getTable(0); assertNotNull(result); assertEquals(11, instance.getColumnCount()); @@ -112,7 +112,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); int expResult = 1; int result = instance.getTableCount(); assertEquals(expResult, result); @@ -125,7 +125,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); boolean expResult = true; boolean result = instance.hasOneTable(); assertEquals(expResult, result); @@ -138,7 +138,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); String expResult = "SIMPLETABLE"; String result = instance.getFullyQualifiedName(0, false); assertEquals(expResult, result); @@ -151,7 +151,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); int expResult = 12; int result = instance.getColumnType(2); assertEquals(expResult, result); @@ -164,7 +164,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); String expResult = "DATEC"; String result = instance.getColumnName(index); assertEquals(expResult, result); @@ -177,7 +177,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance = dv.getPageContext(0).getTableMetaData(); String expResult = "TINYINTC"; String result = instance.getQualifiedName(0, false); assertEquals(expResult, result); @@ -190,7 +190,7 @@ int index = 5; String sqlStr = context.getSqlSelect(); DataView dv = DataView.create(dbconn, sqlStr, index); - DataViewDBTable instance = dv.getDataViewPageContext().getTableMetaData(); + DataViewDBTable instance =dv.getPageContext(0).getTableMetaData(); int expResult = 11; int result = instance.getColumnCount(); assertEquals(expResult, result); diff --git a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewTest.java b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewTest.java --- a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewTest.java +++ b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/DataViewTest.java @@ -156,7 +156,8 @@ ResultSet rset = stmt.executeQuery(sqlStr); Collection tables = dbMeta.generateDBTables(rset, sqlStr, true); //generateDBTables(rset); DataViewDBTable expResult = new DataViewDBTable(tables); - DataViewDBTable result = instance.getDataViewPageContext().getTableMetaData(); + DataViewPageContext pageContext = instance.getPageContext(0); + DataViewDBTable result = pageContext.getTableMetaData(); assertEquals(expResult.getQualifiedName(0, false), result.getQualifiedName(0, false)); assertEquals(expResult.getColumnCount(), result.getColumnCount()); assertEquals(expResult.getColumnType(2), result.getColumnType(2)); @@ -170,7 +171,7 @@ String sqlStr =context.getSqlSelect(); int pageSize = 4; DataView instance = DataView.create(dbconn, sqlStr, pageSize); - DataViewPageContext result = instance.getDataViewPageContext(); + DataViewPageContext result = instance.getPageContext(0); assertEquals(1, result.getTotalRows()); assertTrue(result.hasDataRows()); } diff --git a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/InsertRecordTableUITest.java b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/InsertRecordTableUITest.java --- a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/InsertRecordTableUITest.java +++ b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/InsertRecordTableUITest.java @@ -97,9 +97,10 @@ DataView dv = DataView.create(dbconn, sqlString, 5); dv.createComponents(); - DBTable table = dv.getDataViewPageContext().getTableMetaData().getTable(0); + DataViewPageContext pageContext = dv.getPageContext(0); + DBTable table = pageContext.getTableMetaData().getTable(0); - InsertRecordDialog ird = new InsertRecordDialog(dv, table); + InsertRecordDialog ird = new InsertRecordDialog(dv, pageContext, table); ResultSetTableModel model = ird.insertRecordTableUI.getModel(); ird.insertRecordTableUI.appendEmptyRow(); diff --git a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelperTest.java b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelperTest.java --- a/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelperTest.java +++ b/db.dataview/test/unit/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelperTest.java @@ -110,4 +110,4 @@ instance.initialDataLoad(); assertNotNull(instance); } -} +} \ No newline at end of file