def __init__(self):
        def cache_filler():
            alldicts = {}
            try:
                res = run_sql(
                    "SELECT object_name,object_value FROM rnkCITATIONDATA")
            except OperationalError:
                # database problems, return empty cache
                return {}
            for row in res:
                object_name = row[0]
                object_value = row[1]
                try:
                    object_value_dict = deserialize_via_marshal(object_value)
                except:
                    object_value_dict = {}
                alldicts[object_name] = object_value_dict
                if object_name == 'citationdict':
                    # for cited:M->N queries, it is interesting to cache also
                    # some preprocessed citationdict:
                    alldicts['citationdict_keys'] = object_value_dict.keys()
                    alldicts['citationdict_keys_intbitset'] = intbitset(
                        object_value_dict.keys())
            return alldicts

        def timestamp_verifier():
            res = run_sql(
                """SELECT DATE_FORMAT(last_updated, '%Y-%m-%d %H:%i:%s')
                              FROM rnkMETHOD WHERE name='citation'""")
            if res:
                return res[0][0]
            else:
                return '0000-00-00 00:00:00'

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def __init__(self):
        def cache_filler():
            alldicts = {}
            try:
                res = run_sql("SELECT object_name,object_value FROM rnkCITATIONDATA")
            except OperationalError:
                # database problems, return empty cache
                return {}
            for row in res:
                object_name = row[0]
                object_value = row[1]
                try:
                    object_value_dict = deserialize_via_marshal(object_value)
                except:
                    object_value_dict = {}
                alldicts[object_name] = object_value_dict
                if object_name == 'citationdict':
                    # for cited:M->N queries, it is interesting to cache also
                    # some preprocessed citationdict:
                    alldicts['citationdict_keys'] = object_value_dict.keys()
                    alldicts['citationdict_keys_intbitset'] = intbitset(object_value_dict.keys())
            return alldicts
        def timestamp_verifier():
            res = run_sql("""SELECT DATE_FORMAT(last_updated, '%Y-%m-%d %H:%i:%s')
                              FROM rnkMETHOD WHERE name='citation'""")
            if res:
                return res[0][0]
            else:
                return '0000-00-00 00:00:00'

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def __init__(self):
        def cache_filler():
            alldicts = {}
            try:
                res = run_sql("""SELECT object_name,object_value FROM rnkCITATIONDATA""")
            except OperationalError:
                # database problems, return empty cache
                return {}
            for row in res:
                object_name = row[0]
                object_value = row[1]
                try:
                    object_value_dict = marshal.loads(decompress(object_value))
                except:
                    object_value_dict = {}
                alldicts[object_name] = object_value_dict
                if object_name == "citationdict":
                    # for cited:M->N queries, it is interesting to cache also
                    # some preprocessed citationdict:
                    alldicts["citationdict_keys"] = object_value_dict.keys()
                    alldicts["citationdict_keys_intbitset"] = intbitset(object_value_dict.keys())
            return alldicts

        def timestamp_verifier():
            return get_table_update_time("rnkCITATIONDATA")

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def __init__(self):
        @gcfix
        def fill():
            alldicts = {}
            from invenio.bibrank_tag_based_indexer import fromDB
            redis = get_redis()
            serialized_weights = redis.get('citations_weights')
            if serialized_weights:
                weights = deserialize_via_marshal(serialized_weights)
            else:
                weights = fromDB('citation')

            alldicts['citations_weights'] = weights
            # for cited:M->N queries, it is interesting to cache also
            # some preprocessed citationdict:
            alldicts['citations_keys'] = intbitset(weights.keys())

            # Citation counts
            alldicts['citations_counts'] = [t for t in weights.iteritems()]
            alldicts['citations_counts'].sort(key=itemgetter(1), reverse=True)

            # Self-cites
            serialized_weights = redis.get('selfcites_weights')
            if serialized_weights:
                selfcites = deserialize_via_marshal(serialized_weights)
            else:
                selfcites = fromDB('selfcites')
            selfcites_weights = {}
            for recid, counts in alldicts['citations_counts']:
                selfcites_weights[recid] = counts - selfcites.get(recid, 0)
            alldicts['selfcites_weights'] = selfcites_weights
            alldicts['selfcites_counts'] = [
                (recid, selfcites_weights.get(recid, cites))
                for recid, cites in alldicts['citations_counts']
            ]
            alldicts['selfcites_counts'].sort(key=itemgetter(1), reverse=True)

            return alldicts

        def cache_filler():
            self.cache = None  # misfire from pylint: disable=W0201
            # this is really defined in DataCacher
            return fill()

        from invenio.bibrank_tag_based_indexer import get_lastupdated

        def timestamp_verifier():
            citation_lastupdate = get_lastupdated('citation')
            if citation_lastupdate:
                return citation_lastupdate.strftime("%Y-%m-%d %H:%M:%S")
            else:
                return "0000-00-00 00:00:00"

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def __init__(self):

        def fill():
            alldicts = {}
            from invenio.bibrank_tag_based_indexer import fromDB
            redis = get_redis()
            serialized_weights = redis.get('citations_weights')
            if serialized_weights:
                weights = deserialize_via_marshal(serialized_weights)
            else:
                weights = fromDB('citation')

            alldicts['citations_weights'] = weights
            # for cited:M->N queries, it is interesting to cache also
            # some preprocessed citationdict:
            alldicts['citations_keys'] = intbitset(weights.keys())

            # Citation counts
            alldicts['citations_counts'] = [t for t in weights.iteritems()]
            alldicts['citations_counts'].sort(key=itemgetter(1), reverse=True)

            # Self-cites
            serialized_weights = redis.get('selfcites_weights')
            if serialized_weights:
                selfcites = deserialize_via_marshal(serialized_weights)
            else:
                selfcites = fromDB('selfcites')
            selfcites_weights = {}
            for recid, counts in alldicts['citations_counts']:
                selfcites_weights[recid] = counts - selfcites.get(recid, 0)
            alldicts['selfcites_weights'] = selfcites_weights
            alldicts['selfcites_counts'] = [(recid, selfcites_weights.get(recid, cites)) for recid, cites in alldicts['citations_counts']]
            alldicts['selfcites_counts'].sort(key=itemgetter(1), reverse=True)

            return alldicts

        def cache_filler():
            self.cache = None  # misfire from pylint: disable=W0201
                               # this is really defined in DataCacher
            return fill()

        from invenio.bibrank_tag_based_indexer import get_lastupdated

        def timestamp_verifier():
            citation_lastupdate = get_lastupdated('citation')
            if citation_lastupdate:
                return citation_lastupdate.strftime("%Y-%m-%d %H:%M:%S")
            else:
                return "0000-00-00 00:00:00"

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def __init__(self):
        def initial_fill():
            alldicts = {}
            from invenio.bibrank_tag_based_indexer import fromDB
            weights = fromDB('citation')

            alldicts['citations_weights'] = weights
            # for cited:M->N queries, it is interesting to cache also
            # some preprocessed citationdict:
            alldicts['citations_keys'] = intbitset(weights.keys())

            # Citation counts
            alldicts['citations_counts'] = [t for t in weights.iteritems()]
            alldicts['citations_counts'].sort(key=itemgetter(1), reverse=True)

            # Self-cites
            selfcites = fromDB('selfcites')
            selfcites_weights = {}
            for recid, counts in alldicts['citations_counts']:
                selfcites_weights[recid] = counts - selfcites.get(recid, 0)
            alldicts['selfcites_weights'] = selfcites_weights
            alldicts['selfcites_counts'] = [(recid, selfcites_weights.get(recid, cites)) for recid, cites in alldicts['citations_counts']]
            alldicts['selfcites_counts'].sort(key=itemgetter(1), reverse=True)

            return alldicts

        def incremental_fill():
            self.cache = None
            return initial_fill()

        def cache_filler():
            if self.cache:
                cache = incremental_fill()
            else:
                cache = initial_fill()
            return cache

        from invenio.bibrank_tag_based_indexer import get_lastupdated

        def timestamp_verifier():
            citation_lastupdate = get_lastupdated('citation')
            if citation_lastupdate:
                return citation_lastupdate.strftime("%Y-%m-%d %H:%M:%S")
            else:
                return "0000-00-00 00:00:00"

        DataCacher.__init__(self, cache_filler, timestamp_verifier)
    def get_data_cache(self, recreate_cache_if_needed=True):
        """
        Return always up-to-date data from cache. The returned value
        depends on the what has been stored with L{prepare_data_cache}.

        @param recreate_cache_if_needed: if True, force refreshing data cache.
        """
        try:
            self.__class__.cache.is_ok_p
        except Exception:
            self.__class__.cache = DataCacher(self.prepare_data_cache,
                                              self.timestamp_verifier)
        if recreate_cache_if_needed:
            self.__class__.cache.recreate_cache_if_needed()

        return self.__class__.cache.cache