diff --git a/synapse/storage/presence.py b/synapse/storage/presence.py
index 34ca3b9a54..ef525f34c5 100644
--- a/synapse/storage/presence.py
+++ b/synapse/storage/presence.py
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
-# Copyright 2014, 2015 OpenMarket Ltd
+# Copyright 2014-2016 OpenMarket Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -48,27 +48,29 @@ class PresenceStore(SQLBaseStore):
desc="get_presence_state",
)
- @cachedList(get_presence_state.cache, list_name="user_localparts")
+ @cachedList(get_presence_state.cache, list_name="user_localparts",
+ inlineCallbacks=True)
def get_presence_states(self, user_localparts):
- def f(txn):
- results = {}
- for user_localpart in user_localparts:
- res = self._simple_select_one_txn(
- txn,
- table="presence",
- keyvalues={"user_id": user_localpart},
- retcols=["state", "status_msg", "mtime"],
- allow_none=True,
- )
- if res:
- results[user_localpart] = res
-
- return results
-
- return self.runInteraction("get_presence_states", f)
+ rows = yield self._simple_select_many_batch(
+ table="presence",
+ column="user_id",
+ iterable=user_localparts,
+ retcols=("user_id", "state", "status_msg", "mtime",),
+ desc="get_presence_states",
+ )
+
+ defer.returnValue({
+ row["user_id"]: {
+ "state": row["state"],
+ "status_msg": row["status_msg"],
+ "mtime": row["mtime"],
+ }
+ for row in rows
+ })
+ @defer.inlineCallbacks
def set_presence_state(self, user_localpart, new_state):
- res = self._simple_update_one(
+ res = yield self._simple_update_one(
table="presence",
keyvalues={"user_id": user_localpart},
updatevalues={"state": new_state["state"],
@@ -78,7 +80,7 @@ class PresenceStore(SQLBaseStore):
)
self.get_presence_state.invalidate((user_localpart,))
- return res
+ defer.returnValue(res)
def allow_presence_visible(self, observed_localpart, observer_userid):
return self._simple_insert(
|