From f5cc1d1c7e20ba1eba0167b1feee1fb78d017346 Mon Sep 17 00:00:00 2001 From: Rahul Shirsat Date: Fri, 19 Mar 2021 11:51:45 +0530 Subject: [PATCH] Fixed cognitive complexity reported by SonarQube. --- .../databases/schemas/functions/__init__.py | 127 ++++++++++-------- .../server_groups/servers/roles/__init__.py | 87 ++++++------ 2 files changed, 111 insertions(+), 103 deletions(-) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py index cb9e5e074..c4b023eea 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py @@ -1071,6 +1071,71 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): resp_data['pronamespace'] = self._get_schema( resp_data['pronamespace']) + def _get_function_definition(self, scid, fnid, resp_data, target_schema): + + sql = render_template("/".join([self.sql_template_path, + self._GET_DEFINITION_SQL] + ), data=resp_data, + fnid=fnid, scid=scid) + + status, res = self.conn.execute_2darray(sql) + if not status: + return internal_server_error(errormsg=res) + elif target_schema: + res['rows'][0]['nspname'] = target_schema + resp_data['pronamespace'] = target_schema + + # Add newline and tab before each argument to format + name_with_default_args = self.qtIdent( + self.conn, + res['rows'][0]['nspname'], + res['rows'][0]['proname'] + ) + '(\n\t' + res['rows'][0]['func_args']. \ + replace(', ', ',\n\t') + ')' + + # Generate sql for "SQL panel" + # func_def is function signature with default arguments + # query_for - To distinguish the type of call + func_def = render_template("/".join([self.sql_template_path, + self._CREATE_SQL]), + data=resp_data, query_type="create", + func_def=name_with_default_args, + query_for="sql_panel") + + return func_def + + def _get_procedure_definition(self, scid, fnid, resp_data, target_schema): + + sql = render_template("/".join([self.sql_template_path, + self._GET_DEFINITION_SQL] + ), data=resp_data, + fnid=fnid, scid=scid) + + status, res = self.conn.execute_2darray(sql) + if not status: + return internal_server_error(errormsg=res) + elif target_schema: + res['rows'][0]['nspname'] = target_schema + + # Add newline and tab before each argument to format + name_with_default_args = self.qtIdent( + self.conn, + res['rows'][0]['nspname'], + res['rows'][0]['proname'] + ) + '(\n\t' + res['rows'][0]['func_args'].\ + replace(', ', ',\n\t') + ')' + + # Generate sql for "SQL panel" + # func_def is procedure signature with default arguments + # query_for - To distinguish the type of call + func_def = render_template("/".join([self.sql_template_path, + self._CREATE_SQL]), + data=resp_data, query_type="create", + func_def=name_with_default_args, + query_for="sql_panel") + + return func_def + @check_precondition def sql(self, gid, sid, did, scid, fnid=None, **kwargs): """ @@ -1113,6 +1178,7 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): if self.node_type == 'procedure': object_type = 'procedure' + if 'provolatile' in resp_data: resp_data['provolatile'] = vol_dict.get( resp_data['provolatile'], '' @@ -1121,36 +1187,11 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): # Get Schema Name from its OID. self._get_schema_name_from_oid(resp_data) - sql = render_template("/".join([self.sql_template_path, - self._GET_DEFINITION_SQL] - ), data=resp_data, - fnid=fnid, scid=scid) - - status, res = self.conn.execute_2darray(sql) - if not status: - return internal_server_error(errormsg=res) - elif target_schema: - res['rows'][0]['nspname'] = target_schema - - # Add newline and tab before each argument to format - name_with_default_args = self.qtIdent( - self.conn, - res['rows'][0]['nspname'], - res['rows'][0]['proname'] - ) + '(\n\t' + res['rows'][0]['func_args'].\ - replace(', ', ',\n\t') + ')' - # Parse privilege data self._parse_privilege_data(resp_data) - # Generate sql for "SQL panel" - # func_def is procedure signature with default arguments - # query_for - To distinguish the type of call - func_def = render_template("/".join([self.sql_template_path, - self._CREATE_SQL]), - data=resp_data, query_type="create", - func_def=name_with_default_args, - query_for="sql_panel") + func_def = self._get_procedure_definition(scid, fnid, resp_data, + target_schema) else: object_type = 'function' @@ -1168,34 +1209,12 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare): # Parse privilege data self._parse_privilege_data(resp_data) - sql = render_template("/".join([self.sql_template_path, - self._GET_DEFINITION_SQL] - ), data=resp_data, - fnid=fnid, scid=scid) + func_def = self._get_function_definition(scid, fnid, resp_data, + target_schema) - status, res = self.conn.execute_2darray(sql) - if not status: - return internal_server_error(errormsg=res) - elif target_schema: - res['rows'][0]['nspname'] = target_schema - resp_data['pronamespace'] = target_schema - - # Add newline and tab before each argument to format - name_with_default_args = self.qtIdent( - self.conn, - res['rows'][0]['nspname'], - res['rows'][0]['proname'] - ) + '(\n\t' + res['rows'][0]['func_args']. \ - replace(', ', ',\n\t') + ')' - - # Generate sql for "SQL panel" - # func_def is function signature with default arguments - # query_for - To distinguish the type of call - func_def = render_template("/".join([self.sql_template_path, - self._CREATE_SQL]), - data=resp_data, query_type="create", - func_def=name_with_default_args, - query_for="sql_panel") + # This is to check whether any exception occurred, if yes, then return + if not isinstance(func_def, str) and func_def.status_code is not None: + return func_def sql_header = """-- {0}: {1}.{2}({3})\n\n""".format( object_type.upper(), resp_data['pronamespace'], diff --git a/web/pgadmin/browser/server_groups/servers/roles/__init__.py b/web/pgadmin/browser/server_groups/servers/roles/__init__.py index 28fe6be2c..541d36d1c 100644 --- a/web/pgadmin/browser/server_groups/servers/roles/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/roles/__init__.py @@ -538,37 +538,19 @@ rolmembership:{ else: data[key] = val - invalid_msg = self._validate_rolname(kwargs.get('rid', -1), data) - if invalid_msg is not None: - return precondition_required(invalid_msg) + invalid_msg_arr = [ + self._validate_rolname(kwargs.get('rid', -1), data), + self._validate_rolvaliduntil(data), + self._validate_rolconnlimit(data), + self._validate_rolemembership(kwargs.get('rid', -1), data), + self._validate_seclabels(kwargs.get('rid', -1), data), + self._validate_variables(kwargs.get('rid', -1), data), + self._validate_rolemembers(kwargs.get('rid', -1), data) + ] - invalid_msg = self._validate_rolvaliduntil(data) - if invalid_msg is not None: - return precondition_required(invalid_msg) - - invalid_msg = self._validate_rolconnlimit(data) - if invalid_msg is not None: - return precondition_required(invalid_msg) - - invalid_msg = self._validate_rolemembership( - kwargs.get('rid', -1), data) - if invalid_msg is not None: - return precondition_required(invalid_msg) - - invalid_msg = self._validate_seclabels( - kwargs.get('rid', -1), data) - if invalid_msg is not None: - return precondition_required(invalid_msg) - - invalid_msg = self._validate_variables( - kwargs.get('rid', -1), data) - if invalid_msg is not None: - return precondition_required(invalid_msg) - - invalid_msg = self._validate_rolemembers( - kwargs.get('rid', -1), data) - if invalid_msg is not None: - return precondition_required(invalid_msg) + for invalid_msg in invalid_msg_arr: + if invalid_msg is not None: + return precondition_required(invalid_msg) self.request = data @@ -798,6 +780,30 @@ rolmembership:{ return gone() + def _set_seclabels(self, row): + + if 'seclabels' in row and row['seclabels'] is not None: + res = [] + for sec in row['seclabels']: + sec = re.search(r'([^=]+)=(.*$)', sec) + res.append({ + 'provider': sec.group(1), + 'label': sec.group(2) + }) + row['seclabels'] = res + + def _set_rolemembership(self, row): + + if 'rolmembers' in row: + rolmembers = [] + for role in row['rolmembers']: + role = re.search(r'([01])(.+)', role) + rolmembers.append({ + 'role': role.group(2), + 'admin': True if role.group(1) == '1' else False + }) + row['rolmembers'] = rolmembers + def transform(self, rset): for row in rset['rows']: res = [] @@ -810,25 +816,8 @@ rolmembership:{ 'admin': True if role.group(1) == '1' else False }) row['rolmembership'] = res - if 'seclabels' in row and row['seclabels'] is not None: - res = [] - for sec in row['seclabels']: - sec = re.search(r'([^=]+)=(.*$)', sec) - res.append({ - 'provider': sec.group(1), - 'label': sec.group(2) - }) - row['seclabels'] = res - - if 'rolmembers' in row: - rolmembers = [] - for role in row['rolmembers']: - role = re.search(r'([01])(.+)', role) - rolmembers.append({ - 'role': role.group(2), - 'admin': True if role.group(1) == '1' else False - }) - row['rolmembers'] = rolmembers + self._set_seclabels(row) + self._set_rolemembership(row) @check_precondition(action='properties') def properties(self, gid, sid, rid):