########################################################################## # # pgAdmin 4 - PostgreSQL Tools # # Copyright (C) 2013 - 2022, The pgAdmin Development Team # This software is released under the PostgreSQL Licence # ########################################################################## """A blueprint module implementing the maintenance tool for vacuum""" import simplejson as json from flask import url_for, Response, render_template, request, current_app from flask_babel import gettext as _ from flask_security import login_required, current_user from pgadmin.misc.bgprocess.processes import BatchProcess, IProcessDesc from pgadmin.utils import PgAdminModule, html, does_utility_exist, get_server from pgadmin.utils.ajax import bad_request, make_json_response from pgadmin.utils.driver import get_driver from config import PG_DEFAULT_DRIVER from pgadmin.model import Server, SharedServer from pgadmin.utils.constants import MIMETYPE_APP_JS MODULE_NAME = 'maintenance' class MaintenanceModule(PgAdminModule): """ class MaintenanceModule(PgAdminModule) A module class for maintenance tools of vacuum which is derived from PgAdminModule. Methods: ------- * get_own_javascripts() - Method is used to load the required javascript files for maintenance tool module * get_own_stylesheets() - Returns the list of CSS file used by Maintenance module """ LABEL = _('Maintenance') def get_own_javascripts(self): scripts = list() for name, script in [ ['pgadmin.tools.maintenance', 'js/maintenance'] ]: scripts.append({ 'name': name, 'path': url_for('maintenance.index') + script, 'when': None }) return scripts def get_own_stylesheets(self): """ Returns: list: the stylesheets used by this module. """ stylesheets = [] return stylesheets def get_exposed_url_endpoints(self): """ Returns: list: URL endpoints for backup module """ return ['maintenance.create_job', 'maintenance.utility_exists'] blueprint = MaintenanceModule(MODULE_NAME, __name__) class Message(IProcessDesc): def __init__(self, _sid, _data, _query): self.sid = _sid self.data = _data self.query = _query def get_server_name(self): s = get_server(self.sid) from pgadmin.utils.driver import get_driver driver = get_driver(PG_DEFAULT_DRIVER) manager = driver.connection_manager(self.sid) host = manager.local_bind_host if manager.use_ssh_tunnel else s.host port = manager.local_bind_port if manager.use_ssh_tunnel else s.port s.name = html.safe_str(s.name) host = html.safe_str(host) port = html.safe_str(port) return "{0} ({1}:{2})".format(s.name, host, port) def get_op(self): op = self._check_for_vacuum() if self.data['op'] == "ANALYZE": op = _('ANALYZE') if self.data['verbose']: op += '(' + _('VERBOSE') + ')' if self.data['op'] == "REINDEX": if 'schema' in self.data and self.data['schema']: if 'primary_key' in self.data or \ 'unique_constraint' in self.data or \ 'index' in self.data: return _('REINDEX INDEX') else: return _('REINDEX TABLE') op = _('REINDEX') if self.data['op'] == "CLUSTER": op = _('CLUSTER') return op @property def message(self): res = _("{0} on database '{1}' of server {2}") return res.format( self.get_op(), self.data['database'], self.get_server_name()) @property def type_desc(self): return _("Maintenance") def _check_for_vacuum(self): """ Check for VACUUM in data and return format response. :return: response. """ res = None if self.data['op'] == "VACUUM": res = _('VACUUM ({0})') opts = [] if 'vacuum_full' in self.data and self.data['vacuum_full']: opts.append(_('FULL')) if 'vacuum_freeze' in self.data and self.data['vacuum_freeze']: opts.append(_('FREEZE')) if self.data['verbose']: opts.append(_('VERBOSE')) res = res.format(', '.join(str(x) for x in opts)) return res def details(self, cmd, args): res = '