diff --git a/docs/en_US/release_notes_3_2.rst b/docs/en_US/release_notes_3_2.rst index 5b87a95b7..cdaa1882a 100644 --- a/docs/en_US/release_notes_3_2.rst +++ b/docs/en_US/release_notes_3_2.rst @@ -17,3 +17,4 @@ Bug fixes ********* | `Bug #3309 `_ - Fix Directory format support for backups. +| `Bug #3457 `_ - Fix debugging of procedures in EPAS packages. diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py index b3448b968..f24942d72 100644 --- a/web/pgadmin/tools/debugger/__init__.py +++ b/web/pgadmin/tools/debugger/__init__.py @@ -1240,6 +1240,8 @@ def execute_debugger_query(trans_id, query_type): update_session_debugger_transaction(trans_id, session_obj) status, result = conn.execute_async(sql) + if not status: + internal_server_error(errormsg=result) return make_json_response( data={'status': status, 'result': result} ) @@ -1969,6 +1971,16 @@ def poll_end_execution_result(trans_id): if statusmsg and statusmsg == 'SELECT 1': statusmsg = '' status, result = conn.poll() + if not status: + status = 'ERROR' + return make_json_response( + info=gettext("Execution completed with an error."), + data={ + 'status': status, + 'status_message': result + } + ) + session_function_data = session['functionData'][str(trans_id)] if status == ASYNC_OK and \ not session_function_data['is_func'] and\ @@ -1996,7 +2008,7 @@ def poll_end_execution_result(trans_id): if 'ERROR' in result: status = 'ERROR' return make_json_response( - info=gettext("Execution completed with error"), + info=gettext("Execution completed with an error."), data={ 'status': status, 'status_message': result @@ -2084,7 +2096,9 @@ def poll_result(trans_id): if conn.connected(): status, result = conn.poll() - if status == ASYNC_OK and result is not None: + if not status: + status = 'ERROR' + elif status == ASYNC_OK and result is not None: status = 'Success' columns, result = convert_data_to_dict(conn, result) else: diff --git a/web/pgadmin/tools/debugger/static/js/debugger.js b/web/pgadmin/tools/debugger/static/js/debugger.js index 14c2ccfe8..b1a2929c7 100644 --- a/web/pgadmin/tools/debugger/static/js/debugger.js +++ b/web/pgadmin/tools/debugger/static/js/debugger.js @@ -2,10 +2,11 @@ define([ 'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'alertify', 'sources/pgadmin', 'pgadmin.browser', 'backbone', 'pgadmin.backgrid', 'codemirror', 'pgadmin.backform', - 'pgadmin.tools.debugger.ui', 'wcdocker', 'pgadmin.browser.frame', + 'pgadmin.tools.debugger.ui', 'pgadmin.tools.debugger.utils', + 'wcdocker', 'pgadmin.browser.frame', ], function( gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid, - CodeMirror, Backform, get_function_arguments + CodeMirror, Backform, get_function_arguments, debuggerUtils ) { var pgTools = pgAdmin.Tools = pgAdmin.Tools || {}, wcDocker = window.wcDocker; @@ -337,7 +338,7 @@ define([ 'sid': treeInfo.server._id, 'did': treeInfo.database._id, 'scid': treeInfo.schema._id, - 'func_id': treeInfo.procedure._id, + 'func_id': debuggerUtils.getProcedureId(treeInfo), } ); } else if (d._type == 'trigger_function') { @@ -482,7 +483,7 @@ define([ 'sid': treeInfo.server._id, 'did': treeInfo.database._id, 'scid': treeInfo.schema._id, - 'func_id': treeInfo.procedure._id, + 'func_id': debuggerUtils.getProcedureId(treeInfo), } ); } diff --git a/web/pgadmin/tools/debugger/static/js/debugger_utils.js b/web/pgadmin/tools/debugger/static/js/debugger_utils.js index 63d023270..843b6a47b 100644 --- a/web/pgadmin/tools/debugger/static/js/debugger_utils.js +++ b/web/pgadmin/tools/debugger/static/js/debugger_utils.js @@ -18,6 +18,19 @@ function setFocusToDebuggerEditor(editor, command) { } } +function getProcedureId(treeInfoObject) { + let objectId; + if(treeInfoObject) { + if (treeInfoObject.procedure && treeInfoObject.procedure._id) { + objectId = treeInfoObject.procedure._id; + } else if (treeInfoObject.edbproc && treeInfoObject.edbproc._id) { + objectId = treeInfoObject.edbproc._id; + } + } + return objectId; +} + module.exports = { setFocusToDebuggerEditor: setFocusToDebuggerEditor, + getProcedureId: getProcedureId, }; diff --git a/web/regression/javascript/debugger_utils_spec.js b/web/regression/javascript/debugger_utils_spec.js index 65f95ddef..b70cd727b 100644 --- a/web/regression/javascript/debugger_utils_spec.js +++ b/web/regression/javascript/debugger_utils_spec.js @@ -7,9 +7,12 @@ // ////////////////////////////////////////////////////////////////////////// -import { setFocusToDebuggerEditor } from '../../pgadmin/tools/debugger/static/js/debugger_utils'; +import { + setFocusToDebuggerEditor, + getProcedureId, +} from '../../pgadmin/tools/debugger/static/js/debugger_utils'; -describe('debuggerUtils', function () { +describe('setFocusToDebuggerEditor', function () { let editor; editor = jasmine.createSpyObj('editor', ['focus']); @@ -23,22 +26,60 @@ describe('debuggerUtils', function () { keyCode: 13, }; - describe('debuggerUtils', function () { + describe('setFocusToDebuggerEditor', function () { it('returns undefined if no command is passed', function () { expect(setFocusToDebuggerEditor(editor, null)).toEqual(undefined); }); }); - describe('debuggerUtils', function () { + describe('setFocusToDebuggerEditor', function () { it('should call focus on editor', function () { setFocusToDebuggerEditor(editor, enter_key); expect(editor.focus).toHaveBeenCalled(); }); }); - describe('debuggerUtils', function () { + describe('setFocusToDebuggerEditor', function () { it('should not call focus on editor and returns undefined', function () { expect(setFocusToDebuggerEditor(editor, tab_key)).toEqual(undefined); }); }); }); + +describe('getProcedureId', function () { + let treeInfroProc = { + 'procedure': { + '_id': 123, + }, + }; + let treeInfroInvalidProcId = { + 'procedure': { + '_id': null, + }, + }; + let treeInfroEdbProc = { + 'edbproc': { + '_id': 321, + }, + }; + let fakeTreeInfro; + + describe('Should return proper object id', function () { + it('returns valid procedure id', function () { + expect(getProcedureId(treeInfroProc)).toBe(123); + }); + + it('returns valid edbproc id', function () { + expect(getProcedureId(treeInfroEdbProc)).toBe(321); + }); + + it('returns undefined for fake tree info', function () { + expect(getProcedureId(fakeTreeInfro)).toBe(undefined); + }); + + it('returns undefined for invalid procedure id', function () { + expect(getProcedureId(treeInfroInvalidProcId)).toBe(undefined); + }); + }); +}); +