diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py index 7068a0805..28011bb46 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/casts/__init__.py @@ -206,6 +206,11 @@ class CastView(PGChildNodeView): # Set template path for the SQL scripts self.template_path = 'casts/sql/#{0}#'.format(self.manager.version) + self.datlastsysoid = \ + self.manager.db_info[kwargs['did']]['datlastsysoid'] \ + if self.manager.db_info is not None and \ + kwargs['did'] in self.manager.db_info else 0 + return f(*args, **kwargs) return wrap @@ -220,9 +225,7 @@ class CastView(PGChildNodeView): :return: """ last_system_oid = 0 if self.blueprint.show_system_objects else \ - (self.manager.db_info[did])['datlastsysoid'] \ - if self.manager.db_info is not None and \ - did in self.manager.db_info else 0 + self.datlastsysoid sql = render_template( "/".join([self.template_path, self._PROPERTIES_SQL]), datlastsysoid=last_system_oid, @@ -254,9 +257,8 @@ class CastView(PGChildNodeView): """ res = [] last_system_oid = 0 if self.blueprint.show_system_objects else \ - (self.manager.db_info[did])['datlastsysoid'] \ - if self.manager.db_info is not None and \ - did in self.manager.db_info else 0 + self.datlastsysoid + sql = render_template( "/".join([self.template_path, self._NODES_SQL]), datlastsysoid=last_system_oid, @@ -316,13 +318,10 @@ class CastView(PGChildNodeView): :param cid: cast id :return: """ - last_system_oid = (self.manager.db_info[did])['datlastsysoid'] if \ - self.manager.db_info is not None and \ - did in self.manager.db_info else 0 sql = render_template( "/".join([self.template_path, self._PROPERTIES_SQL]), cid=cid, - datlastsysoid=last_system_oid, + datlastsysoid=self.datlastsysoid, showsysobj=self.blueprint.show_system_objects ) status, res = self.conn.execute_dict(sql) @@ -380,9 +379,7 @@ class CastView(PGChildNodeView): # we need oid to to add object in tree at browser, below sql will # gives the same last_system_oid = 0 if self.blueprint.show_system_objects else \ - (self.manager.db_info[did])['datlastsysoid'] \ - if self.manager.db_info is not None and \ - did in self.manager.db_info else 0 + self.datlastsysoid sql = render_template( "/".join([self.template_path, self._PROPERTIES_SQL]), srctyp=data['srctyp'], @@ -541,9 +538,7 @@ class CastView(PGChildNodeView): """ if cid is not None: last_system_oid = 0 if self.blueprint.show_system_objects else \ - (self.manager.db_info[did])['datlastsysoid'] \ - if self.manager.db_info is not None and \ - did in self.manager.db_info else 0 + self.datlastsysoid sql = render_template( "/".join([self.template_path, self._PROPERTIES_SQL]), cid=cid, diff --git a/web/pgadmin/browser/server_groups/servers/databases/external_tables/actions/get_all_nodes.py b/web/pgadmin/browser/server_groups/servers/databases/external_tables/actions/get_all_nodes.py deleted file mode 100644 index a06bc0b3f..000000000 --- a/web/pgadmin/browser/server_groups/servers/databases/external_tables/actions/get_all_nodes.py +++ /dev/null @@ -1,4 +0,0 @@ - -class GetAllNodes: - def execute(self): - pass diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py index f4506c032..7961e25d2 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py @@ -520,19 +520,11 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): coid: Collation ID only_sql: Return only sql if True """ - if coid is None: - data = request.form if request.form else json.loads( - request.data, encoding='utf-8' - ) - else: - data = {'ids': [coid]} + data = json.loads(request.data, encoding='utf-8') if coid is None \ + else {'ids': [coid]} # Below will decide if it's simple drop or drop with cascade call - if self.cmd == 'delete': - # This is a cascade operation - cascade = True - else: - cascade = False + cascade = True if self.cmd == 'delete' else False try: for coid in data['ids']: 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 5b003ebf4..7f79e1f16 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 @@ -9,7 +9,6 @@ """Implements View and Materialized View Node""" -import copy import re from functools import wraps @@ -1709,146 +1708,162 @@ class MViewNode(ViewNode, VacuumSettings): '9.3_plus' ) - def getSQL(self, gid, sid, did, data, vid=None): + @staticmethod + def merge_to_vacuum_data(old_data, data, vacuum_key): """ - This function will generate sql from model data + Used by getSQL method to merge vacuum data """ - if vid is not None: - status, res = self._fetch_properties(did, None, vid) + if vacuum_key not in data: + return - if not status: - return res - - old_data = res - - if 'name' not in data: - data['name'] = res['name'] - if 'schema' not in data: - data['schema'] = res['schema'] - - # merge vacuum lists into one - data['vacuum_data'] = {} - data['vacuum_data']['changed'] = [] - data['vacuum_data']['reset'] = [] - - # table vacuum: separate list of changed and reset data for - if 'vacuum_table' in data and 'changed' in data['vacuum_table']: - for item in data['vacuum_table']['changed']: - if 'value' in item.keys(): - if item['value'] is None: - if old_data[item['name']] != item['value']: - data['vacuum_data']['reset'].append(item) - else: - if (old_data[item['name']] is None or - (float(old_data[item['name']]) != float( - item['value']))): - data['vacuum_data']['changed'].append(item) - - # toast autovacuum: separate list of changed and reset data - if 'vacuum_toast' in data and 'changed' in data['vacuum_toast']: - for item in data['vacuum_toast']['changed']: - if 'value' in item.keys(): - toast_key = 'toast_' + item['name'] - item['name'] = 'toast.' + item['name'] - if item['value'] is None: - if old_data[toast_key] != item['value']: - data['vacuum_data']['reset'].append(item) - else: - if (old_data[toast_key] is None or - (float(old_data[toast_key]) != float( - item['value']))): - data['vacuum_data']['changed'].append(item) - - acls = [] - try: - acls = render_template( - "/".join([self.template_path, 'sql/allowed_privs.json']) + if 'changed' not in data[vacuum_key]: + return + + for item in data[vacuum_key]['changed']: + old_data_item_key = item['name'] + if vacuum_key == 'vacuum_toast': + old_data_item_key = 'toast_' + item['name'] + item['name'] = 'toast.' + item['name'] + + if 'value' not in item.keys(): + continue + if item['value'] is None and \ + old_data[old_data_item_key] is not None: + data['vacuum_data']['reset'].append(item) + elif old_data[old_data_item_key] is None or \ + float(old_data[old_data_item_key]) != \ + float(item['value']): + data['vacuum_data']['changed'].append(item) + + def _getSQL_existing(self, did, data, vid): + """ + Used by getSQL to get SQL for existing mview. + """ + status, res = self._fetch_properties(did, None, vid) + + if not status: + return res + + old_data = res + + if 'name' not in data: + data['name'] = res['name'] + if 'schema' not in data: + data['schema'] = res['schema'] + + # merge vacuum lists into one + data['vacuum_data'] = {} + data['vacuum_data']['changed'] = [] + data['vacuum_data']['reset'] = [] + + # table vacuum: separate list of changed and reset data for + self.merge_to_vacuum_data(old_data, data, 'vacuum_table') + # table vacuum toast: separate list of changed and reset data for + self.merge_to_vacuum_data(old_data, data, 'vacuum_toast') + + acls = [] + try: + acls = render_template( + "/".join([self.template_path, 'sql/allowed_privs.json']) + ) + acls = json.loads(acls, encoding='utf-8') + except Exception as e: + current_app.logger.exception(e) + + # Privileges + for aclcol in acls: + if aclcol in data: + allowedacl = acls[aclcol] + + for key in ['added', 'changed', 'deleted']: + if key in data[aclcol]: + data[aclcol][key] = parse_priv_to_db( + data[aclcol][key], allowedacl['acl'] + ) + + try: + SQL = render_template("/".join( + [self.template_path, 'sql/update.sql']), data=data, + o_data=old_data, conn=self.conn) + except Exception as e: + current_app.logger.exception(e) + return None, internal_server_error(errormsg=str(e)) + + return SQL, old_data['name'] + + def _getSQL_new(self, data): + """ + Used by getSQL to get SQL for new mview. + """ + required_args = [ + 'name', + 'schema', + 'definition' + ] + for arg in required_args: + if arg not in data: + return None, make_json_response( + data=gettext(" -- definition incomplete"), + status=200 ) - acls = json.loads(acls, encoding='utf-8') - except Exception as e: - current_app.logger.exception(e) - # Privileges - for aclcol in acls: - if aclcol in data: - allowedacl = acls[aclcol] + # Get Schema Name from its OID. + if 'schema' in data and isinstance(data['schema'], int): + data['schema'] = self._get_schema(data['schema']) - for key in ['added', 'changed', 'deleted']: - if key in data[aclcol]: - data[aclcol][key] = parse_priv_to_db( - data[aclcol][key], allowedacl['acl'] - ) + # merge vacuum lists into one + vacuum_table = [item for item in data.get('vacuum_table', []) + if 'value' in item.keys() and + item['value'] is not None] + vacuum_toast = [ + {'name': 'toast.' + item['name'], 'value': item['value']} + for item in data.get('vacuum_toast', []) + if 'value' in item.keys() and item['value'] is not None] - try: - SQL = render_template("/".join( - [self.template_path, 'sql/update.sql']), data=data, - o_data=old_data, conn=self.conn) - except Exception as e: - current_app.logger.exception(e) - return None, internal_server_error(errormsg=str(e)) - else: - required_args = [ - 'name', - 'schema', - 'definition' - ] - for arg in required_args: - if arg not in data: - return None, make_json_response( - data=gettext(" -- definition incomplete"), - status=200 - ) + # add vacuum_toast dict to vacuum_data + data['vacuum_data'] = [] + if data.get('autovacuum_custom', False): + data['vacuum_data'] = vacuum_table - # Get Schema Name from its OID. - if 'schema' in data and isinstance(data['schema'], int): - data['schema'] = self._get_schema(data['schema']) - - # merge vacuum lists into one - vacuum_table = [item for item in data.get('vacuum_table', []) - if 'value' in item.keys() and - item['value'] is not None] - vacuum_toast = [ - {'name': 'toast.' + item['name'], 'value': item['value']} - for item in data.get('vacuum_toast', []) - if 'value' in item.keys() and item['value'] is not None] - - # add vacuum_toast dict to vacuum_data - data['vacuum_data'] = [] - if ( - 'autovacuum_custom' in data and - data['autovacuum_custom'] is True - ): - data['vacuum_data'] = vacuum_table - if ( - 'toast_autovacuum' in data and - data['toast_autovacuum'] is True - ): - data['vacuum_data'] += vacuum_toast + if data.get('toast_autovacuum', False): + data['vacuum_data'] += vacuum_toast - acls = [] - try: - acls = render_template( - "/".join([self.template_path, 'sql/allowed_privs.json']) + acls = [] + try: + acls = render_template( + "/".join([self.template_path, 'sql/allowed_privs.json']) + ) + acls = json.loads(acls, encoding='utf-8') + except Exception as e: + current_app.logger.exception(e) + + # Privileges + for aclcol in acls: + if aclcol in data: + allowedacl = acls[aclcol] + data[aclcol] = parse_priv_to_db( + data[aclcol], allowedacl['acl'] ) - acls = json.loads(acls, encoding='utf-8') - except Exception as e: - current_app.logger.exception(e) - # Privileges - for aclcol in acls: - if aclcol in data: - allowedacl = acls[aclcol] - data[aclcol] = parse_priv_to_db( - data[aclcol], allowedacl['acl'] - ) + SQL = render_template("/".join( + [self.template_path, 'sql/create.sql']), data=data) + if data['definition']: + SQL += "\n" + SQL += render_template("/".join( + [self.template_path, 'sql/grant.sql']), data=data) - SQL = render_template("/".join( - [self.template_path, 'sql/create.sql']), data=data) - if data['definition']: - SQL += "\n" - SQL += render_template("/".join( - [self.template_path, 'sql/grant.sql']), data=data) - return SQL, data['name'] if 'name' in data else old_data['name'] + return SQL, data.get('name', None) + + def getSQL(self, gid, sid, did, data, vid=None): + """ + This function will generate sql from model data + """ + if vid is not None: + SQL, old_data_name = self._getSQL_existing(did, data, vid) + else: + SQL, data_name = self._getSQL_new(data) + + return SQL, old_data_name if data_name is None else data_name @check_precondition def sql(self, gid, sid, did, scid, vid, **kwargs):