summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/handlers/room.py10
-rw-r--r--synapse/storage/__init__.py20
-rw-r--r--synapse/storage/_base.py9
-rw-r--r--synapse/storage/roommember.py26
-rw-r--r--synapse/storage/schema/im.sql4
-rw-r--r--synapse/storage/stream.py11
6 files changed, 36 insertions, 44 deletions
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index a9ff2d93f1..9b55206e47 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -201,7 +201,7 @@ class MessageHandler(BaseHandler):
 
     @defer.inlineCallbacks
     def get_feedback(self, event_id):
-        yield self.auth.check_joined_room(room_id, user_id)
+        # yield self.auth.check_joined_room(room_id, user_id)
 
         # Pull out the feedback from the db
         fb = yield self.store.get_feedback(event_id)
@@ -690,13 +690,7 @@ class RoomMemberHandler(BaseHandler):
     @defer.inlineCallbacks
     def _do_local_membership_update(self, event, membership, broadcast_msg):
         # store membership
-        store_id = yield self.store.store_room_member(
-            user_id=event.target_user_id,
-            sender=event.user_id,
-            room_id=event.room_id,
-            content=event.content,
-            membership=membership
-        )
+        store_id = yield self.store.persist_event(event)
 
         # Send a PDU to all hosts who have joined the room.
         destinations = yield self.store.get_joined_hosts_for_room(
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index 182b6ebadd..f41c21dcd2 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -13,6 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from twisted.internet import defer
 
 from synapse.api.events.room import (
     RoomMemberEvent, MessageEvent, RoomTopicEvent, FeedbackEvent,
@@ -52,7 +53,7 @@ class DataStore(RoomMemberStore, RoomStore,
         elif event.type == RoomConfigEvent.TYPE:
             yield self._store_room_config(event)
 
-        self._store_event(event)
+        yield self._store_event(event)
 
     @defer.inlineCallbacks
     def get_event(self, event_id):
@@ -76,14 +77,13 @@ class DataStore(RoomMemberStore, RoomStore,
     def _store_event(self, event):
         vals = {
             "event_id": event.event_id,
-            "event_type": event.type,
-            "sender": event.user_id,
+            "type": event.type,
             "room_id": event.room_id,
             "content": json.dumps(event.content),
         }
 
-        unrec = {k: v for k, v in event.get_full_dict() if k not in vals.keys()}
-        val["unrecognized_keys"] = json.dumps(unrec)
+        unrec = {k: v for k, v in event.get_full_dict().items() if k not in vals.keys()}
+        vals["unrecognized_keys"] = json.dumps(unrec)
 
         yield self._simple_insert("events", vals)
 
@@ -91,7 +91,7 @@ class DataStore(RoomMemberStore, RoomStore,
             vals = {
                 "event_id": event.event_id,
                 "room_id": event.room_id,
-                "event_type": event.event_type,
+                "type": event.type,
                 "state_key": event.state_key,
             }
 
@@ -103,16 +103,16 @@ class DataStore(RoomMemberStore, RoomStore,
             # TODO (erikj): We also need to update the current state table?
 
     @defer.inlineCallbacks
-    def get_current_state(room_id, event_type=None, state_key=""):
+    def get_current_state(self, room_id, event_type=None, state_key=""):
         sql = (
-            "SELECT e.* FROM events as e"
-            "INNER JOIN current_state as c ON e.event_id = c.event_id "
+            "SELECT e.* FROM events as e "
+            "INNER JOIN current_state_events as c ON e.event_id = c.event_id "
             "INNER JOIN state_events as s ON e.event_id = s.event_id "
             "WHERE c.room_id = ? "
         )
 
         if event_type:
-            sql += " s.type = ? AND s.state_key = ? "
+            sql += " AND s.type = ? AND s.state_key = ? "
             args = (room_id, event_type, state_key)
         else:
             args = (room_id, )
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index 533f509709..c8ec63f30a 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -19,6 +19,7 @@ from twisted.internet import defer
 from synapse.api.errors import StoreError
 
 import collections
+import copy
 import json
 
 
@@ -59,7 +60,7 @@ class SQLBaseStore(object):
             The result of decoder(results)
         """
         logger.debug(
-            "[SQL] %s  Args=%s Func=%s", query, args, decoder.__name__
+            "[SQL] %s  Args=%s Func=%s", query, args, decoder.__name__ if decoder else None
         )
 
         def interaction(txn):
@@ -72,7 +73,7 @@ class SQLBaseStore(object):
         return self._db_pool.runInteraction(interaction)
 
     def _execute_and_decode(self, query, *args):
-        return self._execute(self.cursor_to_dict, *args)
+        return self._execute(self.cursor_to_dict, query, *args)
 
     # "Simple" SQL API methods that operate on a single table with no JOINs,
     # no complex WHERE clauses, just a dict of values for columns.
@@ -291,8 +292,8 @@ class SQLBaseStore(object):
         return self._db_pool.runInteraction(func)
 
     def _parse_event_from_row(self, row_dict):
-        d = copy.deepcopy({k: v for k, v in row.items() if v})
-        d.update(json.loads(json.loads(row["unrecognized_keys"])))
+        d = copy.deepcopy({k: v for k, v in row_dict.items() if v})
+        d.update(json.loads(json.loads(row_dict["unrecognized_keys"])))
         d["content"] = json.loads(d["content"])
         del d["unrecognized_keys"]
 
diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py
index 14c0152e8a..8c4b04f190 100644
--- a/synapse/storage/roommember.py
+++ b/synapse/storage/roommember.py
@@ -54,13 +54,13 @@ class RoomMemberStore(SQLBaseStore):
                 "INSERT OR IGNORE INTO room_hosts (room_id, host) "
                 "VALUES (?, ?)"
             )
-            yield self._execute(None, sql, room_id, domain)
+            yield self._execute(None, sql, event.room_id, domain)
         else:
             sql = (
                 "DELETE FROM room_hosts WHERE room_id = ? AND host = ?"
             )
 
-            yield self._execute(None, sql, room_id, domain)
+            yield self._execute(None, sql, event.room_id, domain)
 
 
     def get_room_member(self, user_id, room_id):
@@ -72,10 +72,10 @@ class RoomMemberStore(SQLBaseStore):
         Returns:
             Deferred: Results in a MembershipEvent or None.
         """
-        return self._get_members_by_dict(
-            room_id=room_id,
-            user_id=user_id
-        )
+        return self._get_members_by_dict({
+            "e.room_id": room_id,
+            "m.user_id": user_id,
+        })
 
     def get_room_members(self, room_id, membership=None):
         """Retrieve the current room member list for a room.
@@ -89,11 +89,11 @@ class RoomMemberStore(SQLBaseStore):
             list of namedtuples representing the members in this room.
         """
 
-        where = {"room_id": room_id}
+        where = {"m.room_id": room_id}
         if membership:
-            where["membership"] = membership
+            where["m.membership"] = membership
 
-        return self._get_members_by_dict(**membership)
+        return self._get_members_by_dict(where)
 
     def get_rooms_for_user_where_membership_is(self, user_id, membership_list):
         """ Get all the rooms for this user where the membership for this user
@@ -126,8 +126,8 @@ class RoomMemberStore(SQLBaseStore):
         )
 
     def _get_members_by_dict(self, where_dict):
-        clause = " AND ".join("%s = ?" % k for k in where.keys())
-        vals = where.values()
+        clause = " AND ".join("%s = ?" % k for k in where_dict.keys())
+        vals = where_dict.values()
         return self._get_members_query(clause, vals)
 
     @defer.inlineCallbacks
@@ -136,11 +136,11 @@ class RoomMemberStore(SQLBaseStore):
             "SELECT e.* FROM events as e "
             "INNER JOIN room_memberships as m "
             "ON e.event_id = m.event_id "
-            "INNER JOIN current_state as c "
+            "INNER JOIN current_state_events as c "
             "ON m.event_id = c.event_id "
             "WHERE %s "
         ) % (where_clause,)
 
-        rows = yield self._execute_and_decode(sql, where_values)
+        rows = yield self._execute_and_decode(sql, *where_values)
         results = [self._parse_event_from_row(r) for r in rows]
         defer.returnValue(results)
diff --git a/synapse/storage/schema/im.sql b/synapse/storage/schema/im.sql
index 7f564c8540..85c0c7119c 100644
--- a/synapse/storage/schema/im.sql
+++ b/synapse/storage/schema/im.sql
@@ -30,9 +30,9 @@ CREATE TABLE IF NOT EXISTS state_events(
     prev_state TEXT
 );
 
-CREATE TABLE IF NOT EXISTS current_state(
+CREATE TABLE IF NOT EXISTS current_state_events(
     event_id TEXT NOT NULL,
-    room_id TEXT NOT NULL,
+    room_id TEXT NOT NULL
 );
 
 CREATE TABLE IF NOT EXISTS room_memberships(
diff --git a/synapse/storage/stream.py b/synapse/storage/stream.py
index 1456d216f0..9937239c22 100644
--- a/synapse/storage/stream.py
+++ b/synapse/storage/stream.py
@@ -13,12 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from twisted.internet import defer
 
 from ._base import SQLBaseStore
-from .message import MessagesTable
-from .feedback import FeedbackTable
-from .roomdata import RoomDataTable
-from .roommember import RoomMemberTable
 
 from synapse.api.constants import Membership
 
@@ -40,13 +37,13 @@ class StreamStore(SQLBaseStore):
 
         current_room_membership_sql = (
             "SELECT m.room_id FROM room_memberships as m "
-            "INNER JOIN current_state as c ON m.event_id = c.event_id "
+            "INNER JOIN current_state_events as c ON m.event_id = c.event_id "
             "WHERE m.user_id = ?"
         )
 
         invites_sql = (
             "SELECT m.event_id FROM room_membershipas as m "
-            "INNER JOIN current_state as c ON m.event_id = c.event_id "
+            "INNER JOIN current_state_events as c ON m.event_id = c.event_id "
             "WHERE m.user_id = ? AND m.membership = ?"
         )
 
@@ -71,4 +68,4 @@ class StreamStore(SQLBaseStore):
             user_id, user_id, Membership.INVITE
         )
 
-        defer.returnValue([self._parse_event_from_row(r) for r in results])
+        defer.returnValue([self._parse_event_from_row(r) for r in rows])