diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/DbeCommonUtils.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/DbeCommonUtils.java index a47f9fd47e2d9b6be66dbf779135c9f019523519..c25f309bcbeeaf626987175cddff1bd9c4203f9f 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/DbeCommonUtils.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/common/DbeCommonUtils.java @@ -82,7 +82,11 @@ public final class DbeCommonUtils { throws SQLException { List infos = DbeDebugService.getInfoCodes(conn, Arrays.asList(oid)); List canBreaks = infos.stream().filter(item -> item.canbreak).collect(Collectors.toList()); + Map map = getBeginToEndLineNo(sourceCodes); for (int i = 0; i < indexs.size(); i++) { + if (map.get(BEGIN) >= Integer.valueOf(indexs.get(i))) { + throw new SQLException(MessageConfigLoader.getProperty(IMessagesConstants.NOT_SUPPORT_BREAK)); + } String selectCode = sourceCodes.get(Integer.parseInt(indexs.get(i))); long count = canBreaks.stream().filter(item -> { String str = item.query.replaceAll(REPLACE_FUNCTION, REPLACED); @@ -209,7 +213,7 @@ public final class DbeCommonUtils { public static List getBreakLines(List infos, List sourceCodes) { Map map = getBeginToEndLineNo(sourceCodes); List linse = new ArrayList(); - for (int i = map.get(BEGIN); i < sourceCodes.size(); i++) { + for (int i = map.get(BEGIN) + 1; i < sourceCodes.size(); i++) { if (i >= map.get(END)) { if (checkIsEqualLine(sourceCodes, END) == 0) { linse.add(String.valueOf(i)); diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DbeDebugService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DbeDebugService.java index e3807b6a404984bf6f50464bb93d85b725b46b6c..285370826839c4d959d34b355ad0dc2e64d52b5d 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DbeDebugService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DbeDebugService.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Timer; @@ -110,20 +109,7 @@ public class DbeDebugService extends DebugService { } }, 2000); try (ResultSet rs = ps.executeQuery()) { - if (rs.next()) { - int totalCount = rs.getMetaData().getColumnCount(); - int initCount = 0; - List resList = new ArrayList(); - while (initCount < totalCount) { - initCount++; - String columnName = rs.getMetaData().getColumnName(initCount); - Object result = rs.getObject(initCount); - String coverRes = String.format(Locale.ENGLISH, columnName+"%s "+result,":"); - resList.add(coverRes); - } - return Optional.ofNullable(String.join("; ", resList)); - } - return Optional.empty(); + return listResultSet(rs); } } } finally { diff --git a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java index 2857d6f8fe2b171b6775a5726e22cdba70059178..244544b73cafaed63192753864fda801aaba8396 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java +++ b/code/datastudio/src/org.opengauss.mppdbide.debuger/src/org/opengauss/mppdbide/debuger/service/DebugService.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Locale; import java.util.Optional; +import org.apache.commons.lang.StringUtils; import org.opengauss.mppdbide.common.IConnection; import org.opengauss.mppdbide.debuger.annotation.ParseVo; import org.opengauss.mppdbide.debuger.debug.DebugConstants; @@ -45,8 +46,10 @@ import org.opengauss.mppdbide.debuger.vo.SessionVo; import org.opengauss.mppdbide.debuger.vo.StackVo; import org.opengauss.mppdbide.debuger.vo.VariableVo; import org.opengauss.mppdbide.debuger.vo.VersionVo; +import org.opengauss.mppdbide.utils.VariableRunLine; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; import org.postgresql.core.NoticeListener; +import org.postgresql.util.PGobject; /** * Title: the DebugService class @@ -203,7 +206,7 @@ public class DebugService implements NoticeListener, EventHander, IDebugService * @throws SQLException the exp */ public void debugOff() throws SQLException { - try (PreparedStatement ps = serverConn.getDebugOptPrepareStatement( + try (PreparedStatement ps = serverConn.getDebugOptPrepareStatement( DebugConstants.DebugOpt.DEBUG_OFF, new ArrayList(1))) { ps.execute(); @@ -577,6 +580,7 @@ public class DebugService implements NoticeListener, EventHander, IDebugService MPPDBIDELoggerUtility.debug("debugOff with error:" + e.toString()); } closeService(); + VariableRunLine.hasStartDebug = false; } /** @@ -799,7 +803,7 @@ public class DebugService implements NoticeListener, EventHander, IDebugService * @return Optional<> Object * @throws SQLException Exception */ - private Optional listResultSet(ResultSet rs) throws SQLException { + static Optional listResultSet(ResultSet rs) throws SQLException { if (rs.next()) { int totalCount = rs.getMetaData().getColumnCount(); int initCount = 0; @@ -808,7 +812,14 @@ public class DebugService implements NoticeListener, EventHander, IDebugService initCount++; String columnName = rs.getMetaData().getColumnName(initCount); Object result = rs.getObject(initCount); - String coverRes = String.format(Locale.ENGLISH, columnName+"%s "+result,":"); + String coverRes = String.format(Locale.ENGLISH, columnName + "%s " + result, ":"); + if (result instanceof PGobject) { + PGobject val = (PGobject) result; + coverRes = String.format(Locale.ENGLISH, columnName + "%s " + "ok", ":"); + if (StringUtils.isNotBlank(val.getValue())) { + coverRes = String.format(Locale.ENGLISH, columnName + "%s " + val.getValue(), ":"); + } + } resList.add(coverRes); } return Optional.ofNullable(String.join("; ", resList)); diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages.properties b/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages.properties index f5896fb516522e262607b79f75322498c1fb747f..9acaa368e2af651ea1741e2f3e2a7e8a7039c21d 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages.properties +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages.properties @@ -3206,4 +3206,5 @@ COVERAGE_CHECK = This version does not support this function! INPUT_PARAMS = Input Params NOT_SUPPORT_BREAK = There are rows that do not support flags! VERSION_CHECK_FAIL = Check version failed! -WRITE_DATA = This operation will save the data to the his_coverage! \ No newline at end of file +WRITE_DATA = This action creates a new table (his_coverage) and saves the data into the table! +NO_CLOSE = Debugging is running, please end or interrupt debugging first! \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages_zh_CN.properties b/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages_zh_CN.properties index b4943fc48647f3f882a812049f178a8eea80b8e3..f15d3ac7475ba951dbeb2095c9c79cf00087cab7 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages_zh_CN.properties +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/messages_zh_CN.properties @@ -3195,4 +3195,5 @@ EXP_MARK_EXECUTION_LINE = \u6807\u8BB0\u6267\u884C\u884C EXP_MARKER_COVERAGE = \u6807\u8BB0\u8986\u76D6\u7387 EXP_INPUT_PARAMS = \u5165\u53C2 EXP_UPDATE_TIME = \u7ED3\u675F\u65F6\u95F4 -WRITE_DATA = \u6B64\u64CD\u4F5C\u5C06\u4FDD\u5B58\u6570\u636E\u81F3his_coverage\u8868\u4E2D! \ No newline at end of file +WRITE_DATA = \u6B64\u64CD\u4F5C\u5C06\u65B0\u5EFA\u8868(his_coverage)\u5E76\u4FDD\u5B58\u6570\u636E\u81F3\u8868\u4E2D! +NO_CLOSE = \u6B63\u5728\u8FD0\u884C\u8C03\u8BD5\uFF0C\u8BF7\u5148\u7ED3\u675F\u6216\u4E2D\u65AD\u8C03\u8BD5! \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java index 8c6baf9e8e39e4d0b92f7c3711172fda2ad8237d..dab1c0c3e9eb5351fe9d8723de87bc93b277d291 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/IMessagesConstantsOne.java @@ -1179,4 +1179,9 @@ public interface IMessagesConstantsOne extends IMessagesConstantsTwo { * EXP_UPDATE_TIME */ String WRITE_DATA = "WRITE_DATA"; + + /** + * NO_CLOSE + */ + String NO_CLOSE = "NO_CLOSE"; } \ No newline at end of file diff --git a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/VariableRunLine.java b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/VariableRunLine.java index 54f46cd1b1c16141a07f7b9b222ea4f1d8e925e7..b11ae6e9e0f30f49412d3ade1cfd7a0c818a400d 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/VariableRunLine.java +++ b/code/datastudio/src/org.opengauss.mppdbide.utils/src/org/opengauss/mppdbide/utils/VariableRunLine.java @@ -16,7 +16,9 @@ package org.opengauss.mppdbide.utils; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; @@ -60,4 +62,14 @@ public class VariableRunLine { * currentOid of function */ public static volatile long currentOid; + + /** + * hasStartDebug of function + */ + public static volatile boolean hasStartDebug; + + /** + * hasUpdateStatus of function + */ + public static volatile Map hasUpdateStatus = new ConcurrentHashMap<>(); } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java index 5d741590531ccdeaa21862dfa54e7de0df05658f..717e7e67fc8803afe52622c3846e98ba62874eae 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/ViewSourceDebugObjectHandler.java @@ -21,6 +21,7 @@ import org.opengauss.mppdbide.bl.serverdatacache.IDebugObject; import org.opengauss.mppdbide.bl.serverdatacache.ObjectChange; import org.opengauss.mppdbide.utils.DebuggerStartVariable; import org.opengauss.mppdbide.utils.IMessagesConstants; +import org.opengauss.mppdbide.utils.VariableRunLine; import org.opengauss.mppdbide.utils.exceptions.DatabaseCriticalException; import org.opengauss.mppdbide.utils.exceptions.DatabaseOperationException; import org.opengauss.mppdbide.utils.loader.MessageConfigLoader; @@ -58,6 +59,7 @@ public class ViewSourceDebugObjectHandler implements ExecuteWrapper { if (debugObject != null) { Long oid = debugObject.getOid(); DebuggerStartVariable.getStartInfo(oid).remarLinesStr = ""; + VariableRunLine.hasUpdateStatus.put(oid, false); } if (debugObject != null) { if (!(UIElement.getInstance().isEditorExistByDbgObj(debugObject))) { diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java index d883892564525df836a1af309444276de1be514d..ec5bdd590d3209ce337c36eca8a65621741cfba2 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/DebugServiceHelper.java @@ -118,6 +118,7 @@ public class DebugServiceHelper { if (debugService != null) { debugService.setRollback(getRollbackPreference()); } + VariableRunLine.hasStartDebug = true; return debugService != null; } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java index dd1b092054199548f4d74e2331acc5b740ce67bf..a184939a7d6650b488d9a7a1fd2814a7c2877ed5 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/StartDebugHandler.java @@ -86,6 +86,9 @@ public class StartDebugHandler { showMsg("create debug service failed!"); return; } + if (VariableRunLine.isPldebugger != null && !VariableRunLine.isPldebugger) { + plSourceEditor.setDirty(VariableRunLine.hasStartDebug); + } } catch (SQLException sqlExp) { MPPDBIDELoggerUtility.warn("create servicefactory with error:" + sqlExp.getMessage()); showMsg(sqlExp.getLocalizedMessage()); @@ -178,6 +181,10 @@ public class StartDebugHandler { .getDefaulParametertMap() .get(debugObject.getOid()); debugParams = getDebugParams(serverParams); + } else if (!VariableRunLine.isPldebugger){ + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT), + MessageConfigLoader.getProperty(IMessagesConstants.WRITE_DATA)); } WrappedDebugService debugService = serviceHelper.getDebugService(); if (debugService == null) { diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java index 7f3deffb5462abf3bba297f081fd2ff78c9012e3..6e5706502f527ff49829081e2f08f8c36d420a46 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/TerminateDebugHandler.java @@ -18,6 +18,7 @@ package org.opengauss.mppdbide.view.handler.debug; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; import org.opengauss.mppdbide.utils.DebuggerStartVariable; +import org.opengauss.mppdbide.utils.VariableRunLine; import org.opengauss.mppdbide.utils.logger.MPPDBIDELoggerUtility; import org.opengauss.mppdbide.utils.vo.DebuggerStartInfoVo; import org.opengauss.mppdbide.view.ui.PLSourceEditor; @@ -65,5 +66,9 @@ public class TerminateDebugHandler { debugUtils.setDebugStart(false); debugUtils.terminateDebug(); serviceHelper.closeService(); + if (VariableRunLine.isPldebugger != null && !VariableRunLine.isPldebugger) { + Boolean hasUpdate = VariableRunLine.hasUpdateStatus.get(oid); + plSourceEditor.setDirty(hasUpdate == null ? false : hasUpdate); + } } } diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java index e4b975646959426a36469eb80b53afb4e7ecc961..2720a17038014af5d91c7c2fcc2f3450865d5388 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/handler/debug/chain/ServerExitChain.java @@ -28,6 +28,8 @@ import org.opengauss.mppdbide.view.handler.debug.DebugServiceHelper; import org.opengauss.mppdbide.view.handler.debug.ui.UpdateDebugPositionTask; import org.opengauss.mppdbide.view.handler.debug.ui.UpdateDebugResultTask; import org.opengauss.mppdbide.view.handler.debug.ui.UpdateHighlightLineNumTask; +import org.opengauss.mppdbide.view.ui.PLSourceEditor; +import org.opengauss.mppdbide.view.utils.UIElement; /** * Title: class @@ -60,6 +62,9 @@ public class ServerExitChain extends IMsgChain { Display.getDefault().asyncExec(new UpdateHighlightLineNumTask()); if (VariableRunLine.isPldebugger != null && !VariableRunLine.isPldebugger) { + PLSourceEditor pl = UIElement.getInstance().getVisibleSourceViewer(); + Boolean hasUpdate = VariableRunLine.hasUpdateStatus.get(VariableRunLine.currentOid); + pl.setDirty(hasUpdate == null ? false : hasUpdate); reportService.makeReport(event.hasException()); if (VariableRunLine.isContinue != null && VariableRunLine.isContinue) { Display.getDefault().asyncExec(() -> UpdateDebugPositionTask.continueDebug()); diff --git a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java index ca3ad39341aba3794b35744c6d9e7efdfb775e79..bad053915cf139febaad6bc044fb04330624205a 100644 --- a/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java +++ b/code/datastudio/src/org.opengauss.mppdbide.view/src/org/opengauss/mppdbide/view/ui/PLSourceEditor.java @@ -96,6 +96,7 @@ import org.opengauss.mppdbide.presentation.resultsetif.IResultConfig; import org.opengauss.mppdbide.utils.IMessagesConstants; import org.opengauss.mppdbide.utils.MPPDBIDEConstants; import org.opengauss.mppdbide.utils.MemoryCleaner; +import org.opengauss.mppdbide.utils.VariableRunLine; import org.opengauss.mppdbide.utils.exceptions.DatabaseCriticalException; import org.opengauss.mppdbide.utils.exceptions.DatabaseOperationException; import org.opengauss.mppdbide.utils.exceptions.MPPDBIDEException; @@ -1457,6 +1458,12 @@ public class PLSourceEditor extends AbstractAutoSaveObject if (null != tab) { tab.getParent().setSelectedElement(tab); } + if (VariableRunLine.hasStartDebug) { + MPPDBIDEDialogs.generateOKMessageDialog(MESSAGEDIALOGTYPE.INFORMATION, true, + MessageConfigLoader.getProperty(IMessagesConstants.EXECDIALOG_HINT), + MessageConfigLoader.getProperty(IMessagesConstants.NO_CLOSE)); + return Save.CANCEL; + } String title = MessageConfigLoader.getProperty(IMessagesConstants.DISCARD_CHANGES_TITLE); String message = MessageConfigLoader.getProperty(IMessagesConstants.DISCARD_TERMINAL_DATA_BODY); String cancel = MessageConfigLoader.getProperty(IMessagesConstants.MPPDBIDE_DIA_BTN_CANC); @@ -1779,7 +1786,7 @@ public class PLSourceEditor extends AbstractAutoSaveObject @Override public void documentChanged(DocumentEvent event) { setSourceChangedInEditor(true); - + VariableRunLine.hasUpdateStatus.put(VariableRunLine.currentOid, true); } @Override diff --git a/information/datastudio/Data Studio User Manual.pdf b/information/datastudio/Data Studio User Manual.pdf index 09de0d4fcb63becf2949048d686dcf315d1bc9e3..f033abb2d6e38dce8ccc7599c270c3e4ee6cb85f 100644 Binary files a/information/datastudio/Data Studio User Manual.pdf and b/information/datastudio/Data Studio User Manual.pdf differ diff --git "a/information/datastudio/Data Studio \347\224\250\346\210\267\346\211\213\345\206\214.pdf" "b/information/datastudio/Data Studio \347\224\250\346\210\267\346\211\213\345\206\214.pdf" index a9e76571c788f2301e4696d2fe604725710befb3..8b85d40eacdf537b3b137f52fb384b668fd75b00 100644 Binary files "a/information/datastudio/Data Studio \347\224\250\346\210\267\346\211\213\345\206\214.pdf" and "b/information/datastudio/Data Studio \347\224\250\346\210\267\346\211\213\345\206\214.pdf" differ