Changeset View
Changeset View
Standalone View
Standalone View
swh/core/db/common.py
# Copyright (C) 2015-2019 The Software Heritage developers | # Copyright (C) 2015-2019 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import inspect | import inspect | ||||
import functools | import functools | ||||
def remove_kwargs(names): | |||||
ardumont: docstring | |||||
def decorator(f): | |||||
sig = inspect.signature(f) | |||||
params = sig.parameters | |||||
params = [param for param in params.values() | |||||
if param.name not in names] | |||||
sig = sig.replace(parameters=params) | |||||
f.__signature__ = sig | |||||
return f | |||||
return decorator | |||||
def apply_options(cursor, options): | def apply_options(cursor, options): | ||||
"""Applies the given postgresql client options to the given cursor. | """Applies the given postgresql client options to the given cursor. | ||||
Returns a dictionary with the old values if they changed.""" | Returns a dictionary with the old values if they changed.""" | ||||
old_options = {} | old_options = {} | ||||
for option, value in options.items(): | for option, value in options.items(): | ||||
cursor.execute('SHOW %s' % option) | cursor.execute('SHOW %s' % option) | ||||
old_value = cursor.fetchall()[0][0] | old_value = cursor.fetchall()[0][0] | ||||
Show All 10 Lines | def db_transaction(**client_options): | ||||
Client options are passed as `set` options to the postgresql server | Client options are passed as `set` options to the postgresql server | ||||
""" | """ | ||||
def decorator(meth, __client_options=client_options): | def decorator(meth, __client_options=client_options): | ||||
if inspect.isgeneratorfunction(meth): | if inspect.isgeneratorfunction(meth): | ||||
raise ValueError( | raise ValueError( | ||||
'Use db_transaction_generator for generator functions.') | 'Use db_transaction_generator for generator functions.') | ||||
@functools.wraps(meth) | @remove_kwargs(['cur', 'db']) | ||||
@functools.wraps(meth, assigned=['cur', 'db']) | |||||
def _meth(self, *args, **kwargs): | def _meth(self, *args, **kwargs): | ||||
if 'cur' in kwargs and kwargs['cur']: | if 'cur' in kwargs and kwargs['cur']: | ||||
cur = kwargs['cur'] | cur = kwargs['cur'] | ||||
old_options = apply_options(cur, __client_options) | old_options = apply_options(cur, __client_options) | ||||
ret = meth(self, *args, **kwargs) | ret = meth(self, *args, **kwargs) | ||||
apply_options(cur, old_options) | apply_options(cur, old_options) | ||||
return ret | return ret | ||||
else: | else: | ||||
Show All 17 Lines | def db_transaction_generator(**client_options): | ||||
Client options are passed as `set` options to the postgresql server | Client options are passed as `set` options to the postgresql server | ||||
""" | """ | ||||
def decorator(meth, __client_options=client_options): | def decorator(meth, __client_options=client_options): | ||||
if not inspect.isgeneratorfunction(meth): | if not inspect.isgeneratorfunction(meth): | ||||
raise ValueError( | raise ValueError( | ||||
'Use db_transaction for non-generator functions.') | 'Use db_transaction for non-generator functions.') | ||||
@remove_kwargs(['cur', 'db']) | |||||
@functools.wraps(meth) | @functools.wraps(meth) | ||||
def _meth(self, *args, **kwargs): | def _meth(self, *args, **kwargs): | ||||
if 'cur' in kwargs and kwargs['cur']: | if 'cur' in kwargs and kwargs['cur']: | ||||
cur = kwargs['cur'] | cur = kwargs['cur'] | ||||
old_options = apply_options(cur, __client_options) | old_options = apply_options(cur, __client_options) | ||||
yield from meth(self, *args, **kwargs) | yield from meth(self, *args, **kwargs) | ||||
apply_options(cur, old_options) | apply_options(cur, old_options) | ||||
else: | else: | ||||
Show All 10 Lines |
docstring