import os import frappe class DbManager: def __init__(self, db): """ Pass root_conn here for access to all databases. """ if db: self.db = db def get_current_host(self): return self.db.sql("select user()")[0][0].split('@')[1] def create_user(self, user, password, host=None): # Create user if it doesn't exist. if not host: host = self.get_current_host() if password: self.db.sql("CREATE USER '%s'@'%s' IDENTIFIED BY '%s';" % (user, host, password)) else: self.db.sql("CREATE USER '%s'@'%s';" % (user, host)) def delete_user(self, target, host=None): if not host: host = self.get_current_host() try: self.db.sql("DROP USER '%s'@'%s';" % (target, host)) except Exception as e: if e.args[0] == 1396: pass else: raise def create_database(self, target): if target in self.get_database_list(): self.drop_database(target) self.db.sql("CREATE DATABASE `%s` ;" % target) def drop_database(self, target): self.db.sql("DROP DATABASE IF EXISTS `%s`;" % target) def grant_all_privileges(self, target, user, host=None): if not host: host = self.get_current_host() if frappe.conf.get('rds_db', 0) == 1: self.db.sql("GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE, LOCK TABLES ON `%s`.* TO '%s'@'%s';" % (target, user, host)) else: self.db.sql("GRANT ALL PRIVILEGES ON `%s`.* TO '%s'@'%s';" % (target, user, host)) def flush_privileges(self): self.db.sql("FLUSH PRIVILEGES") def get_database_list(self): """get list of databases""" return [d[0] for d in self.db.sql("SHOW DATABASES")] @staticmethod def restore_database(target, source, user, password): from frappe.utils import make_esc esc = make_esc('$ ') from distutils.spawn import find_executable pv = find_executable('pv') if pv: pipe = '{pv} {source} |'.format( pv=pv, source=source ) source = '' else: pipe = '' source = '< {source}'.format(source=source) if pipe: print('Restoring Database file...') command = '{pipe} mysql -u {user} -p{password} -h{host} ' + ('-P{port}' if frappe.db.port else '') + ' {target} {source}' command = command.format( pipe=pipe, user=esc(user), password=esc(password), host=esc(frappe.db.host), target=esc(target), source=source, port=frappe.db.port ) os.system(command)