Ensure sort/filter dialog should display proper message after losing database connection. Fixes #3561

This commit is contained in:
Aditya Toshniwal 2018-08-22 16:38:31 +05:30 committed by Akshay Joshi
parent 0f17b4f738
commit 25679fd542
6 changed files with 88 additions and 46 deletions

View File

@ -25,4 +25,5 @@ Bug fixes
| `Bug #3528 <https://redmine.postgresql.org/issues/3528>`_ - Handle connection errors properly in the query tool.
| `Bug #3547 <https://redmine.postgresql.org/issues/3547>`_ - Make session implementation thread safe
| `Bug #3558 <https://redmine.postgresql.org/issues/3558>`_ - Fix sort/filter dialog editing issue.
| `Bug #3561 <https://redmine.postgresql.org/issues/3561>`_ - Ensure sort/filter dialog should display proper message after losing database connection.
| `Bug #3578 <https://redmine.postgresql.org/issues/3578>`_ - Ensure sql for Role should be visible in SQL panel for GPDB.

View File

@ -7,17 +7,32 @@ import Backform from 'pgadmin.backform';
import axios from 'axios';
import queryToolActions from 'sources/sqleditor/query_tool_actions';
import filterDialogModel from 'sources/sqleditor/filter_dialog_model';
import {handleQueryToolAjaxError} from 'sources/sqleditor/query_tool_http_error_handler';
let FilterDialog = {
'dialog': function(handler) {
geturl: function(transId, reconnect) {
let url = url_for('sqleditor.get_filter_data', {
'trans_id': transId,
});
if(reconnect) {
url += '?connect=1';
}
return url;
},
'dialog': function(handler, reconnect) {
let title = gettext('Sort/Filter options');
axios.get(
url_for('sqleditor.get_filter_data', {
'trans_id': handler.transId,
}),
{ headers: {'Cache-Control' : 'no-cache'} }
).then(function (res) {
let response = res.data.data.result;
$.ajax({
url: this.geturl(handler.transId, reconnect),
headers: {
'Cache-Control' : 'no-cache',
},
})
.done(function (res) {
let response = res.data.result;
// Check the alertify dialog already loaded then delete it to clear
// the cache
@ -234,6 +249,9 @@ let FilterDialog = {
});
Alertify.filterDialog(title).resizeTo('65%', '60%');
})
.fail(function(e) {
handleQueryToolAjaxError(pgAdmin, handler, e, '_show_filter', [], true);
});
},
};

View File

@ -1526,7 +1526,11 @@ def get_filter_data(trans_id):
Args:
trans_id: unique transaction id
"""
return FilterDialog.get(*check_transaction_status(trans_id))
status, error_msg, conn, trans_obj, session_ob = \
check_transaction_status(trans_id)
return FilterDialog.get(status, error_msg, conn, trans_obj, session_ob)
@blueprint.route(
@ -1541,8 +1545,12 @@ def set_filter_data(trans_id):
Args:
trans_id: unique transaction id
"""
status, error_msg, conn, trans_obj, session_ob = \
check_transaction_status(trans_id)
return FilterDialog.save(
*check_transaction_status(trans_id),
status, error_msg, conn, trans_obj, session_ob,
request=request,
trans_id=trans_id
)

View File

@ -550,45 +550,40 @@ class TableCommand(GridCommand):
all_sorted_columns = []
data_sorting = self.get_data_sorting()
all_columns = []
if conn.connected():
# Fetch the primary key column names
query = render_template(
"/".join([self.sql_path, 'primary_keys.sql']),
obj_id=self.obj_id
)
# Fetch the primary key column names
query = render_template(
"/".join([self.sql_path, 'primary_keys.sql']),
obj_id=self.obj_id
status, result = conn.execute_dict(query)
if not status:
raise Exception(result)
for row in result['rows']:
all_columns.append(row['attname'])
all_sorted_columns.append(
{
'name': row['attname'],
'order': self.get_pk_order()
}
)
status, result = conn.execute_dict(query)
if not status:
raise Exception(result)
# Fetch the rest of the column names
query = render_template(
"/".join([self.sql_path, 'get_columns.sql']),
obj_id=self.obj_id
)
status, result = conn.execute_dict(query)
if not status:
raise Exception(result)
for row in result['rows']:
for row in result['rows']:
# Only append if not already present in the list
if row['attname'] not in all_columns:
all_columns.append(row['attname'])
all_sorted_columns.append(
{
'name': row['attname'],
'order': self.get_pk_order()
}
)
# Fetch the rest of the column names
query = render_template(
"/".join([self.sql_path, 'get_columns.sql']),
obj_id=self.obj_id
)
status, result = conn.execute_dict(query)
if not status:
raise Exception(result)
for row in result['rows']:
# Only append if not already present in the list
if row['attname'] not in all_columns:
all_columns.append(row['attname'])
else:
raise Exception(
gettext('Not connected to server or connection with the '
'server has been closed.')
)
# If user has custom data sorting then pass as it as it is
if data_sorting and len(data_sorting) > 0:
all_sorted_columns = data_sorting

View File

@ -3022,8 +3022,17 @@ define('tools.querytool', [
// This function will show the filter in the text area.
_show_filter: function() {
let self = this;
FilterHandler.dialog(self);
let self = this,
reconnect = false;
/* When server is disconnected and connected, connection is lost,
* To reconnect pass true
*/
if (arguments.length > 0 &&
arguments[arguments.length - 1] == 'connect') {
reconnect = true;
}
FilterHandler.dialog(self, reconnect);
},
// This function will include the filter by selection.

View File

@ -11,9 +11,11 @@
import pickle
import simplejson as json
from flask_babelex import gettext
from flask import current_app
from pgadmin.utils.ajax import make_json_response, internal_server_error
from pgadmin.tools.sqleditor.utils.update_session_grid_transaction import \
update_session_grid_transaction
from pgadmin.utils.exception import ConnectionLost, SSHTunnelConnectionLost
class FilterDialog(object):
@ -32,7 +34,16 @@ class FilterDialog(object):
if status and conn is not None and \
trans_obj is not None and session_obj is not None:
msg = gettext('Success')
columns, column_list = trans_obj.get_all_columns_with_order(conn)
try:
columns, column_list = \
trans_obj.get_all_columns_with_order(conn)
except (ConnectionLost, SSHTunnelConnectionLost):
raise
except Exception as e:
current_app.logger.error(e)
raise
sql = trans_obj.get_filter()
else:
status = False