|
|
@ -1,5 +1,6 @@ |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# Copyright 2014-2016 OpenMarket Ltd |
|
|
|
# Copyright 2014-2016 OpenMarket Ltd |
|
|
|
|
|
|
|
# Copyright 2018 New Vector Ltd |
|
|
|
# |
|
|
|
# |
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
# you may not use this file except in compliance with the License. |
|
|
|
# you may not use this file except in compliance with the License. |
|
|
@ -13,18 +14,46 @@ |
|
|
|
# See the License for the specific language governing permissions and |
|
|
|
# See the License for the specific language governing permissions and |
|
|
|
# limitations under the License. |
|
|
|
# limitations under the License. |
|
|
|
|
|
|
|
|
|
|
|
from ._base import SQLBaseStore |
|
|
|
|
|
|
|
from twisted.internet import defer |
|
|
|
from twisted.internet import defer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from synapse.storage._base import SQLBaseStore |
|
|
|
|
|
|
|
from synapse.storage.util.id_generators import StreamIdGenerator |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from synapse.util.caches.stream_change_cache import StreamChangeCache |
|
|
|
from synapse.util.caches.descriptors import cached, cachedList, cachedInlineCallbacks |
|
|
|
from synapse.util.caches.descriptors import cached, cachedList, cachedInlineCallbacks |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import abc |
|
|
|
import ujson as json |
|
|
|
import ujson as json |
|
|
|
import logging |
|
|
|
import logging |
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AccountDataStore(SQLBaseStore): |
|
|
|
class AccountDataWorkerStore(SQLBaseStore): |
|
|
|
|
|
|
|
"""This is an abstract base class where subclasses must implement |
|
|
|
|
|
|
|
`get_max_account_data_stream_id` which can be called in the initializer. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This ABCMeta metaclass ensures that we cannot be instantiated without |
|
|
|
|
|
|
|
# the abstract methods being implemented. |
|
|
|
|
|
|
|
__metaclass__ = abc.ABCMeta |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, db_conn, hs): |
|
|
|
|
|
|
|
account_max = self.get_max_account_data_stream_id() |
|
|
|
|
|
|
|
self._account_data_stream_cache = StreamChangeCache( |
|
|
|
|
|
|
|
"AccountDataAndTagsChangeCache", account_max, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
super(AccountDataWorkerStore, self).__init__(db_conn, hs) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@abc.abstractmethod |
|
|
|
|
|
|
|
def get_max_account_data_stream_id(self): |
|
|
|
|
|
|
|
"""Get the current max stream ID for account data stream |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
raise NotImplementedError() |
|
|
|
|
|
|
|
|
|
|
|
@cached() |
|
|
|
@cached() |
|
|
|
def get_account_data_for_user(self, user_id): |
|
|
|
def get_account_data_for_user(self, user_id): |
|
|
@ -209,6 +238,36 @@ class AccountDataStore(SQLBaseStore): |
|
|
|
"get_updated_account_data_for_user", get_updated_account_data_for_user_txn |
|
|
|
"get_updated_account_data_for_user", get_updated_account_data_for_user_txn |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@cachedInlineCallbacks(num_args=2, cache_context=True, max_entries=5000) |
|
|
|
|
|
|
|
def is_ignored_by(self, ignored_user_id, ignorer_user_id, cache_context): |
|
|
|
|
|
|
|
ignored_account_data = yield self.get_global_account_data_by_type_for_user( |
|
|
|
|
|
|
|
"m.ignored_user_list", ignorer_user_id, |
|
|
|
|
|
|
|
on_invalidate=cache_context.invalidate, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
if not ignored_account_data: |
|
|
|
|
|
|
|
defer.returnValue(False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defer.returnValue( |
|
|
|
|
|
|
|
ignored_user_id in ignored_account_data.get("ignored_users", {}) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AccountDataStore(AccountDataWorkerStore): |
|
|
|
|
|
|
|
def __init__(self, db_conn, hs): |
|
|
|
|
|
|
|
self._account_data_id_gen = StreamIdGenerator( |
|
|
|
|
|
|
|
db_conn, "account_data_max_stream_id", "stream_id" |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
super(AccountDataStore, self).__init__(db_conn, hs) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_max_account_data_stream_id(self): |
|
|
|
|
|
|
|
"""Get the current max stream id for the private user data stream |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
|
|
|
A deferred int. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
return self._account_data_id_gen.get_current_token() |
|
|
|
|
|
|
|
|
|
|
|
@defer.inlineCallbacks |
|
|
|
@defer.inlineCallbacks |
|
|
|
def add_account_data_to_room(self, user_id, room_id, account_data_type, content): |
|
|
|
def add_account_data_to_room(self, user_id, room_id, account_data_type, content): |
|
|
|
"""Add some account_data to a room for a user. |
|
|
|
"""Add some account_data to a room for a user. |
|
|
@ -321,16 +380,3 @@ class AccountDataStore(SQLBaseStore): |
|
|
|
"update_account_data_max_stream_id", |
|
|
|
"update_account_data_max_stream_id", |
|
|
|
_update, |
|
|
|
_update, |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
@cachedInlineCallbacks(num_args=2, cache_context=True, max_entries=5000) |
|
|
|
|
|
|
|
def is_ignored_by(self, ignored_user_id, ignorer_user_id, cache_context): |
|
|
|
|
|
|
|
ignored_account_data = yield self.get_global_account_data_by_type_for_user( |
|
|
|
|
|
|
|
"m.ignored_user_list", ignorer_user_id, |
|
|
|
|
|
|
|
on_invalidate=cache_context.invalidate, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
if not ignored_account_data: |
|
|
|
|
|
|
|
defer.returnValue(False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defer.returnValue( |
|
|
|
|
|
|
|
ignored_user_id in ignored_account_data.get("ignored_users", {}) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|