Please find an updated patch attached.

On Fri, Aug 23, 2019 at 7:57 AM Aditya Toshniwal <
aditya.toshni...@enterprisedb.com> wrote:

> Hi Yosry,
>
> This breaks the reconnect for query tool. Open a query tool, execute some
> query and then restart the python server. Go to the query tool and click
> execute. It will show a warning, on continuing it should connect again. It
> throws exception in browser console:
> Uncaught TypeError: Cannot read property 'apply' of undefined
>     at Object.eval (VM69935 sqleditor.js:1769)
>     at Object.callback (alertify.js:3347)
>     at triggerCallback (alertify.js:1220)
>     at Object.buttonsClickHandler (alertify.js:1241)
>     at HTMLDivElement.eval (alertify.js:299)
>
> On Thu, Aug 22, 2019 at 11:44 PM Yosry Muhammad <yosry...@gmail.com>
> wrote:
>
>> Please find an updated patch attached.
>>
>> On Mon, Aug 19, 2019 at 9:54 AM Yosry Muhammad <yosry...@gmail.com>
>> wrote:
>>
>>> Jasmine tests passed on my machine, I will take another look once I have
>>> access to my machine.
>>>
>>> On Mon, Aug 19, 2019, 7:57 AM Akshay Joshi <
>>> akshay.jo...@enterprisedb.com> wrote:
>>>
>>>> Hi Yosry
>>>>
>>>> Jasmine tests are failing, can you please fix those and resend the
>>>> patch.
>>>>
>>>> On Fri, Aug 16, 2019 at 11:23 PM Yosry Muhammad <yosry...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi hackers,
>>>>>
>>>>> Please find attached a patch with minimal refactoring of:
>>>>> web/pgadmin/tools/sqleditor/static/js/sqleditor.js
>>>>>
>>>>> This includes merging 2 redundant functions into one and renaming some
>>>>> functions to have more expressive and consistent names.
>>>>>
>>>>> Please review !
>>>>> Thanks.
>>>>> --
>>>>> *Yosry Muhammad Yosry*
>>>>>
>>>>> Computer Engineering student,
>>>>> The Faculty of Engineering,
>>>>> Cairo University (2021).
>>>>> Class representative of CMP 2021.
>>>>> https://www.linkedin.com/in/yosrym93/
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>>
>>>> *Sr. Software Architect*
>>>> *EnterpriseDB Software India Private Limited*
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>
>> --
>> *Yosry Muhammad Yosry*
>>
>> Computer Engineering student,
>> The Faculty of Engineering,
>> Cairo University (2021).
>> Class representative of CMP 2021.
>> https://www.linkedin.com/in/yosrym93/
>>
>
>
> --
> Thanks and Regards,
> Aditya Toshniwal
> Software Engineer | EnterpriseDB India | Pune
> "Don't Complain about Heat, Plant a TREE"
>


-- 
*Yosry Muhammad Yosry*

Computer Engineering student,
The Faculty of Engineering,
Cairo University (2021).
Class representative of CMP 2021.
https://www.linkedin.com/in/yosrym93/
diff --git a/docs/en_US/release_notes_4_13.rst b/docs/en_US/release_notes_4_13.rst
index bc21dfeca..a0a3a38ef 100644
--- a/docs/en_US/release_notes_4_13.rst
+++ b/docs/en_US/release_notes_4_13.rst
@@ -22,5 +22,4 @@ Bug fixes
 | `Issue #2706 <https://redmine.postgresql.org/issues/2706>`_ -  Added ProjectSet icon for explain module.
 | `Issue #2828 <https://redmine.postgresql.org/issues/2828>`_ -  Added Gather Merge, Named Tuple Store Scan and Table Function Scan icon for explain module.
 | `Issue #4643 <https://redmine.postgresql.org/issues/4643>`_ -  Fix Truncate option deselect issue for compound triggers.
-| `Issue #4644 <https://redmine.postgresql.org/issues/4644>`_ -  Fix length and precision enable/disable issue when changing the data type for Domain node.
-| `Issue #4650 <https://redmine.postgresql.org/issues/4650>`_ -  Fix SQL tab issue for Views. It's a regression of compound triggers.
\ No newline at end of file
+| `Issue #4644 <https://redmine.postgresql.org/issues/4644>`_ -  Fix length and precision enable/disable issue when changing the data type for Domain node.
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
index 4bc357c83..cfefa5314 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py
@@ -879,7 +879,6 @@ class ViewNode(PGChildNodeView, VacuumSettings):
         Get all compound trigger nodes associated with view node,
         generate their sql and render into sql tab
         """
-        SQL_data = ''
         if self.manager.server_type == 'ppas' \
                 and self.manager.version >= 120000:
 
@@ -889,6 +888,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
             # Define template path
             self.ct_trigger_temp_path = 'compound_triggers'
 
+            SQL_data = ''
             SQL = render_template("/".join(
                 [self.ct_trigger_temp_path,
                  'sql/{0}/#{1}#/nodes.sql'.format(
@@ -949,7 +949,7 @@ class ViewNode(PGChildNodeView, VacuumSettings):
                 SQL_data += '\n'
                 SQL_data += SQL
 
-        return SQL_data
+            return SQL_data
 
     def get_trigger_sql(self, vid):
         """
diff --git a/web/pgadmin/static/js/sqleditor/execute_query.js b/web/pgadmin/static/js/sqleditor/execute_query.js
index 26da69148..b8baa410d 100644
--- a/web/pgadmin/static/js/sqleditor/execute_query.js
+++ b/web/pgadmin/static/js/sqleditor/execute_query.js
@@ -224,22 +224,22 @@ class ExecuteQuery {
     }
 
     if (this.userManagement.isPgaLoginRequired(httpMessage.response)) {
-      this.sqlServerObject.saveState('execute', [this.explainPlan]);
+      this.sqlServerObject.saveState('check_data_changes_to_execute_query', [this.explainPlan]);
       this.userManagement.pgaLogin();
     }
 
     if (httpErrorHandler.httpResponseRequiresNewTransaction(httpMessage.response)) {
-      this.sqlServerObject.saveState('execute', [this.explainPlan]);
+      this.sqlServerObject.saveState('check_data_changes_to_execute_query', [this.explainPlan]);
       this.sqlServerObject.initTransaction();
     }
 
     if (this.wasDatabaseConnectionLost(httpMessage)) {
-      this.sqlServerObject.saveState('execute', [this.explainPlan]);
+      this.sqlServerObject.saveState('check_data_changes_to_execute_query', [this.explainPlan]);
       this.sqlServerObject.handle_connection_lost(false, httpMessage);
     }
 
     if(this.isCryptKeyMissing(httpMessage)) {
-      this.sqlServerObject.saveState('execute', [this.explainPlan]);
+      this.sqlServerObject.saveState('check_data_changes_to_execute_query', [this.explainPlan]);
       this.sqlServerObject.handle_cryptkey_missing();
       return;
     }
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
index 18e15ecbe..34b6827ad 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
@@ -39,13 +39,8 @@ let queryToolActions = {
   },
 
   executeQuery: function (sqlEditorController) {
-    if(sqlEditorController.is_query_tool) {
-      this._clearMessageTab();
-      sqlEditorController.execute();
-    } else {
-      this._clearMessageTab();
-      sqlEditorController.execute_data_query();
-    }
+    this._clearMessageTab();
+    sqlEditorController.check_data_changes_to_execute_query();
   },
 
   explainAnalyze: function (sqlEditorController) {
@@ -60,7 +55,7 @@ let queryToolActions = {
       settings: this._settings(),
     };
     this._clearMessageTab();
-    sqlEditorController.execute(explainObject);
+    sqlEditorController.check_data_changes_to_execute_query(explainObject);
   },
 
   explain: function (sqlEditorController) {
@@ -76,7 +71,7 @@ let queryToolActions = {
       settings: this._settings(),
     };
     this._clearMessageTab();
-    sqlEditorController.execute(explainObject);
+    sqlEditorController.check_data_changes_to_execute_query(explainObject);
   },
 
   download: function (sqlEditorController) {
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 2a956a3d7..61d33ce78 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -2224,7 +2224,7 @@ define('tools.querytool', [
             cm.className += ' bg-gray-lighter opacity-5 hide-cursor-workaround';
           }
           self.disable_tool_buttons(true);
-          self.execute_data_query();
+          self.check_data_changes_to_execute_query();
         }
       },
 
@@ -2265,9 +2265,8 @@ define('tools.querytool', [
         self.on('pgadmin-sqleditor:unindent_selected_code', self._unindent_selected_code, self);
       },
 
-      // Checks if there is any dirty data in the grid before
-      // it executes the sql query in View Data mode
-      execute_data_query: function() {
+      // Checks if there is any dirty data in the grid before executing a query
+      check_data_changes_to_execute_query: function(explain_prefix=null, shouldReconnect=false) {
         var self = this;
 
         // Check if the data grid has any changes before running query
@@ -2279,8 +2278,13 @@ define('tools.querytool', [
           alertify.confirm(gettext('Unsaved changes'),
             gettext('The data has been modified, but not saved. Are you sure you wish to discard the changes?'),
             function() {
-              // Do nothing as user do not want to save, just continue
-              self._run_query();
+              // The user does not want to save, just continue
+              if(self.is_query_tool) {
+                self._execute_sql_query(explain_prefix, shouldReconnect);
+              }
+              else {
+                self._execute_view_data_query();
+              }
             },
             function() {
               // Stop, User wants to save
@@ -2291,12 +2295,17 @@ define('tools.querytool', [
             cancel: gettext('No'),
           });
         } else {
-          self._run_query();
+          if(self.is_query_tool) {
+            self._execute_sql_query(explain_prefix, shouldReconnect);
+          }
+          else {
+            self._execute_view_data_query();
+          }
         }
       },
 
-      // This function makes the ajax call to execute the sql query in View Data mode
-      _run_query: function() {
+      // Makes the ajax call to execute the sql query in View Data mode
+      _execute_view_data_query: function() {
         var self = this,
           url = url_for('sqleditor.view_data_start', {
             'trans_id': self.transId,
@@ -2373,12 +2382,36 @@ define('tools.querytool', [
           .fail(function(e) {
             self.trigger('pgadmin-sqleditor:loading-icon:hide');
             let msg = httpErrorHandler.handleQueryToolAjaxError(
-              pgAdmin, self, e, '_run_query', [], true
+              pgAdmin, self, e, '_execute_view_data_query', [], true
             );
             self.update_msg_history(false, msg);
           });
       },
 
+      // Executes sql query in the editor in Query Tool mode
+      _execute_sql_query: function(explain_prefix, shouldReconnect) {
+        var self = this, sql = '';
+
+        self.has_more_rows = false;
+        self.fetching_rows = false;
+
+        if (!_.isUndefined(self.special_sql)) {
+          sql = self.special_sql;
+        } else {
+          /* If code is selected in the code mirror then execute
+           * the selected part else execute the complete code.
+           */
+          var selected_code = self.gridView.query_tool_obj.getSelection();
+          if (selected_code.length > 0)
+            sql = selected_code;
+          else
+            sql = self.gridView.query_tool_obj.getValue();
+        }
+
+        const executeQuery = new ExecuteQuery.ExecuteQuery(this, pgAdmin.Browser.UserManagement);
+        executeQuery.execute(sql, explain_prefix, shouldReconnect);
+      },
+
       // This is a wrapper to call_render function
       // We need this because we have separated columns route & result route
       // We need to combine both result here in wrapper before rendering grid
@@ -3711,60 +3744,6 @@ define('tools.querytool', [
         }
       },
 
-      // Checks if there is any dirty data in the grid before
-      // it executes the sql query in Query Tool mode
-      execute: function(explain_prefix, shouldReconnect=false) {
-        var self = this;
-
-        // Check if the data grid has any changes before running query
-        if (self.can_edit && _.has(self, 'data_store') &&
-          (_.size(self.data_store.added) ||
-            _.size(self.data_store.updated) ||
-            _.size(self.data_store.deleted))
-        ) {
-          alertify.confirm(gettext('Unsaved changes'),
-            gettext('The data has been modified, but not saved. Are you sure you wish to discard the changes?'),
-            function() {
-              // Do nothing as user do not want to save, just continue
-              self._execute_sql_query(explain_prefix, shouldReconnect);
-            },
-            function() {
-              // Stop, User wants to save
-              return true;
-            }
-          ).set('labels', {
-            ok: gettext('Yes'),
-            cancel: gettext('No'),
-          });
-        } else {
-          self._execute_sql_query(explain_prefix, shouldReconnect);
-        }
-      },
-
-      // Executes sql query in the editor in Query Tool mode
-      _execute_sql_query: function(explain_prefix, shouldReconnect) {
-        var self = this, sql = '';
-
-        self.has_more_rows = false;
-        self.fetching_rows = false;
-
-        if (!_.isUndefined(self.special_sql)) {
-          sql = self.special_sql;
-        } else {
-          /* If code is selected in the code mirror then execute
-           * the selected part else execute the complete code.
-           */
-          var selected_code = self.gridView.query_tool_obj.getSelection();
-          if (selected_code.length > 0)
-            sql = selected_code;
-          else
-            sql = self.gridView.query_tool_obj.getValue();
-        }
-
-        const executeQuery = new ExecuteQuery.ExecuteQuery(this, pgAdmin.Browser.UserManagement);
-        executeQuery.execute(sql, explain_prefix, shouldReconnect);
-      },
-
       /* This function is used to highlight the error line and
        * underlining for the error word.
        */
diff --git a/web/regression/javascript/sqleditor/query_tool_actions_spec.js b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
index e5e486572..487bbb4eb 100644
--- a/web/regression/javascript/sqleditor/query_tool_actions_spec.js
+++ b/web/regression/javascript/sqleditor/query_tool_actions_spec.js
@@ -30,7 +30,7 @@ describe('queryToolActions', () => {
       it('calls the execute function on the sqlEditorController', () => {
         queryToolActions.executeQuery(sqlEditorController);
 
-        expect(sqlEditorController.execute).toHaveBeenCalled();
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalled();
       });
     });
     describe('when the command is being run from the view data view', () => {
@@ -39,10 +39,10 @@ describe('queryToolActions', () => {
         sqlEditorController.is_query_tool = false;
       });
 
-      it('it calls the execute_data_query function on the sqlEditorController', () => {
+      it('it calls the check_data_changes_to_execute_query function on the sqlEditorController', () => {
         queryToolActions.executeQuery(sqlEditorController);
 
-        expect(sqlEditorController.execute_data_query).toHaveBeenCalled();
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalled();
       });
     });
   });
@@ -74,7 +74,7 @@ describe('queryToolActions', () => {
           settings: false,
         };
 
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -100,7 +100,7 @@ describe('queryToolActions', () => {
           summary: true,
           settings: true,
         };
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -128,7 +128,7 @@ describe('queryToolActions', () => {
           settings: false,
         };
 
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -156,7 +156,7 @@ describe('queryToolActions', () => {
           settings: false,
         };
 
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -184,7 +184,7 @@ describe('queryToolActions', () => {
           settings: true,
         };
 
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
   });
@@ -213,7 +213,7 @@ describe('queryToolActions', () => {
           summary: false,
           settings: false,
         };
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -239,7 +239,7 @@ describe('queryToolActions', () => {
           settings: false,
         };
 
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
 
@@ -264,7 +264,7 @@ describe('queryToolActions', () => {
           summary: false,
           settings: false,
         };
-        expect(sqlEditorController.execute).toHaveBeenCalledWith(explainObject);
+        expect(sqlEditorController.check_data_changes_to_execute_query).toHaveBeenCalledWith(explainObject);
       });
     });
   });
@@ -621,8 +621,7 @@ describe('queryToolActions', () => {
       trigger: jasmine.createSpy('trigger'),
       table_name: 'iAmATable',
       is_query_tool: true,
-      execute: jasmine.createSpy('execute'),
-      execute_data_query: jasmine.createSpy('execute_data_query'),
+      check_data_changes_to_execute_query: jasmine.createSpy('check_data_changes_to_execute_query'),
     };
   }
 });

Reply via email to