Skip to content

Commit c21c113

Browse files
committed
Extension of bug fix: SQL result tab header marks:
Fixed performance problem when the SQL editor contained SQLs that were longer than 8000 characters. For SQLs that are longer than 8000 characters marking of result tab headers is skipped. The maximum number of characters can be configured at menu File --> Global Preferences --> tab SQL --> section "SQL result tab header". The default value is 8000.
1 parent f7da7ee commit c21c113

File tree

7 files changed

+62
-14
lines changed

7 files changed

+62
-14
lines changed

sql12/core/doc/changes.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ Bug fixes:
107107
SQL result tab header marks:
108108
Fixed performance problem when the SQL editor contained SQLs that were longer than 8000 characters.
109109
For SQLs that are longer than 8000 characters marking of result tab headers is skipped.
110+
The maximum number of characters can be configured at menu File --> Global Preferences
111+
--> tab SQL --> section "SQL result tab header". The default value is 8000.
110112

111113
Improved the performance of SQL result tab header marking for large SQL editor content.
112114

sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
*/
5353
public class SquirrelPreferences implements Serializable
5454
{
55-
public interface IPropertyNames
55+
public interface IPropertyNames
5656
{
5757
String ACTION_KEYS = "actionKeys";
5858
String CONFIRM_SESSION_CLOSE = "confirmSessionClose";
@@ -71,6 +71,7 @@ public interface IPropertyNames
7171
String RESULT_TAB_HEADER_MARK_THICKNESS = "resultTabHeaderMarkThickness";
7272
String RESULT_TAB_HEADER_COMPARE_SQLS_NORMALIZED = "resultTabHeaderCompareSqlsNormalized";
7373
String RESULT_TAB_HEADER_MARK_LAST_ONLY = "resultTabHeaderMarkLastOnly";
74+
String RESULT_TAB_HEADER_MARK_MAX_SQL_LENGTH_TO_CHECK = "resultTabHeaderMarkMaxSqlLengthToCheck";
7475

7576
String USE_STATEMENT_SEPARATOR_AS_SQL_TO_EXECUTE_BOUNDS = "useStatementSeparatorAsSqlToExecuteBounds";
7677
String MAIN_FRAME_STATE = "mainFrameWindowState";
@@ -357,6 +358,7 @@ public interface IJdbcDebugTypes
357358
private int _resultTabHeaderMarkThickness = 2;
358359
private boolean _resultTabHeaderCompareSqlsNormalized;
359360
private boolean _resultTabHeaderMarkLastOnly;
361+
private int _resultTabHeaderMarkMaxSqlLengthToCheck = 8000;
360362

361363
public SquirrelPreferences()
362364
{
@@ -1726,4 +1728,15 @@ public void setResultTabHeaderMarkLastOnly(boolean resultTabHeaderMarkLastOnly)
17261728
{
17271729
_resultTabHeaderMarkLastOnly = resultTabHeaderMarkLastOnly;
17281730
}
1731+
1732+
public int getResultTabHeaderMarkMaxSqlLengthToCheck()
1733+
{
1734+
return _resultTabHeaderMarkMaxSqlLengthToCheck;
1735+
}
1736+
1737+
public void setResultTabHeaderMarkMaxSqlLengthToCheck(int resultTabHeaderMarkMaxSqlLengthToCheck)
1738+
{
1739+
_resultTabHeaderMarkMaxSqlLengthToCheck = resultTabHeaderMarkMaxSqlLengthToCheck;
1740+
}
1741+
17291742
}

sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public PropertyDescriptor[] getPropertyDescriptors()
6767
prop(RESULT_TAB_HEADER_MARK_THICKNESS, SquirrelPreferences.class, "getResultTabHeaderMarkThickness", "setResultTabHeaderMarkThickness"),
6868
prop(RESULT_TAB_HEADER_COMPARE_SQLS_NORMALIZED, SquirrelPreferences.class, "isResultTabHeaderCompareSqlsNormalized", "setResultTabHeaderCompareSqlsNormalized"),
6969
prop(RESULT_TAB_HEADER_MARK_LAST_ONLY, SquirrelPreferences.class, "isResultTabHeaderMarkLastOnly", "setResultTabHeaderMarkLastOnly"),
70+
prop(RESULT_TAB_HEADER_MARK_MAX_SQL_LENGTH_TO_CHECK, SquirrelPreferences.class, "getResultTabHeaderMarkMaxSqlLengthToCheck", "setResultTabHeaderMarkMaxSqlLengthToCheck"),
7071

7172
prop(USE_STATEMENT_SEPARATOR_AS_SQL_TO_EXECUTE_BOUNDS, SquirrelPreferences.class, "isUseStatementSeparatorAsSqlToExecuteBounds", "setUseStatementSeparatorAsSqlToExecuteBounds"),
7273

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabheader/I18NStrings.properties

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@ ResultTabHeaderPrefsPanel.automatically.select.manually.by.shortcut=Note: The la
1313
1414
ResultTabHeaderPrefsPanelController.result.mark.color.choose=Choose result mark color
1515
16-
MarkResultTabHeaderMatchingCurSqlAction.tools.popup.descr=Activate result tab matching current SQL
16+
MarkResultTabHeaderMatchingCurSqlAction.tools.popup.descr=Activate result tab matching current SQL
17+
18+
ResultTabHeaderPrefsPanel.MaxSqlLengthToCheck.label.start=To avoid SQL editor performance issues process SQLs shorter than
19+
ResultTabHeaderPrefsPanel.MaxSqlLengthToCheck.label.end=characters only.

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabheader/ResultTabHeaderPrefsPanel.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader;
22

33
import net.sourceforge.squirrel_sql.client.preferences.ColorIcon;
4+
import net.sourceforge.squirrel_sql.fw.gui.IntegerField;
45
import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel;
56
import net.sourceforge.squirrel_sql.fw.util.StringManager;
67
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
@@ -29,6 +30,9 @@ public class ResultTabHeaderPrefsPanel extends JPanel
2930
final JSpinner spnThickness;
3031
final JCheckBox chkMarkLastTabHeaderOnly;
3132
final JCheckBox chkCompareSqlsNormalized;
33+
final JLabel lblMaxSqlLengthToCheckStart;
34+
final IntegerField txtMaxSqlLengthToCheck;
35+
final JLabel lblMaxSqlLengthToCheckEnd;
3236

3337
final MultipleLineLabel lblNoteManualActivate;
3438

@@ -80,7 +84,20 @@ public ResultTabHeaderPrefsPanel()
8084
add(chkCompareSqlsNormalized, gbc);
8185

8286

83-
gbc = new GridBagConstraints(0,4,GridBagConstraints.REMAINDER,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(10,5,5,5), 0,0);
87+
gbc = new GridBagConstraints(0,4,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5,5,0,0), 0,0);
88+
lblMaxSqlLengthToCheckStart = new JLabel(s_stringMgr.getString("ResultTabHeaderPrefsPanel.MaxSqlLengthToCheck.label.start"));
89+
add(lblMaxSqlLengthToCheckStart, gbc);
90+
91+
gbc = new GridBagConstraints(1,4,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5,2,0,0), 0,0);
92+
txtMaxSqlLengthToCheck = new IntegerField(6);
93+
add(txtMaxSqlLengthToCheck, gbc);
94+
95+
gbc = new GridBagConstraints(2,4,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5,2,0,0), 0,0);
96+
lblMaxSqlLengthToCheckEnd = new JLabel(s_stringMgr.getString("ResultTabHeaderPrefsPanel.MaxSqlLengthToCheck.label.end"));
97+
add(lblMaxSqlLengthToCheckEnd, gbc);
98+
99+
100+
gbc = new GridBagConstraints(0,5,GridBagConstraints.REMAINDER,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(10,5,5,5), 0,0);
84101
lblNoteManualActivate = new MultipleLineLabel(s_stringMgr.getString("ResultTabHeaderPrefsPanel.automatically.select.manually.by.shortcut"));
85102
add(lblNoteManualActivate, gbc);
86103

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabheader/ResultTabHeaderPrefsPanelController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ private void onMarkCurrentSQLsResultTabHeader()
4242
_panel.chkCompareSqlsNormalized.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
4343

4444
_panel.lblMarkLineThickness.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
45+
_panel.txtMaxSqlLengthToCheck.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
46+
47+
_panel.lblMaxSqlLengthToCheckStart.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
48+
_panel.lblMaxSqlLengthToCheckEnd.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
49+
4550
_panel.lblNoteManualActivate.setEnabled(_panel.chkMarkCurrentSQLsResultTabHeader.isSelected());
4651
}
4752

@@ -54,6 +59,7 @@ public void loadData(SquirrelPreferences prefs)
5459
_panel.spnThickness.setValue(prefs.getResultTabHeaderMarkThickness());
5560
_panel.chkMarkLastTabHeaderOnly.setSelected(prefs.isResultTabHeaderMarkLastOnly());
5661
_panel.chkCompareSqlsNormalized.setSelected(prefs.isResultTabHeaderCompareSqlsNormalized());
62+
_panel.txtMaxSqlLengthToCheck.setInt(prefs.getResultTabHeaderMarkMaxSqlLengthToCheck());
5763

5864
onMarkCurrentSQLsResultTabHeader();
5965
}
@@ -67,6 +73,11 @@ public void applyChanges(SquirrelPreferences prefs)
6773
prefs.setResultTabHeaderMarkThickness((Integer) _panel.spnThickness.getValue());
6874
prefs.setResultTabHeaderMarkLastOnly(_panel.chkMarkLastTabHeaderOnly.isSelected());
6975
prefs.setResultTabHeaderCompareSqlsNormalized(_panel.chkCompareSqlsNormalized.isSelected());
76+
77+
if(0 < _panel.txtMaxSqlLengthToCheck.getInt())
78+
{
79+
prefs.setResultTabHeaderMarkMaxSqlLengthToCheck(_panel.txtMaxSqlLengthToCheck.getInt());
80+
}
7081
}
7182

7283
public ResultTabHeaderPrefsPanel getPanel()

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabheader/ResultTabMatchingCurrentSqlHandler.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader;
22

3-
import java.util.ArrayList;
4-
import java.util.Collections;
5-
import java.util.Comparator;
6-
import java.util.List;
7-
import javax.swing.JTabbedPane;
8-
import javax.swing.Timer;
9-
103
import net.sourceforge.squirrel_sql.client.Main;
114
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
125
import net.sourceforge.squirrel_sql.client.session.editorpaint.TextAreaPaintListener;
@@ -19,6 +12,13 @@
1912
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
2013
import org.apache.commons.lang3.StringUtils;
2114

15+
import javax.swing.JTabbedPane;
16+
import javax.swing.Timer;
17+
import java.util.ArrayList;
18+
import java.util.Collections;
19+
import java.util.Comparator;
20+
import java.util.List;
21+
2222
public class ResultTabMatchingCurrentSqlHandler
2323
{
2424
private static final ILogger s_log = LoggerController.createLogger(ResultTabMatchingCurrentSqlHandler.class);
@@ -33,7 +33,7 @@ public class ResultTabMatchingCurrentSqlHandler
3333
private Timer _paintTimer;
3434

3535
private NormalizedSqlCompareCache _normalizedSqlCompareCache = new NormalizedSqlCompareCache();
36-
private long _lastEditorSqlToLongWarningMillis = 0;
36+
private long _lastEditorSqlTooLongWarningMillis = 0;
3737

3838
public ResultTabMatchingCurrentSqlHandler(ISQLEntryPanel entryPanel, SQLResultExecutorPanel sqlExecPanel)
3939
{
@@ -81,18 +81,19 @@ private void onTextAreaPaint(boolean activateLastMarked)
8181
resultTabsBufList.sort(Comparator.comparingInt(rt -> rt.getIdentifier().getIntValue()));
8282
Collections.reverse(resultTabsBufList);
8383

84+
int resultTabHeaderMarkMaxSqlLengthToCheck = Main.getApplication().getSquirrelPreferences().getResultTabHeaderMarkMaxSqlLengthToCheck();
8485
boolean activationOfLastDone = false;
8586
for(IResultTab sqlResultTab : resultTabsBufList)
8687
{
8788
boolean tabMatchesSqlToBeExecuted;
8889

89-
if( null != sqlToBeExecuted && 8000 < sqlToBeExecuted.length() )
90+
if( null != sqlToBeExecuted && resultTabHeaderMarkMaxSqlLengthToCheck < sqlToBeExecuted.length() )
9091
{
9192
// Editor-SQL to long. Will skip search for matching result tab
9293
long currentTimeMillis = System.currentTimeMillis();
93-
if( currentTimeMillis - _lastEditorSqlToLongWarningMillis > 5000L)
94+
if( currentTimeMillis - _lastEditorSqlTooLongWarningMillis > 5000L)
9495
{
95-
_lastEditorSqlToLongWarningMillis = currentTimeMillis;
96+
_lastEditorSqlTooLongWarningMillis = currentTimeMillis;
9697
s_log.warn("Editor SQL too long (" + sqlToBeExecuted.length() + " chars) to perform matching result tab search without severe editor performance impact.");
9798
}
9899

0 commit comments

Comments
 (0)