def wrap(f):
     def new_function(*args, **kw):
         lock.acquire()
         try:
             return f(*args, **kw)
         finally:
             lock.release()
     compat.set_func_name(new_function, compat.get_func_name(f))
     return new_function
Exemplo n.º 2
0
    def wrap(f):
        def new_function(*args, **kw):
            lock.acquire()
            try:
                return f(*args, **kw)
            finally:
                lock.release()

        compat.set_func_name(new_function, compat.get_func_name(f))
        return new_function
 def __get__(self, item, item_class):
     wrapper = self.get_wrapper()
     compat.set_func_name(wrapper, self.func_name)
     compat.set_func_doc(wrapper, compat.get_func_doc(self.func))
     try:
         # python 2.6
         wrapper.func_dict['cnd'] = self.conditions
     except AttributeError:
         # python 3
         wrapper.__dict__['cnd'] = self.conditions
     return types.MethodType(wrapper, item)  # , item_class)
Exemplo n.º 4
0
 def __get__(self, item, item_class):
     wrapper = self.get_wrapper()
     compat.set_func_name(wrapper, self.func_name)
     compat.set_func_doc(wrapper, compat.get_func_doc(self.func))
     try:
         # python 2.6
         wrapper.func_dict['cnd'] = self.conditions
     except AttributeError:
         # python 3
         wrapper.__dict__['cnd'] = self.conditions
     return types.MethodType(wrapper, item)  # , item_class)
def deprecated(function, member=None):
    """
    Wrapper for deprecated API calls
    """
    def dep_wrapper(*args, **kwargs):
        from porcupine.core.runtime import logger
        upper_stack = traceback.extract_stack()[-2]
        pfile, line_no, where, line = upper_stack
        logger.warning(
            "DEPRECATION WARNING\n" +
            "File \"%s\".\n" % pfile +
            "Line %d:\n    %s\nin \"%s\". " % (line_no, line, where) +
            "Use \"%s\" instead." % (member or compat.get_func_name(function)))
        return function(*args, **kwargs)
    compat.set_func_name(dep_wrapper, compat.get_func_name(function))
    return dep_wrapper
Exemplo n.º 6
0
def deprecated(function, member=None):
    """
    Wrapper for deprecated API calls
    """
    def dep_wrapper(*args, **kwargs):
        from porcupine.core.runtime import logger
        upper_stack = traceback.extract_stack()[-2]
        pfile, line_no, where, line = upper_stack
        logger.warning("DEPRECATION WARNING\n" + "File \"%s\".\n" % pfile +
                       "Line %d:\n    %s\nin \"%s\". " %
                       (line_no, line, where) + "Use \"%s\" instead." %
                       (member or compat.get_func_name(function)))
        return function(*args, **kwargs)

    compat.set_func_name(dep_wrapper, compat.get_func_name(function))
    return dep_wrapper
Exemplo n.º 7
0
def requires_transactional_context(function):
    """
    Use this descriptor to ensure that a function or method is
    run in a transactional context. Required for functions/methods that perform
    database updates.
    """
    def rtc_wrapper(*args, **kwargs):
        if not context._is_txnal:
            raise exceptions.InternalServerError(
                "Not in a transactional context. Use @db.transactional().")
        return function(*args, **kwargs)

    compat.set_func_name(rtc_wrapper, compat.get_func_name(function))
    compat.set_func_doc(rtc_wrapper, compat.get_func_doc(function))
    rtc_wrapper.__module__ = function.__module__
    return rtc_wrapper
 def __get__(self, item, item_class):
     def wm_wrapper(item, context):
         if utils.permsresolver.get_access(item, context.user) == 0:
             raise exceptions.PermissionDenied
         context.response.content_type = self.content_type
         context.response.charset = self.encoding
         if self.max_age is not None:
             context.response.set_expiration(self.max_age)
         return self.execute(item, context)
     compat.set_func_name(wm_wrapper, self.func_name)
     compat.set_func_doc(wm_wrapper, compat.get_func_doc(self.func))
     try:
         # python 2.6
         wm_wrapper.func_dict['cnd'] = self.conditions
     except AttributeError:
         # python 3
         wm_wrapper.__dict__['cnd'] = self.conditions
     return types.MethodType(wm_wrapper, item)  # , item_class)
Exemplo n.º 9
0
    def __get__(self, item, item_class):
        def wm_wrapper(item, context):
            if utils.permsresolver.get_access(item, context.user) == 0:
                raise exceptions.PermissionDenied
            context.response.content_type = self.content_type
            context.response.charset = self.encoding
            if self.max_age is not None:
                context.response.set_expiration(self.max_age)
            return self.execute(item, context)

        compat.set_func_name(wm_wrapper, self.func_name)
        compat.set_func_doc(wm_wrapper, compat.get_func_doc(self.func))
        try:
            # python 2.6
            wm_wrapper.func_dict['cnd'] = self.conditions
        except AttributeError:
            # python 3
            wm_wrapper.__dict__['cnd'] = self.conditions
        return types.MethodType(wm_wrapper, item)  # , item_class)
Exemplo n.º 10
0
    def transactional_decorator(function):
        """
        This is the descriptor for making a function or a Web method
        transactional.
        """
        def transactional_wrapper(*args):
            # check if running in a replicated site and is master
            rep_mgr = _db.get_replication_manager()
            if rep_mgr is not None and not rep_mgr.is_master():
                # TODO: abort txn in chained calls?
                raise exceptions.DBReadOnly(
                    'Attempted write operation in read-only database.')

            has_txn = False
            txn_flags = 0
            if not context._is_txnal:
                if context._trans is not None:
                    # abort previous txn
                    context._trans.abort()
                    has_txn = True
                    txn_flags = context._trans._flags

                # create new txn handle
                txn = _db.get_transaction(nosync=nosync)
                context._trans = txn
                is_top_level = True
                context._is_txnal = True
            else:
                txn = context._trans
                is_top_level = False

            retries = 0
            sleep_time = _min_sleep_time

            try:
                while retries < txn.txn_max_retries:
                    try:
                        if is_top_level:
                            cargs = copy.deepcopy(args, {'_dup_ext_': False})
                            if retries > 0:
                                time.sleep(sleep_time)
                                sleep_time *= 2
                                if sleep_time > _max_sleep_time:
                                    sleep_time = _max_sleep_time + \
                                                 (retries * _min_sleep_time)
                                txn._retry()
                        else:
                            cargs = args

                        val = function(*cargs)
                        if is_top_level and auto_commit:
                            txn.commit()
                        return val

                    except exceptions.DBRetryTransaction:
                        if is_top_level:
                            retries += 1
                        else:
                            # allow propagation
                            raise

                    except:
                        txn.abort()
                        raise

                # maximum retries exceeded
                raise exceptions.DBDeadlockError

            finally:
                if is_top_level:
                    if has_txn:
                        context._trans = _db.get_transaction(flags=txn_flags)
                    else:
                        context._trans = None
                    context._is_txnal = False

        compat.set_func_name(transactional_wrapper,
                             compat.get_func_name(function))
        compat.set_func_doc(transactional_wrapper,
                            compat.get_func_doc(function))
        transactional_wrapper.__module__ = function.__module__
        return transactional_wrapper