public inbox for [email protected]
help / color / mirror / Atom feedFrom: Murtuza Zabuawala <[email protected]>
To: Dave Page <[email protected]>
Cc: pgadmin-hackers <[email protected]>
Subject: Re: [pgAdmin4][RM#3235] Code refactoring in Query tool
Date: Tue, 3 Apr 2018 21:08:15 +0530
Message-ID: <CAKKotZRwxcozrSic25xSCtK_z7bdnksrF2_4GSeWi=6zDUSw_g@mail.gmail.com> (raw)
In-Reply-To: <CA+OCxoygT-+xezSAboURa9E9myQCX2GbO4DCFg7yY+umHhEa5g@mail.gmail.com>
References: <CAKKotZRidfdPkSe=2wiaDsz_F3sAXdWZs_1SQLFks1YeP24UTQ@mail.gmail.com>
<CA+OCxoygT-+xezSAboURa9E9myQCX2GbO4DCFg7yY+umHhEa5g@mail.gmail.com>
Hi Dave,
PFA updated patch, I've renamed it to query_tool_http_error_handler.js
& query_tool_http_error_handler_spec.js respectively.
--
Regards,
Murtuza Zabuawala
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
On Tue, Apr 3, 2018 at 7:43 PM, Dave Page <[email protected]> wrote:
> HI
>
> On Tue, Apr 3, 2018 at 12:27 PM, Murtuza Zabuawala <murtuza.zabuawala@
> enterprisedb.com> wrote:
>
>> Hi,
>>
>> PFA patch to extract the common code from query tool to handle ajax
>> errors & connection handling, Also added unit tests around extracted code.
>>
>
> Looks good to me, except, I wonder if we should rename
> is_new_transaction_required.js/is_new_transaction_required_spec.js to
> something a little more generic; maybe conn_tx_handler_funcs.js? Not sure I
> like that though.
>
>
> --
> Dave Page
> Blog: http://pgsnake.blogspot.com
> Twitter: @pgsnake
>
> EnterpriseDB UK: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>
Attachments:
[application/octet-stream] RM_3235_v1.diff (43.6K, 3-RM_3235_v1.diff)
download | inline diff:
diff --git a/web/pgadmin/static/js/sqleditor/execute_query.js b/web/pgadmin/static/js/sqleditor/execute_query.js
index 9c36f28..8e201fc 100644
--- a/web/pgadmin/static/js/sqleditor/execute_query.js
+++ b/web/pgadmin/static/js/sqleditor/execute_query.js
@@ -11,7 +11,7 @@ import gettext from '../gettext';
import $ from 'jquery';
import url_for from '../url_for';
import axios from 'axios';
-import * as transaction from './is_new_transaction_required';
+import * as httpErrorHandler from './query_tool_http_error_handler';
class LoadingScreen {
constructor(sqlEditor) {
@@ -203,7 +203,7 @@ class ExecuteQuery {
this.userManagement.pga_login();
}
- if (transaction.is_new_transaction_required(httpMessage.response)) {
+ if (httpErrorHandler.is_new_transaction_required(httpMessage.response)) {
this.sqlServerObject.save_state('execute', [this.explainPlan]);
this.sqlServerObject.init_transaction();
}
diff --git a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js b/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js
deleted file mode 100644
index e009611..0000000
--- a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js
+++ /dev/null
@@ -1,23 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2018, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-export function is_new_transaction_required(xhr) {
- /* If responseJSON is undefined then it could be object of
- * axios(Promise HTTP) response, so we should check accordingly.
- */
- if (xhr.responseJSON === undefined && xhr.data !== undefined) {
- return xhr.status === 404 && xhr.data &&
- xhr.data.info &&
- xhr.data.info === 'DATAGRID_TRANSACTION_REQUIRED';
- }
-
- return xhr.status === 404 && xhr.responseJSON &&
- xhr.responseJSON.info &&
- xhr.responseJSON.info === 'DATAGRID_TRANSACTION_REQUIRED';
-}
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js b/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js
new file mode 100644
index 0000000..f5bd2a9
--- /dev/null
+++ b/web/pgadmin/static/js/sqleditor/query_tool_http_error_handler.js
@@ -0,0 +1,76 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+import gettext from 'sources/gettext';
+
+export function is_new_transaction_required(xhr) {
+ /* If responseJSON is undefined then it could be object of
+ * axios(Promise HTTP) response, so we should check accordingly.
+ */
+ if (xhr.responseJSON === undefined && xhr.data !== undefined) {
+ return xhr.status === 404 && xhr.data &&
+ xhr.data.info &&
+ xhr.data.info === 'DATAGRID_TRANSACTION_REQUIRED';
+ }
+
+ return xhr.status === 404 && xhr.responseJSON &&
+ xhr.responseJSON.info &&
+ xhr.responseJSON.info === 'DATAGRID_TRANSACTION_REQUIRED';
+}
+
+// Allow us to redirect to login dialog and if required then re-initiate the transaction
+export function handleLoginRequiredAndTransactionRequired(
+ pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction
+) {
+ stateParameters = stateParameters && stateParameters.length > 0 ? stateParameters : [];
+ if (pgAdmin.Browser.UserManagement.is_pga_login_required(exception)) {
+ if (stateToSave) {
+ handler.save_state(stateToSave, stateParameters);
+ }
+ return pgAdmin.Browser.UserManagement.pga_login();
+ }
+
+ if(checkTransaction && is_new_transaction_required(exception)) {
+ if (stateToSave) {
+ handler.save_state(stateToSave, stateParameters);
+ }
+ return handler.init_transaction();
+ }
+}
+
+// Allow us to handle the AJAX error from Query tool
+export function handleQueryToolAjaxError(
+ pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction
+) {
+ if (exception.readyState == 0) {
+ return gettext('Not connected to the server or the connection to the server has been closed.');
+ }
+
+ handleLoginRequiredAndTransactionRequired(
+ pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction
+ );
+
+ let msg = exception.responseText;
+ if (exception.responseJSON != undefined) {
+ if(exception.responseJSON.errormsg != undefined) {
+ msg = exception.responseJSON.errormsg;
+ }
+
+ if(exception.status == 503 && exception.responseJSON.info != undefined &&
+ exception.responseJSON.info == 'CONNECTION_LOST') {
+ setTimeout(function() {
+ if (stateToSave) {
+ handler.save_state(stateToSave, stateParameters);
+ }
+ handler.handle_connection_lost(false, exception);
+ });
+ }
+ }
+
+ return msg;
+}
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 0409a87..2c01075 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -13,7 +13,7 @@ define('tools.querytool', [
'sources/selection/set_staged_rows',
'sources/sqleditor_utils',
'sources/sqleditor/execute_query',
- 'sources/sqleditor/is_new_transaction_required',
+ 'sources/sqleditor/query_tool_http_error_handler',
'sources/history/index.js',
'sources/../jsx/history/query_history',
'react', 'react-dom',
@@ -33,7 +33,7 @@ define('tools.querytool', [
], function(
babelPollyfill, gettext, url_for, $, _, S, alertify, pgAdmin, Backbone, codemirror,
pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
- XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, transaction,
+ XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, httpErrorHandler,
HistoryBundle, queryHistory, React, ReactDOM,
keyboardShortcuts, queryToolActions, Datagrid, modifyAnimation,
calculateQueryRunTime, callRenderAfterPoll) {
@@ -486,12 +486,9 @@ define('tools.querytool', [
});
},
error:function(e) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- return pgAdmin.Browser.UserManagement.pga_login();
- }
- if(transaction.is_new_transaction_required(e)) {
- return self.init_transaction();
- }
+ return httpErrorHandler.handleLoginRequiredAndTransactionRequired(
+ pgAdmin, self, e, null, null, null
+ );
},
});
}.bind(ctx),
@@ -1142,16 +1139,11 @@ define('tools.querytool', [
if (typeof cb == 'function') {
cb();
}
- if (e.readyState == 0) {
- self.update_msg_history(false,
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- pgAdmin.Browser.UserManagement.pga_login();
- }
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, null, null, false
+ );
+ self.update_msg_history(false, msg);
},
});
},
@@ -1935,18 +1927,12 @@ define('tools.querytool', [
}
})
.fail(function(xhr) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(xhr)) {
- pgAdmin.Browser.UserManagement.pga_login();
- } else {
- if(xhr.responseJSON &&
- xhr.responseJSON.result) {
- alertify.dlgGetServerPass(gettext('Connect to Server'),
- xhr.responseJSON.result);
- } else {
- alertify.dlgGetServerPass(gettext('Connect to Server'),
- xhr.responseText);
- }
- }
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, xhr, null, null, false
+ );
+ alertify.dlgGetServerPass(
+ gettext('Connect to Server'), msg
+ );
});
},
/* This function is used to create instance of SQLEditorView,
@@ -2005,22 +1991,13 @@ define('tools.querytool', [
self.init_events();
},
error: function(jqx) {
- var msg = '';
+ let msg = '';
self.init_events();
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(jqx)) {
- return pgAdmin.Browser.UserManagement.pga_login();
- }
+ msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, jqx, null, null, false
+ );
- /* Error from the server */
- if (jqx.status == 410 || jqx.status == 500) {
- try {
- var data = $.parseJSON(jqx.responseText);
- msg = data.errormsg;
- } catch (e) {
- msg = jqx.responseText;
- }
- }
pgBrowser.report_error(
S(gettext('Error fetching SQL for script: %s.')).sprintf(msg).value()
);
@@ -2189,37 +2166,9 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (e.readyState == 0) {
- self.update_msg_history(false,
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_run_query', []);
- pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_run_query', []);
- self.init_transaction();
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
-
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_run_query', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_run_query', null, true
+ );
self.update_msg_history(false, msg);
},
});
@@ -2830,38 +2779,10 @@ define('tools.querytool', [
}
},
error: function(e) {
- if (e.readyState == 0) {
- self.update_msg_history(false,
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_save', [view, controller, save_as]);
- pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_save', [view, controller, save_as]);
- self.init_transaction();
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
-
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_save', [view, controller, save_as]);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
+ let stateParams = [view, controller, save_as];
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_save', stateParams, true
+ );
self.update_msg_history(false, msg);
},
});
@@ -3007,13 +2928,11 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_select_file_handler', [_e]);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- var errmsg = $.parseJSON(e.responseText).errormsg;
- alertify.error(errmsg);
+ let stateParams = [_e];
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_select_file_handler', stateParams, false
+ );
+ alertify.error(msg);
// hide cursor
$busy_icon_div.removeClass('show_progress');
},
@@ -3059,17 +2978,11 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_save_file_handler', [_e]);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- var errmsg = $.parseJSON(e.responseText).errormsg;
- setTimeout(
- function() {
- alertify.error(errmsg);
- }, 10
+ let stateParams = [_e];
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_save_file_handler', stateParams, false
);
+ alertify.error(msg);
},
});
},
@@ -3165,36 +3078,9 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_show_filter', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_show_filter', []);
- return self.init_transaction();
- }
-
- var msg;
- if (e.readyState == 0) {
- msg =
- gettext('Not connected to the server or the connection to the server has been closed.');
- } else {
- msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_show_filter', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
- }
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_show_filter', null, true
+ );
setTimeout(
function() {
alertify.alert(gettext('Get Filter Error'), msg);
@@ -3255,42 +3141,10 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_include_filter', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_include_filter', []);
- return self.init_transaction();
- }
-
- setTimeout(
- function() {
- if (e.readyState == 0) {
- alertify.alert(gettext('Filter By Selection Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_include_filter', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
- alertify.alert(gettext('Filter By Selection Error'), msg);
- }, 10
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_include_filter', null, true
);
+ alertify.alert(gettext('Filter By Selection Error'), msg);
},
});
},
@@ -3346,42 +3200,10 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_exclude_filter', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_exclude_filter', []);
- return self.init_transaction();
- }
-
- setTimeout(
- function() {
- if (e.readyState == 0) {
- alertify.alert(gettext('Filter Exclude Selection Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_exclude_filter', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
- alertify.alert(gettext('Filter Exclude Selection Error'), msg);
- }, 10
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_exclude_filter', null, true
);
+ alertify.alert(gettext('Filter Exclude Selection Error'), msg);
},
});
},
@@ -3416,42 +3238,10 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_remove_filter', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_remove_filter', []);
- return self.init_transaction();
- }
-
- setTimeout(
- function() {
- if (e.readyState == 0) {
- alertify.alert(gettext('Remove Filter Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_remove_filter', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
- alertify.alert(gettext('Remove Filter Error'), msg);
- }
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_remove_filter', null, true
);
+ alertify.alert(gettext('Remove Filter Error'), msg);
},
});
},
@@ -3491,42 +3281,10 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_apply_filter', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_apply_filter', []);
- return self.init_transaction();
- }
-
- setTimeout(
- function() {
- if (e.readyState == 0) {
- alertify.alert(gettext('Apply Filter Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_apply_filter', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
- alertify.alert(gettext('Apply Filter Error'), msg);
- }, 10
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_apply_filter', null, true
);
+ alertify.alert(gettext('Apply Filter Error'), msg);
},
});
},
@@ -3646,42 +3404,10 @@ define('tools.querytool', [
},
error: function(e) {
self.trigger('pgadmin-sqleditor:loading-icon:hide');
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_set_limit', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_set_limit', []);
- return self.init_transaction();
- }
-
- setTimeout(
- function() {
- if (e.readyState == 0) {
- alertify.alert(gettext('Change limit Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_set_limit', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
- alertify.alert(gettext('Change limit Error'), msg);
- }, 10
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_set_limit', null, true
);
+ alertify.alert(gettext('Change limit Error'), msg);
},
});
},
@@ -3805,23 +3531,9 @@ define('tools.querytool', [
error: function(e) {
self.disable_tool_buttons(false);
- if (e.readyState == 0) {
- alertify.alert(gettext('Cancel Query Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_cancel_query', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined &&
- e.responseJSON.errormsg != undefined)
- msg = e.responseJSON.errormsg;
-
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_cancel_query', null, false
+ );
alertify.alert(gettext('Cancel Query Error'), msg);
},
});
@@ -3866,38 +3578,10 @@ define('tools.querytool', [
alertify.alert(gettext('Auto Rollback Error'), res.data.result);
},
error: function(e) {
- if (e.readyState == 0) {
- alertify.alert(gettext('Auto Rollback Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_auto_rollback', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_auto_rollback', []);
- self.init_transaction();
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
-
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_auto_rollback', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_auto_rollback', null, true
+ );
alertify.alert(gettext('Auto Rollback Error'), msg);
},
});
@@ -3927,38 +3611,9 @@ define('tools.querytool', [
alertify.alert(gettext('Auto Commit Error'), res.data.result);
},
error: function(e) {
- if (e.readyState == 0) {
- alertify.alert(gettext('Auto Commit Error'),
- gettext('Not connected to the server or the connection to the server has been closed.')
- );
- return;
- }
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_auto_commit', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_auto_commit', []);
- return self.init_transaction();
- }
-
- var msg = e.responseText;
- if (e.responseJSON != undefined) {
- if(e.responseJSON.errormsg != undefined) {
- msg = e.responseJSON.errormsg;
- }
-
- if(e.status == 503 && e.responseJSON.info != undefined &&
- e.responseJSON.info == 'CONNECTION_LOST') {
- setTimeout(function() {
- self.save_state('_auto_commit', []);
- self.handle_connection_lost(false, e);
- });
- }
- }
-
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_auto_commit', null, true
+ );
alertify.alert(gettext('Auto Commit Error'), msg);
},
});
@@ -3995,21 +3650,10 @@ define('tools.querytool', [
}
},
error: function(e) {
-
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_explain_verbose', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_explain_verbose', []);
- return self.init_transaction();
- }
-
- alertify.alert(gettext('Explain options error'),
- gettext('Error occurred while setting verbose option in explain.')
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_explain_verbose', null, true
);
- return;
+ alertify.alert(gettext('Explain options error'), msg);
},
});
},
@@ -4045,19 +3689,10 @@ define('tools.querytool', [
}
},
error: function(e) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_explain_costs', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_explain_costs', []);
- return self.init_transaction();
- }
-
- alertify.alert(gettext('Explain options error'),
- gettext('Error occurred while setting costs option in explain.')
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_explain_costs', null, true
);
+ alertify.alert(gettext('Explain options error'), msg);
},
});
},
@@ -4093,19 +3728,10 @@ define('tools.querytool', [
}
},
error: function(e) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_explain_buffers', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_explain_buffers', []);
- return self.init_transaction();
- }
-
- alertify.alert(gettext('Explain options error'),
- gettext('Error occurred while setting buffers option in explain.')
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_explain_buffers', null, true
);
+ alertify.alert(gettext('Explain options error'), msg);
},
});
},
@@ -4140,19 +3766,10 @@ define('tools.querytool', [
}
},
error: function(e) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('_explain_timing', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('_explain_timing', []);
- return self.init_transaction();
- }
-
- alertify.alert(gettext('Explain options error'),
- gettext('Error occurred while setting timing option in explain.')
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, '_explain_timing', null, true
);
+ alertify.alert(gettext('Explain options error'), msg);
},
});
},
@@ -4254,21 +3871,11 @@ define('tools.querytool', [
}
},
error: function(e) {
- if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) {
- self.save_state('get_preferences', []);
- return pgAdmin.Browser.UserManagement.pga_login();
- }
-
- if(transaction.is_new_transaction_required(e)) {
- self.save_state('get_preferences', []);
- return self.init_transaction();
- }
-
- updateUI();
- alertify.alert(
- gettext('Get Preferences error'),
- gettext('Error occurred while getting query tool options.')
+ let msg = httpErrorHandler.handleQueryToolAjaxError(
+ pgAdmin, self, e, 'get_preferences', null, true
);
+ updateUI();
+ alertify.alert(gettext('Get Preferences error'), msg);
},
});
},
diff --git a/web/regression/javascript/sqleditor/execute_query_spec.js b/web/regression/javascript/sqleditor/execute_query_spec.js
index 5f92dc5..f7176d1 100644
--- a/web/regression/javascript/sqleditor/execute_query_spec.js
+++ b/web/regression/javascript/sqleditor/execute_query_spec.js
@@ -8,7 +8,7 @@
//////////////////////////////////////////////////////////////////////////
import * as subject from 'sources/sqleditor/execute_query';
-import * as transaction from 'sources/sqleditor/is_new_transaction_required';
+import * as httpErrorHandler from 'sources/sqleditor/query_tool_http_error_handler';
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import $ from 'jquery';
@@ -47,7 +47,7 @@ describe('ExecuteQuery', () => {
sqlEditorMock.transId = 123;
sqlEditorMock.rows_affected = 1000;
executeQuery = new subject.ExecuteQuery(sqlEditorMock, userManagementMock);
- isNewTransactionRequiredMock = spyOn(transaction, 'is_new_transaction_required');
+ isNewTransactionRequiredMock = spyOn(httpErrorHandler, 'is_new_transaction_required');
});
afterEach(() => {
diff --git a/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js b/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js
deleted file mode 100644
index 97d1bc5..0000000
--- a/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js
+++ /dev/null
@@ -1,65 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2018, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-import {is_new_transaction_required} from '../../../pgadmin/static/js/sqleditor/is_new_transaction_required';
-
-describe('#is_new_transaction_required', () => {
- describe('when status is not 404', () => {
- it('should return false', () => {
- expect(is_new_transaction_required({
- status: 300,
- })).toBe(false);
- });
- });
-
- describe('when status is 404', () => {
- describe('when data is not present', () => {
- it('should return false', () => {
- expect(is_new_transaction_required({
- status: 404,
- })).toBeFalsy();
- });
- });
-
- describe('when data is present', () => {
- describe('when info is not present inside data', () => {
- it('should return false', () => {
- expect(is_new_transaction_required({
- status: 404,
- data: {},
- })).toBeFalsy();
- });
- });
-
- describe('when info is present inside data', () => {
- describe('when info value is not "DATAGRID_TRANSACTION_REQUIRED"', () => {
- it('should return false', () => {
- expect(is_new_transaction_required({
- status: 404,
- data: {
- info: 'some information',
- },
- })).toBe(false);
- });
- });
-
- describe('when info value is "DATAGRID_TRANSACTION_REQUIRED"', () => {
- it('should return false', () => {
- expect(is_new_transaction_required({
- status: 404,
- data: {
- info: 'DATAGRID_TRANSACTION_REQUIRED',
- },
- })).toBe(true);
- });
- });
- });
- });
- });
-});
diff --git a/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js b/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js
new file mode 100644
index 0000000..fd3f982
--- /dev/null
+++ b/web/regression/javascript/sqleditor/query_tool_http_error_handler_spec.js
@@ -0,0 +1,191 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import {
+ is_new_transaction_required,
+ handleQueryToolAjaxError
+} from '../../../pgadmin/static/js/sqleditor/query_tool_http_error_handler';
+
+describe('#is_new_transaction_required', () => {
+ describe('when status is not 404', () => {
+ it('should return false', () => {
+ expect(is_new_transaction_required({
+ status: 300,
+ })).toBe(false);
+ });
+ });
+
+ describe('when status is 404', () => {
+ describe('when data is not present', () => {
+ it('should return false', () => {
+ expect(is_new_transaction_required({
+ status: 404,
+ })).toBeFalsy();
+ });
+ });
+
+ describe('when data is present', () => {
+ describe('when info is not present inside data', () => {
+ it('should return false', () => {
+ expect(is_new_transaction_required({
+ status: 404,
+ data: {},
+ })).toBeFalsy();
+ });
+ });
+
+ describe('when info is present inside data', () => {
+ describe('when info value is not "DATAGRID_TRANSACTION_REQUIRED"', () => {
+ it('should return false', () => {
+ expect(is_new_transaction_required({
+ status: 404,
+ data: {
+ info: 'some information',
+ },
+ })).toBe(false);
+ });
+ });
+
+ describe('when info value is "DATAGRID_TRANSACTION_REQUIRED"', () => {
+ it('should return false', () => {
+ expect(is_new_transaction_required({
+ status: 404,
+ data: {
+ info: 'DATAGRID_TRANSACTION_REQUIRED',
+ },
+ })).toBe(true);
+ });
+ });
+ });
+ });
+ });
+});
+
+
+describe('#handleQueryToolAjaxError', () => {
+ let sqlEditorHandler,
+ exceptionSpy, stateToSave,
+ stateParameters, checkTransaction, UserManagementMock,
+ pgBrowserMock;
+
+ beforeEach(() => {
+ stateToSave = 'testState';
+ stateParameters = [];
+ checkTransaction = false;
+ sqlEditorHandler = jasmine.createSpyObj(
+ 'handler', ['init_transaction', 'save_state', 'handle_connection_lost']
+ );
+ exceptionSpy = {
+ readyState: 0,
+ status: 404,
+ data: {
+ info: 'CONNECTION_LOST',
+ },
+ };
+ pgBrowserMock = {
+ 'Browser': {
+ 'UserManagement': jasmine.createSpyObj('UserManagement', ['is_pga_login_required', 'pga_login'])
+ }
+ };
+ });
+
+ describe('when ready state is 0', () => {
+ it('should return connection', () => {
+ expect(
+ handleQueryToolAjaxError(
+ pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave,
+ stateParameters, checkTransaction
+ )
+ ).toBe('Not connected to the server or the connection to the server has been closed.');
+ });
+ });
+
+ describe('when there is an ajax error due to login is required', () => {
+ beforeEach(() => {
+ exceptionSpy.readyState = 1;
+ exceptionSpy.status = 401;
+ exceptionSpy.data.info = 'PGADMIN_LOGIN_REQUIRED';
+ pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(true);
+ });
+
+ it('should save the current state and call login handler', () => {
+ handleQueryToolAjaxError(
+ pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave,
+ stateParameters, checkTransaction
+ );
+ expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters);
+ expect(pgBrowserMock.Browser.UserManagement.pga_login).toHaveBeenCalled();
+ });
+ });
+
+ describe('when there is an ajax error and new transaction initialization required', () => {
+ beforeEach(() => {
+ exceptionSpy.readyState = 1;
+ exceptionSpy.status = 404;
+ exceptionSpy.data.info = 'DATAGRID_TRANSACTION_REQUIRED';
+ pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false);
+ checkTransaction = true;
+ });
+
+ it('should save the current state and call login handler', () => {
+ handleQueryToolAjaxError(
+ pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave,
+ stateParameters, checkTransaction
+ );
+ expect(pgBrowserMock.Browser.UserManagement.pga_login).not.toHaveBeenCalled();
+ expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters);
+ expect(sqlEditorHandler.init_transaction).toHaveBeenCalled();
+ });
+ });
+
+ describe('when there is an ajax error due to database connection has been lost', () => {
+ beforeEach(() => {
+ exceptionSpy.readyState = 1;
+ exceptionSpy.status = 503;
+ exceptionSpy.responseJSON = {
+ 'info': 'CONNECTION_LOST'
+ };
+ pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false);
+ checkTransaction = false;
+ });
+
+ it('should save the current state and call connection lost handler', (done) => {
+ handleQueryToolAjaxError(
+ pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave,
+ stateParameters, checkTransaction
+ );
+ expect(pgBrowserMock.Browser.UserManagement.pga_login).not.toHaveBeenCalled();
+ setTimeout(() => {
+ expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters);
+ expect(sqlEditorHandler.handle_connection_lost).toHaveBeenCalledWith(false, exceptionSpy);
+ done();
+ }, 0);
+ });
+ });
+
+ describe('when there is an ajax error due to unknown reason', () => {
+ beforeEach(() => {
+ exceptionSpy.readyState = 1;
+ exceptionSpy.status = 803;
+ exceptionSpy.responseText = 'ajax failed with unknown reason';
+ pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false);
+ checkTransaction = false;
+ });
+
+ it('should return proper error message from ajax exception', () => {
+ expect(
+ handleQueryToolAjaxError(
+ pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave,
+ stateParameters, checkTransaction
+ )
+ ).toBe('ajax failed with unknown reason');
+ });
+ });
+
+});
view thread (6+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected]
Subject: Re: [pgAdmin4][RM#3235] Code refactoring in Query tool
In-Reply-To: <CAKKotZRwxcozrSic25xSCtK_z7bdnksrF2_4GSeWi=6zDUSw_g@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox