# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: /home/matthias/NetBeansProjects/core-main # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java --- db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java +++ db.dataview/src/org/netbeans/modules/db/dataview/output/InsertRecordDialog.java @@ -393,52 +393,38 @@ return; } - // Get out of AWT thread because SQLExecutionHelper does calls to AWT - // and we need to wait here to show possible exceptions. + // Get out of AWT thread new SwingWorker() { @Override protected Integer doInBackground() throws Exception { SQLStatementGenerator stmtBldr = dataView.getSQLStatementGenerator(); SQLExecutionHelper execHelper = dataView.getSQLExecutionHelper(); + String inserts[] = new String[rows]; + for (int i = 0; i < rows; i++) { - boolean wasException; - try { - Object[] insertedRow = insertedRows[i]; - String insertSQL = stmtBldr.generateInsertStatement(insertTable, insertedRow); - RequestProcessor.Task task = execHelper.executeInsertRow(pageContext, insertTable, insertSQL, insertedRow); - task.waitFinished(); - wasException = dataView.hasExceptions(); - } catch (DBException ex) { - LOG.log(Level.INFO, ex.getLocalizedMessage(), ex); - DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message(ex.getLocalizedMessage())); - wasException = true; + inserts[i] = stmtBldr.generateInsertStatement(insertTable, insertedRows[i]); } - if (wasException) { - return i; + + return execHelper.executeInsertRow(pageContext, insertTable, inserts, insertedRows); } - } - return null; - } @Override protected void done() { - Integer brokeOn; + Integer doneCount; try { - brokeOn = get(); + doneCount = get(); - if (brokeOn == null) { + if (doneCount == rows) { dispose(); } else { // remove i already inserted - for (int j = 0; j < brokeOn; j++) { + for (int j = 0; j < doneCount; j++) { insertRecordTableUI.getModel().removeRow(0); } } - } catch (InterruptedException ex) { + } catch (InterruptedException | ExecutionException ex) { throw new RuntimeException(ex); - } catch (ExecutionException ex) { - throw new RuntimeException(ex); } } }.execute(); Index: db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java --- db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java +++ db.dataview/src/org/netbeans/modules/db/dataview/output/SQLExecutionHelper.java @@ -295,24 +295,26 @@ } } - RequestProcessor.Task executeInsertRow(final DataViewPageContext pageContext, + int executeInsertRow(final DataViewPageContext pageContext, final DBTable table, - final String insertSQL, - final Object[] insertedRow) { - dataView.setEditable(false); + final String[] insertSQLs, + final Object[][] insertedRows) { - String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_insert"); - SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "", true) { + assert (! SwingUtilities.isEventDispatchThread()); - @Override - public void execute() throws SQLException, DBException { dataView.setEditable(false); - List columns = table.getColumnList(); - PreparedStatement pstmt = conn.prepareStatement(insertSQL); + + int done = 0; + Exception caughtException = null; + try { + List columns = table.getColumnList(); + + for (int j = 0; j < insertSQLs.length; j++) { + try (PreparedStatement pstmt = dataView.getDatabaseConnection().getJDBCConnection().prepareStatement(insertSQLs[j])) { int pos = 1; - for (int i = 0; i < insertedRow.length; i++) { - Object val = insertedRow[i]; + for (int i = 0; i < insertedRows[j].length; i++) { + Object val = insertedRows[j][i]; // Check for Constant e.g , , etc if (DataViewUtils.isSQLConstantString(val, columns.get(i))) { @@ -324,54 +326,57 @@ DBReadWriteHelper.setAttributeValue(pstmt, pos++, colType, val); } - executePreparedStatement(pstmt); - int rows = dataView.getUpdateCount(); + int rows = pstmt.executeUpdate(); + if (rows != 1) { - error = true; - errorMsg = NbBundle.getMessage(SQLExecutionHelper.class, "MSG_failure_insert_rows"); + throw new SQLException("MSG_failure_insert_rows"); } - } finally { - DataViewUtils.closeResources(pstmt); + done++; } } - - @Override - public void finished() { + } catch (DBException | SQLException ex) { + LOGGER.log(Level.INFO, ex.getLocalizedMessage(), ex); + caughtException = ex; + } finally { dataView.resetEditable(); - commitOrRollback(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_insert_command")); } - @Override - protected void executeOnSucess() { + final int finalDone = done; + final Exception finalCaught = caughtException; + // refresh when required Boolean needRequery = Mutex.EVENT.readAccess(new Mutex.Action() { @Override public Boolean run() { + if (finalCaught != null) { + DialogDisplayer.getDefault().notifyLater( + new NotifyDescriptor.Message( + finalCaught.getLocalizedMessage())); + } if (pageContext.getTotalRows() < 0) { pageContext.setTotalRows(0); pageContext.first(); } - pageContext.incrementRowSize(1); + pageContext.incrementRowSize(finalDone); return pageContext.refreshRequiredOnInsert(); - }; + } + ; }); - if(needRequery) { + if (needRequery) { SQLExecutionHelper.this.executeQuery(); } else { Mutex.EVENT.readAccess(new Runnable() { @Override public void run() { - reinstateToolbar(); + synchronized (dataView) { + dataView.resetToolbar(false); } + } }); } + + return done; } - }; - RequestProcessor.Task task = rp.create(executor); - executor.setTask(task); - task.schedule(0); - return task; - } void executeDeleteRow(final DataViewPageContext pageContext, final DBTable table, final DataViewTableUI rsTable) { dataView.setEditable(false);