diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py index b25c9a8384e..ccb27a1e908 100644 --- a/openerp/service/web_services.py +++ b/openerp/service/web_services.py @@ -97,6 +97,24 @@ def _initialize_db(serv, id, db_name, demo, lang, user_password): if cr: cr.close() +def _drop_conn(cr, db_name): + # Try to terminate all other connections that might prevent + # dropping the database + try: + + # PostgreSQL 9.2 renamed pg_stat_activity.procpid to pid: + # http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN110389 + pid_col = 'pid' if cr._cnx.server_version >= 90200 else 'procpid' + + cr.execute("""SELECT pg_terminate_backend(%(pid_col)s) + FROM pg_stat_activity + WHERE datname = %%s AND + %(pid_col)s != pg_backend_pid()""" % { + 'pid_col': pid_col}, + (db_name,)) + except Exception: + pass + class db(netsvc.ExportService): def __init__(self, name="db"): netsvc.ExportService.__init__(self, name) @@ -175,18 +193,7 @@ class db(netsvc.ExportService): cr = db.cursor() try: cr.autocommit(True) # avoid transaction block - def _close_connections(cr): - # patch issue gh:odoo/odoo/4424 bug lp:1180000 - cr.execute('SELECT VERSION()') - version = cr.fetchone()[0].split(' ')[1] - if version > '9.2': - cr.execute("""SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '%s'; """ % db_original_name) - _logger.debug('CLOSE DATABASE CONNECTIONS %s in 9.2', db_original_name) - else: - cr.execute("""SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE pg_stat_activity.datname = '%s'; """ % db_original_name) - _logger.debug('CLOSE DATABASE CONNECTIONS %s in 9.1', db_original_name) - return - _close_connections(cr) + _drop_conn(cr, db_original_name) cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (db_name, db_original_name)) finally: cr.close() @@ -215,23 +222,9 @@ class db(netsvc.ExportService): db = sql_db.db_connect('postgres') cr = db.cursor() - cr.autocommit(True) # avoid transaction block try: - # Try to terminate all other connections that might prevent - # dropping the database - try: - - # PostgreSQL 9.2 renamed pg_stat_activity.procpid to pid: - # http://www.postgresql.org/docs/9.2/static/release-9-2.html#AEN110389 - pid_col = 'pid' if cr._cnx.server_version >= 90200 else 'procpid' - - cr.execute("""SELECT pg_terminate_backend(%(pid_col)s) - FROM pg_stat_activity - WHERE datname = %%s AND - %(pid_col)s != pg_backend_pid()""" % {'pid_col': pid_col}, - (db_name,)) - except Exception: - pass + cr.autocommit(True) # avoid transaction block + _drop_conn(cr, db_name) try: cr.execute('DROP DATABASE "%s"' % db_name) @@ -341,8 +334,9 @@ class db(netsvc.ExportService): db = sql_db.db_connect('postgres') cr = db.cursor() - cr.autocommit(True) # avoid transaction block try: + cr.autocommit(True) # avoid transaction block + _drop_conn(cr, old_name) try: cr.execute('ALTER DATABASE "%s" RENAME TO "%s"' % (old_name, new_name)) except Exception, e: