Lines 51-56
Link Here
|
51 |
import java.sql.Types; |
51 |
import java.sql.Types; |
52 |
import java.text.NumberFormat; |
52 |
import java.text.NumberFormat; |
53 |
import java.util.ArrayList; |
53 |
import java.util.ArrayList; |
|
|
54 |
import java.util.Arrays; |
54 |
import java.util.Collection; |
55 |
import java.util.Collection; |
55 |
import java.util.HashSet; |
56 |
import java.util.HashSet; |
56 |
import java.util.List; |
57 |
import java.util.List; |
Lines 86-91
Link Here
|
86 |
private static final String LIMIT_CLAUSE = "LIMIT "; // NOI18N |
87 |
private static final String LIMIT_CLAUSE = "LIMIT "; // NOI18N |
87 |
public static final String OFFSET_CLAUSE = "OFFSET "; // NOI18N |
88 |
public static final String OFFSET_CLAUSE = "OFFSET "; // NOI18N |
88 |
private static final Logger LOGGER = Logger.getLogger(SQLExecutionHelper.class.getName()); |
89 |
private static final Logger LOGGER = Logger.getLogger(SQLExecutionHelper.class.getName()); |
|
|
90 |
private boolean limitSupported = false; |
89 |
|
91 |
|
90 |
SQLExecutionHelper(DataView dataView) { |
92 |
SQLExecutionHelper(DataView dataView) { |
91 |
this.dataView = dataView; |
93 |
this.dataView = dataView; |
Lines 133-139
Link Here
|
133 |
throw new SQLException(msg, t); |
135 |
throw new SQLException(msg, t); |
134 |
} |
136 |
} |
135 |
DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn); |
137 |
DBMetaDataFactory dbMeta = new DBMetaDataFactory(conn); |
136 |
dataView.setLimitSupported(dbMeta.supportsLimit()); |
138 |
limitSupported = dbMeta.supportsLimit(); |
137 |
String sql = dataView.getSQLString(); |
139 |
String sql = dataView.getSQLString(); |
138 |
boolean isSelect = isSelectStatement(sql); |
140 |
boolean isSelect = isSelectStatement(sql); |
139 |
|
141 |
|
Lines 145-150
Link Here
|
145 |
if (Thread.interrupted()) { |
147 |
if (Thread.interrupted()) { |
146 |
return; |
148 |
return; |
147 |
} |
149 |
} |
|
|
150 |
|
148 |
executeSQLStatement(stmt, sql); |
151 |
executeSQLStatement(stmt, sql); |
149 |
|
152 |
|
150 |
if (dataView.getUpdateCount() != -1) { |
153 |
if (dataView.getUpdateCount() != -1) { |
Lines 172-179
Link Here
|
172 |
Collection<DBTable> tables = dbMeta.generateDBTables( |
175 |
Collection<DBTable> tables = dbMeta.generateDBTables( |
173 |
rs, sql, isSelect); |
176 |
rs, sql, isSelect); |
174 |
DataViewDBTable dvTable = new DataViewDBTable(tables); |
177 |
DataViewDBTable dvTable = new DataViewDBTable(tables); |
|
|
178 |
dataView.getDataViewPageContext().getModel().setColumns( |
179 |
dvTable.getColumns().toArray(new DBColumn[0])); |
175 |
dataView.setDataViewDBTable(dvTable); |
180 |
dataView.setDataViewDBTable(dvTable); |
176 |
if (resultSetNeedsReloading()) { |
181 |
if (resultSetNeedsReloading(dvTable)) { |
177 |
executeSQLStatement(stmt, sql); |
182 |
executeSQLStatement(stmt, sql); |
178 |
rs = stmt.getResultSet(); |
183 |
rs = stmt.getResultSet(); |
179 |
} |
184 |
} |
Lines 299-319
Link Here
|
299 |
void executeDeleteRow(final DataViewTableUI rsTable) { |
304 |
void executeDeleteRow(final DataViewTableUI rsTable) { |
300 |
String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_delete"); |
305 |
String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_delete"); |
301 |
final int[] rows = rsTable.getSelectedRows(); |
306 |
final int[] rows = rsTable.getSelectedRows(); |
|
|
307 |
for(int i = 0; i < rows.length; i++) { |
308 |
rows[i] = rsTable.convertRowIndexToModel(rows[i]); |
309 |
} |
310 |
Arrays.sort(rows); |
302 |
SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "") { |
311 |
SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "") { |
303 |
|
312 |
|
304 |
@Override |
313 |
@Override |
305 |
public void execute() throws SQLException, DBException { |
314 |
public void execute() throws SQLException, DBException { |
306 |
dataView.setEditable(false); |
315 |
dataView.setEditable(false); |
307 |
|
316 |
for (int j = (rows.length - 1); j >= 0 && !error; j--) { |
308 |
for (int j = 0; j < rows.length && !error; j++) { |
|
|
309 |
if (Thread.currentThread().isInterrupted()) { |
317 |
if (Thread.currentThread().isInterrupted()) { |
310 |
break; |
318 |
break; |
311 |
} |
319 |
} |
312 |
deleteARow(rsTable.convertRowIndexToModel(rows[j]), rsTable.getModel()); |
320 |
deleteARow(rows[j], rsTable.getModel()); |
313 |
} |
321 |
} |
314 |
} |
322 |
} |
315 |
|
323 |
|
316 |
private void deleteARow(int rowNum, TableModel tblModel) throws SQLException, DBException { |
324 |
private void deleteARow(int rowNum, DataViewTableUIModel tblModel) throws SQLException, DBException { |
317 |
final List<Object> values = new ArrayList<Object>(); |
325 |
final List<Object> values = new ArrayList<Object>(); |
318 |
final List<Integer> types = new ArrayList<Integer>(); |
326 |
final List<Integer> types = new ArrayList<Integer>(); |
319 |
|
327 |
|
Lines 360-366
Link Here
|
360 |
} |
368 |
} |
361 |
|
369 |
|
362 |
void executeUpdateRow(final DataViewTableUI rsTable, final boolean selectedOnly) { |
370 |
void executeUpdateRow(final DataViewTableUI rsTable, final boolean selectedOnly) { |
363 |
String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_update"); |
371 |
final DataViewTableUIModel dataViewTableUIModel = rsTable.getModel(); |
|
|
372 |
String title = NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_update"); |
364 |
SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "") { |
373 |
SQLStatementExecutor executor = new SQLStatementExecutor(dataView, title, "") { |
365 |
|
374 |
|
366 |
private PreparedStatement pstmt; |
375 |
private PreparedStatement pstmt; |
Lines 372-378
Link Here
|
372 |
if (selectedOnly) { |
381 |
if (selectedOnly) { |
373 |
updateSelected(); |
382 |
updateSelected(); |
374 |
} else { |
383 |
} else { |
375 |
for (Integer key : dataView.getUpdatedRowContext().getUpdateKeys()) { |
384 |
for (Integer key : dataViewTableUIModel.getUpdateKeys()) { |
376 |
if (Thread.currentThread().isInterrupted()) { |
385 |
if (Thread.currentThread().isInterrupted()) { |
377 |
break; |
386 |
break; |
378 |
} else { |
387 |
} else { |
Lines 385-393
Link Here
|
385 |
|
394 |
|
386 |
private void updateSelected() throws SQLException, DBException { |
395 |
private void updateSelected() throws SQLException, DBException { |
387 |
int[] rows = rsTable.getSelectedRows(); |
396 |
int[] rows = rsTable.getSelectedRows(); |
388 |
UpdatedRowContext tblContext = dataView.getUpdatedRowContext(); |
|
|
389 |
for (int j = 0; j < rows.length && !error; j++) { |
397 |
for (int j = 0; j < rows.length && !error; j++) { |
390 |
Set<Integer> keys = tblContext.getUpdateKeys(); |
398 |
Set<Integer> keys = dataViewTableUIModel.getUpdateKeys(); |
391 |
for (Integer key : keys) { |
399 |
for (Integer key : keys) { |
392 |
if (Thread.currentThread().isInterrupted()) { |
400 |
if (Thread.currentThread().isInterrupted()) { |
393 |
break; |
401 |
break; |
Lines 400-411
Link Here
|
400 |
} |
408 |
} |
401 |
|
409 |
|
402 |
private void updateARow(Integer key) throws SQLException, DBException { |
410 |
private void updateARow(Integer key) throws SQLException, DBException { |
403 |
UpdatedRowContext updatedRowCtx = dataView.getUpdatedRowContext(); |
|
|
404 |
SQLStatementGenerator generator = dataView.getSQLStatementGenerator(); |
411 |
SQLStatementGenerator generator = dataView.getSQLStatementGenerator(); |
405 |
|
412 |
|
406 |
List<Object> values = new ArrayList<Object>(); |
413 |
List<Object> values = new ArrayList<Object>(); |
407 |
List<Integer> types = new ArrayList<Integer>(); |
414 |
List<Integer> types = new ArrayList<Integer>(); |
408 |
String updateStmt = generator.generateUpdateStatement(key, updatedRowCtx.getChangedData(key), values, types, rsTable.getModel()); |
415 |
String updateStmt = generator.generateUpdateStatement(key, dataViewTableUIModel.getChangedData(key), values, types, rsTable.getModel()); |
409 |
|
416 |
|
410 |
pstmt = conn.prepareStatement(updateStmt); |
417 |
pstmt = conn.prepareStatement(updateStmt); |
411 |
int pos = 1; |
418 |
int pos = 1; |
Lines 437-447
Link Here
|
437 |
|
444 |
|
438 |
@Override |
445 |
@Override |
439 |
protected void executeOnSucess() { |
446 |
protected void executeOnSucess() { |
440 |
UpdatedRowContext tblContext = dataView.getUpdatedRowContext(); |
447 |
DataViewTableUIModel tblContext = dataView.getDataViewTableUIModel(); |
441 |
for (Integer key : keysToRemove) { |
448 |
for (Integer key : keysToRemove) { |
442 |
tblContext.removeUpdateForSelectedRow(key); |
449 |
tblContext.removeUpdateForSelectedRow(key, false); |
443 |
} |
450 |
} |
444 |
dataView.syncPageWithTableModel(); |
|
|
445 |
reinstateToolbar(); |
451 |
reinstateToolbar(); |
446 |
} |
452 |
} |
447 |
}; |
453 |
}; |
Lines 553-561
Link Here
|
553 |
if (error) { |
559 |
if (error) { |
554 |
dataView.setErrorStatusText(ex); |
560 |
dataView.setErrorStatusText(ex); |
555 |
} |
561 |
} |
556 |
dataView.getUpdatedRowContext().removeAllUpdates(); |
|
|
557 |
dataView.resetToolbar(error); |
562 |
dataView.resetToolbar(error); |
558 |
dataView.setRowsInTableModel(); |
|
|
559 |
} |
563 |
} |
560 |
} |
564 |
} |
561 |
|
565 |
|
Lines 585-591
Link Here
|
585 |
|
589 |
|
586 |
int pageSize = dataView.getDataViewPageContext().getPageSize(); |
590 |
int pageSize = dataView.getDataViewPageContext().getPageSize(); |
587 |
int startFrom = 0; |
591 |
int startFrom = 0; |
588 |
if (!dataView.isLimitSupported() || isLimitUsedInSelect(dataView.getSQLString())) { |
592 |
if (! limitSupported || isLimitUsedInSelect(dataView.getSQLString())) { |
589 |
startFrom = dataView.getDataViewPageContext().getCurrentPos() - 1; |
593 |
startFrom = dataView.getDataViewPageContext().getCurrentPos() - 1; |
590 |
} |
594 |
} |
591 |
|
595 |
|
Lines 628-634
Link Here
|
628 |
LOGGER.log(Level.SEVERE, "Failed to set up table model.", e); // NOI18N |
632 |
LOGGER.log(Level.SEVERE, "Failed to set up table model.", e); // NOI18N |
629 |
throw e; |
633 |
throw e; |
630 |
} finally { |
634 |
} finally { |
631 |
dataView.getDataViewPageContext().setCurrentRows(rows); |
635 |
dataView.getDataViewPageContext().getModel().setData(rows); |
632 |
} |
636 |
} |
633 |
} |
637 |
} |
634 |
|
638 |
|
Lines 636-645
Link Here
|
636 |
try { |
640 |
try { |
637 |
if (countresultSet == null) { |
641 |
if (countresultSet == null) { |
638 |
dataView.getDataViewPageContext().setTotalRows(-1); |
642 |
dataView.getDataViewPageContext().setTotalRows(-1); |
|
|
643 |
dataView.setTotalRowCount(-1); |
639 |
} else { |
644 |
} else { |
640 |
if (countresultSet.next()) { |
645 |
if (countresultSet.next()) { |
641 |
int count = countresultSet.getInt(1); |
646 |
int count = countresultSet.getInt(1); |
642 |
dataView.getDataViewPageContext().setTotalRows(count); |
647 |
dataView.getDataViewPageContext().setTotalRows(count); |
|
|
648 |
dataView.setTotalRowCount(count); |
643 |
} |
649 |
} |
644 |
} |
650 |
} |
645 |
} catch (SQLException ex) { |
651 |
} catch (SQLException ex) { |
Lines 648-654
Link Here
|
648 |
} |
654 |
} |
649 |
|
655 |
|
650 |
private String appendLimitIfRequired(String sql) { |
656 |
private String appendLimitIfRequired(String sql) { |
651 |
if (dataView.isLimitSupported() && isSelectStatement(sql)) { |
657 |
if (limitSupported && isSelectStatement(sql)) { |
652 |
if (!isLimitUsedInSelect(sql)) { |
658 |
if (!isLimitUsedInSelect(sql)) { |
653 |
sql += ' ' + LIMIT_CLAUSE + dataView.getDataViewPageContext().getPageSize(); |
659 |
sql += ' ' + LIMIT_CLAUSE + dataView.getDataViewPageContext().getPageSize(); |
654 |
sql += ' ' + OFFSET_CLAUSE + (dataView.getDataViewPageContext().getCurrentPos() - 1); |
660 |
sql += ' ' + OFFSET_CLAUSE + (dataView.getDataViewPageContext().getCurrentPos() - 1); |
Lines 661-667
Link Here
|
661 |
private Statement prepareSQLStatement(Connection conn, String sql) throws SQLException { |
667 |
private Statement prepareSQLStatement(Connection conn, String sql) throws SQLException { |
662 |
Statement stmt = null; |
668 |
Statement stmt = null; |
663 |
if (sql.startsWith("{")) { // NOI18N |
669 |
if (sql.startsWith("{")) { // NOI18N |
664 |
|
|
|
665 |
stmt = conn.prepareCall(sql); |
670 |
stmt = conn.prepareCall(sql); |
666 |
} else if (isSelectStatement(sql)) { |
671 |
} else if (isSelectStatement(sql)) { |
667 |
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); |
672 |
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); |
Lines 675-681
Link Here
|
675 |
} |
680 |
} |
676 |
|
681 |
|
677 |
try { |
682 |
try { |
678 |
if (dataView.isLimitSupported() && ! isLimitUsedInSelect(sql)) { |
683 |
if ( limitSupported && ! isLimitUsedInSelect(sql)) { |
679 |
stmt.setMaxRows(pageSize); |
684 |
stmt.setMaxRows(pageSize); |
680 |
} else { |
685 |
} else { |
681 |
stmt.setMaxRows(dataView.getDataViewPageContext().getCurrentPos() + pageSize); |
686 |
stmt.setMaxRows(dataView.getDataViewPageContext().getCurrentPos() + pageSize); |
Lines 689-695
Link Here
|
689 |
return stmt; |
694 |
return stmt; |
690 |
} |
695 |
} |
691 |
|
696 |
|
692 |
private void executeSQLStatement(Statement stmt, String sql) throws SQLException { |
697 |
private boolean executeSQLStatement(Statement stmt, String sql) throws SQLException { |
693 |
LOGGER.log(Level.FINE, "Statement: {0}", sql); // NOI18N |
698 |
LOGGER.log(Level.FINE, "Statement: {0}", sql); // NOI18N |
694 |
dataView.setInfoStatusText(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_executestmt") + sql); |
699 |
dataView.setInfoStatusText(NbBundle.getMessage(SQLExecutionHelper.class, "LBL_sql_executestmt") + sql); |
695 |
|
700 |
|
Lines 719-724
Link Here
|
719 |
dataView.setUpdateCount(stmt.getUpdateCount()); |
724 |
dataView.setUpdateCount(stmt.getUpdateCount()); |
720 |
dataView.setExecutionTime(executionTime); |
725 |
dataView.setExecutionTime(executionTime); |
721 |
} |
726 |
} |
|
|
727 |
return isResultSet; |
722 |
} |
728 |
} |
723 |
|
729 |
|
724 |
private void executePreparedStatement(PreparedStatement stmt) throws SQLException { |
730 |
private void executePreparedStatement(PreparedStatement stmt) throws SQLException { |
Lines 840-853
Link Here
|
840 |
* |
846 |
* |
841 |
* @return True if and only if the result set needs to be reloaded. |
847 |
* @return True if and only if the result set needs to be reloaded. |
842 |
*/ |
848 |
*/ |
843 |
private boolean resultSetNeedsReloading() { |
849 |
private boolean resultSetNeedsReloading(DataViewDBTable metadata) { |
844 |
if (!dataView.getDatabaseConnection().getDriverClass().contains( |
850 |
if (!dataView.getDatabaseConnection().getDriverClass().contains( |
845 |
"oracle")) { //NOI18N |
851 |
"oracle")) { //NOI18N |
846 |
return false; |
852 |
return false; |
847 |
} |
853 |
} |
848 |
int colCnt = dataView.getDataViewDBTable().getColumnCount(); |
854 |
int colCnt = metadata.getColumnCount(); |
849 |
for (int i = 0; i < colCnt; i++) { |
855 |
for (int i = 0; i < colCnt; i++) { |
850 |
DBColumn column = dataView.getDataViewDBTable().getColumn(i); |
856 |
DBColumn column = metadata.getColumn(i); |
851 |
int jdbcType = column.getJdbcType(); |
857 |
int jdbcType = column.getJdbcType(); |
852 |
if (jdbcType == Types.LONGVARCHAR || jdbcType == Types.LONGNVARCHAR |
858 |
if (jdbcType == Types.LONGVARCHAR || jdbcType == Types.LONGNVARCHAR |
853 |
|| jdbcType == Types.LONGVARBINARY || jdbcType == Types.BLOB |
859 |
|| jdbcType == Types.LONGVARBINARY || jdbcType == Types.BLOB |