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:
commit
fe9dc522d4
|
@ -151,16 +151,34 @@ 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
|
||||||
|
if new_entry:
|
||||||
|
sql = """
|
||||||
|
INSERT INTO user_directory_search(user_id, vector)
|
||||||
|
VALUES (?,
|
||||||
|
setweight(to_tsvector('english', ?), 'A')
|
||||||
|
|| setweight(to_tsvector('english', ?), 'D')
|
||||||
|
|| setweight(to_tsvector('english', COALESCE(?, '')), 'B')
|
||||||
|
)
|
||||||
|
"""
|
||||||
|
txn.execute(
|
||||||
|
sql,
|
||||||
|
(
|
||||||
|
user_id, get_localpart_from_id(user_id),
|
||||||
|
get_domain_from_id(user_id), display_name,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
sql = """
|
sql = """
|
||||||
UPDATE user_directory_search
|
UPDATE user_directory_search
|
||||||
SET vector = setweight(to_tsvector('english', ?), 'A')
|
SET vector = setweight(to_tsvector('english', ?), 'A')
|
||||||
|
@ -168,27 +186,26 @@ class UserDirectoryStore(SQLBaseStore):
|
||||||
|| setweight(to_tsvector('english', COALESCE(?, '')), 'B')
|
|| setweight(to_tsvector('english', COALESCE(?, '')), 'B')
|
||||||
WHERE user_id = ?
|
WHERE user_id = ?
|
||||||
"""
|
"""
|
||||||
args = (
|
txn.execute(
|
||||||
|
sql,
|
||||||
|
(
|
||||||
get_localpart_from_id(user_id), get_domain_from_id(user_id),
|
get_localpart_from_id(user_id), get_domain_from_id(user_id),
|
||||||
display_name,
|
display_name, user_id,
|
||||||
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(
|
||||||
|
|
Loading…
Reference in New Issue