diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py index aedc83e86..26df9aa97 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py @@ -21,7 +21,8 @@ import pgadmin.browser.server_groups.servers as servers from config import PG_DEFAULT_DRIVER from pgadmin.browser.collection import CollectionNodeModule from pgadmin.browser.server_groups.servers.databases.utils import \ - parse_sec_labels_from_db, parse_variables_from_db + parse_sec_labels_from_db, parse_variables_from_db, \ + get_pg_db_properties from pgadmin.browser.server_groups.servers.utils import parse_priv_from_db, \ parse_priv_to_db from pgadmin.browser.utils import PGChildNodeView @@ -191,16 +192,16 @@ class DatabaseView(PGChildNodeView): # If connection to database is not allowed then # provide generic connection if kwargs['did'] in self.manager.db_info: + + self.datlastsysoid, self.datistemplate = \ + get_pg_db_properties(self.manager, kwargs) + self._db = self.manager.db_info[kwargs['did']] - self.datlastsysoid = self._db['datlastsysoid'] + if self._db['datallowconn'] is False: self.conn = self.manager.connection() self.db_allow_connection = False - self.datistemplate = \ - self.manager.db_info[kwargs['did']][ - 'datistemplate'] if 'datistemplate' in \ - self.manager.db_info[kwargs['did']] else False else: self.conn = self.manager.connection() diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py index 11d3a3db5..e25cfcdfa 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py @@ -237,83 +237,30 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, @wraps(f) def wrap(self, **kwargs): - data = {} - if request.data: req = json.loads(request.data, encoding='utf-8') else: req = request.args or request.form - if 'foid' not in kwargs: - required_args = [ - 'name', - 'ftsrvname' - ] - - for arg in required_args: - if arg not in req or req[arg] == '': - return make_json_response( - status=410, - success=0, - errormsg=gettext( - "Could not find the required parameter ({})." - ).format(arg) - ) + invalid, arg = self._check_valid_foid_input(kwargs, req) + + if invalid: + return make_json_response( + status=410, + success=0, + errormsg=gettext( + "Could not find the required parameter ({})." + ).format(arg) + ) try: - list_params = [] if request.method == 'GET': list_params = ['constraints', 'columns', 'ftoptions', 'seclabels', 'inherits', 'acl'] else: list_params = ['inherits'] - for key in req: - if ( - key in list_params and req[key] != '' and - req[key] is not None - ): - # Coverts string into python list as expected. - data[key] = [] - if not isinstance(req[key], list) and req[key]: - data[key] = json.loads(req[key], encoding='utf-8') - - if key == 'inherits': - # Convert Table ids from unicode/string to int - # and make tuple for 'IN' query. - inherits = tuple([int(x) for x in data[key]]) - - if len(inherits) == 1: - # Python tupple has , after the first param - # in case of single parameter. - # So, we need to make it tuple explicitly. - inherits = "(" + str(inherits[0]) + ")" - if inherits: - # Fetch Table Names from their respective Ids, - # as we need Table names to generate the SQL. - SQL = render_template( - "/".join([self.template_path, - self._GET_TABLES_SQL]), - attrelid=inherits) - status, res = self.conn.execute_dict(SQL) - - if not status: - return internal_server_error(errormsg=res) - - if 'inherits' in res['rows'][0]: - data[key] = res['rows'][0]['inherits'] - else: - data[key] = [] - - elif key == 'typnotnull': - if req[key] == 'true' or req[key] is True: - data[key] = True - elif req[key] == 'false' or req[key] is False: - data[key] = False - else: - data[key] = '' - else: - data[key] = req[key] + data = self._validate_req(req, list_params) except Exception as e: return internal_server_error(errormsg=str(e)) @@ -323,6 +270,82 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, return wrap + @staticmethod + def _check_valid_foid_input(kwargs, req): + + if 'foid' not in kwargs: + required_args = [ + 'name', + 'ftsrvname' + ] + + for arg in required_args: + if arg not in req or req[arg] == '': + return True, arg + return False, '' + + def _validate_req(self, req, list_params): + + data = {} + + try: + for key in req: + if ( + key in list_params and req[key] != '' and + req[key] is not None + ): + # Coverts string into python list as expected. + data[key] = [] + self._convert_string_to_list_for_inherits(req, data, key) + + elif key == 'typnotnull': + if req[key] == 'true' or req[key] is True: + data[key] = True + elif req[key] == 'false' or req[key] is False: + data[key] = False + else: + data[key] = '' + else: + data[key] = req[key] + + except Exception as e: + current_app.logger.exception(e) + raise e + + return data + + def _convert_string_to_list_for_inherits(self, req, data, key): + + if not isinstance(req[key], list) and req[key]: + data[key] = json.loads(req[key], encoding='utf-8') + + if key == 'inherits': + # Convert Table ids from unicode/string to int + # and make tuple for 'IN' query. + inherits = tuple([int(x) for x in data[key]]) + + if len(inherits) == 1: + # Python tupple has , after the first param + # in case of single parameter. + # So, we need to make it tuple explicitly. + inherits = "(" + str(inherits[0]) + ")" + if inherits: + # Fetch Table Names from their respective Ids, + # as we need Table names to generate the SQL. + SQL = render_template( + "/".join([self.template_path, + self._GET_TABLES_SQL]), + attrelid=inherits) + status, res = self.conn.execute_dict(SQL) + + if not status: + return internal_server_error(errormsg=res) + + if 'inherits' in res['rows'][0]: + data[key] = res['rows'][0]['inherits'] + else: + data[key] = [] + def check_precondition(f): """ Works as a decorator. @@ -344,14 +367,10 @@ class ForeignTableView(PGChildNodeView, DataTypeReader, if self.manager.db_info is not None and \ kwargs['did'] in self.manager.db_info else 0 - self.datistemplate = False - if ( - self.manager.db_info is not None and - kwargs['did'] in self.manager.db_info and - 'datistemplate' in self.manager.db_info[kwargs['did']] - ): - self.datistemplate = self.manager.db_info[ - kwargs['did']]['datistemplate'] + self.datistemplate = \ + self.manager.db_info[kwargs['did']]['datistemplate'] \ + if self.manager.db_info is not None and \ + kwargs['did'] in self.manager.db_info else False # Set template path for sql scripts depending # on the server version. diff --git a/web/pgadmin/browser/server_groups/servers/databases/utils.py b/web/pgadmin/browser/server_groups/servers/databases/utils.py index 2eb12b265..5dfae4b2c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/utils.py @@ -105,3 +105,17 @@ def _check_var_type(var_value, var_name, row): var_dict['database'] = row['db_name'] return var_dict + + +def get_pg_db_properties(manager, kwargs): + + if 'did' in kwargs and kwargs['did'] in manager.db_info: + + datlastsysoid = manager.db_info[kwargs['did']]['datlastsysoid'] \ + if 'datlastsysoid' in manager.db_info[kwargs['did']] else 0 + datistemplate = manager.db_info[kwargs['did']]['datistemplate'] \ + if 'datistemplate' in manager.db_info[kwargs['did']] else False + + return datlastsysoid, datistemplate + else: + return 0, False