Merge pull request #2278 from matrix-org/erikj/fix_user_dir

Fix user dir to not assume existence of user
This commit is contained in:
Erik Johnston 2017-06-13 11:38:44 +01:00 committed by GitHub
commit fe9dc522d4
1 changed files with 41 additions and 24 deletions

View File

@ -151,44 +151,61 @@ class UserDirectoryStore(SQLBaseStore):
def update_profile_in_user_dir(self, user_id, display_name, avatar_url): def update_profile_in_user_dir(self, user_id, display_name, avatar_url):
def _update_profile_in_user_dir_txn(txn): def _update_profile_in_user_dir_txn(txn):
self._simple_update_one_txn( new_entry = self._simple_upsert_txn(
txn, txn,
table="user_directory", table="user_directory",
keyvalues={"user_id": user_id}, keyvalues={"user_id": user_id},
updatevalues={"display_name": display_name, "avatar_url": avatar_url}, values={"display_name": display_name, "avatar_url": avatar_url},
lock=False, # We're only inserter
) )
if isinstance(self.database_engine, PostgresEngine): if isinstance(self.database_engine, PostgresEngine):
# We weight the loclpart most highly, then display name and finally # We weight the loclpart most highly, then display name and finally
# server name # server name
sql = """ if new_entry:
UPDATE user_directory_search sql = """
SET vector = setweight(to_tsvector('english', ?), 'A') INSERT INTO user_directory_search(user_id, vector)
|| setweight(to_tsvector('english', ?), 'D') VALUES (?,
|| setweight(to_tsvector('english', COALESCE(?, '')), 'B') setweight(to_tsvector('english', ?), 'A')
WHERE user_id = ? || setweight(to_tsvector('english', ?), 'D')
""" || setweight(to_tsvector('english', COALESCE(?, '')), 'B')
args = ( )
get_localpart_from_id(user_id), get_domain_from_id(user_id), """
display_name, txn.execute(
user_id, sql,
) (
user_id, get_localpart_from_id(user_id),
get_domain_from_id(user_id), display_name,
)
)
else:
sql = """
UPDATE user_directory_search
SET vector = setweight(to_tsvector('english', ?), 'A')
|| setweight(to_tsvector('english', ?), 'D')
|| setweight(to_tsvector('english', COALESCE(?, '')), 'B')
WHERE user_id = ?
"""
txn.execute(
sql,
(
get_localpart_from_id(user_id), get_domain_from_id(user_id),
display_name, user_id,
)
)
elif isinstance(self.database_engine, Sqlite3Engine): elif isinstance(self.database_engine, Sqlite3Engine):
sql = """ value = "%s %s" % (user_id, display_name,) if display_name else user_id
UPDATE user_directory_search self._simple_upsert_txn(
set value = ? txn,
WHERE user_id = ? table="user_directory_search",
""" keyvalues={"user_id": user_id},
args = ( values={"value": value},
"%s %s" % (user_id, display_name,) if display_name else user_id, lock=False, # We're only inserter
user_id,
) )
else: else:
# This should be unreachable. # This should be unreachable.
raise Exception("Unrecognized database engine") raise Exception("Unrecognized database engine")
txn.execute(sql, args)
txn.call_after(self.get_user_in_directory.invalidate, (user_id,)) txn.call_after(self.get_user_in_directory.invalidate, (user_id,))
return self.runInteraction( return self.runInteraction(