From 336987bb8debec9dcdbe27d59ce3889b39f86dbb Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 13 Aug 2014 16:27:14 +0100 Subject: Initial stab at refactoring the SQL tables, including rejigging some of the storage layer. --- synapse/storage/feedback.py | 69 ++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 48 deletions(-) (limited to 'synapse/storage/feedback.py') diff --git a/synapse/storage/feedback.py b/synapse/storage/feedback.py index 9bd562c762..fc93f92e1d 100644 --- a/synapse/storage/feedback.py +++ b/synapse/storage/feedback.py @@ -22,54 +22,27 @@ import json class FeedbackStore(SQLBaseStore): - def store_feedback(self, room_id, msg_id, msg_sender_id, - fb_sender_id, fb_type, content): - return self._simple_insert(FeedbackTable.table_name, dict( - room_id=room_id, - msg_id=msg_id, - msg_sender_id=msg_sender_id, - fb_sender_id=fb_sender_id, - fb_type=fb_type, - content=content, - )) - - def get_feedback(self, room_id=None, msg_id=None, msg_sender_id=None, - fb_sender_id=None, fb_type=None): - query = FeedbackTable.select_statement( - "msg_sender_id = ? AND room_id = ? AND msg_id = ? " + - "AND fb_sender_id = ? AND feedback_type = ? " + - "ORDER BY id DESC LIMIT 1") - return self._execute( - FeedbackTable.decode_single_result, - query, msg_sender_id, room_id, msg_id, fb_sender_id, fb_type, + def _store_feedback(self, event): + return self._simple_insert("feedback", { + "event_id": event.event_id, + "feedback_type": event.feedback_type, + "room_id": event.room_id, + "target_event_id": event.target_event, + }) + + @defer.inlineCallback + def get_feedback_for_event(self, event_id): + sql = ( + "SELECT events.* FROM events INNER JOIN feedback " + "ON events.event_id = feedback.event_id " + "WHERE feedback.target_event_id = ? " ) - def get_max_feedback_id(self): - return self._simple_max_id(FeedbackTable.table_name) - - -class FeedbackTable(Table): - table_name = "feedback" + rows = yield self._execute_query(sql, event_id) - fields = [ - "id", - "content", - "feedback_type", - "fb_sender_id", - "msg_id", - "room_id", - "msg_sender_id" - ] - - class EntryType(collections.namedtuple("FeedbackEntry", fields)): - - def as_event(self, event_factory): - return event_factory.create_event( - etype=FeedbackEvent.TYPE, - room_id=self.room_id, - msg_id=self.msg_id, - msg_sender_id=self.msg_sender_id, - user_id=self.fb_sender_id, - feedback_type=self.feedback_type, - content=json.loads(self.content), - ) + defer.returnValue( + [ + self._parse_event_from_row(r) + for r in rows + ] + ) -- cgit 1.5.1 From beaf4384d906f7fb41d80619d0a46a3f593795db Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 13 Aug 2014 17:43:34 +0100 Subject: Make feedback table also store sender. --- synapse/storage/feedback.py | 1 + synapse/storage/schema/im.sql | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'synapse/storage/feedback.py') diff --git a/synapse/storage/feedback.py b/synapse/storage/feedback.py index fc93f92e1d..b9e792c120 100644 --- a/synapse/storage/feedback.py +++ b/synapse/storage/feedback.py @@ -28,6 +28,7 @@ class FeedbackStore(SQLBaseStore): "feedback_type": event.feedback_type, "room_id": event.room_id, "target_event_id": event.target_event, + "sender": event.user_id, }) @defer.inlineCallback diff --git a/synapse/storage/schema/im.sql b/synapse/storage/schema/im.sql index ad9770244d..37b7c6c74f 100644 --- a/synapse/storage/schema/im.sql +++ b/synapse/storage/schema/im.sql @@ -47,7 +47,8 @@ CREATE TABLE IF NOT EXISTS room_memberships( CREATE TABLE IF NOT EXISTS feedback( event_id TEXT NOT NULL, feedback_type TEXT, - target_event_id TEXT,sudo + target_event_id TEXT, + sender TEXT, room_id TEXT ); -- cgit 1.5.1 From 2529f2bc01781314ecdedd69e272c737ba1a71f5 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Thu, 14 Aug 2014 16:58:51 +0100 Subject: Rename _execute_query --- synapse/storage/__init__.py | 2 +- synapse/storage/_base.py | 2 +- synapse/storage/feedback.py | 2 +- synapse/storage/roommember.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'synapse/storage/feedback.py') diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py index cd9acdc447..75d93f7111 100644 --- a/synapse/storage/__init__.py +++ b/synapse/storage/__init__.py @@ -119,7 +119,7 @@ class DataStore(RoomDataStore, RoomMemberStore, MessageStore, RoomStore, else: args = (room_id, ) - results = yield self._execute_query(sql, *args) + results = yield self._execute_and_decode(sql, *args) defer.returnValue( diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py index befeb55b25..7fef8601e7 100644 --- a/synapse/storage/_base.py +++ b/synapse/storage/_base.py @@ -71,7 +71,7 @@ class SQLBaseStore(object): return self._db_pool.runInteraction(interaction) - def _execut_query(self, query, *args): + def _execute_and_decode(self, query, *args): return self._execute(self.cursor_to_dict, *args) # "Simple" SQL API methods that operate on a single table with no JOINs, diff --git a/synapse/storage/feedback.py b/synapse/storage/feedback.py index b9e792c120..dd5f3fbc10 100644 --- a/synapse/storage/feedback.py +++ b/synapse/storage/feedback.py @@ -39,7 +39,7 @@ class FeedbackStore(SQLBaseStore): "WHERE feedback.target_event_id = ? " ) - rows = yield self._execute_query(sql, event_id) + rows = yield self._execute_and_decode(sql, event_id) defer.returnValue( [ diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py index 60296380e6..c99cefbcfc 100644 --- a/synapse/storage/roommember.py +++ b/synapse/storage/roommember.py @@ -141,6 +141,6 @@ class RoomMemberStore(SQLBaseStore): "WHERE %s " ) % (where_clause,) - rows = yield self._execute_query(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) -- cgit 1.5.1 From 661c7117659118ed977f56a092525dbdae9dc67c Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Thu, 14 Aug 2014 17:34:37 +0100 Subject: Start fixing places that use the data store. --- synapse/handlers/room.py | 17 ++++------------- synapse/rest/room.py | 39 +++++++++++++++++++++------------------ synapse/storage/__init__.py | 8 +++----- synapse/storage/_base.py | 2 +- synapse/storage/feedback.py | 4 +++- synapse/storage/roommember.py | 2 +- 6 files changed, 33 insertions(+), 39 deletions(-) (limited to 'synapse/storage/feedback.py') diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py index eae40765b3..a9ff2d93f1 100644 --- a/synapse/handlers/room.py +++ b/synapse/handlers/room.py @@ -141,12 +141,7 @@ class MessageHandler(BaseHandler): yield self.state_handler.handle_new_event(event) # store in db - store_id = yield self.store.store_room_data( - room_id=event.room_id, - etype=event.type, - state_key=event.state_key, - content=json.dumps(event.content) - ) + store_id = yield self.store.persist_event(event) event.destinations = yield self.store.get_joined_hosts_for_room( event.room_id @@ -201,19 +196,15 @@ class MessageHandler(BaseHandler): raise RoomError( 403, "Member does not meet private room rules.") - data = yield self.store.get_room_data(room_id, event_type, state_key) + data = yield self.store.get_current_state(room_id, event_type, state_key) defer.returnValue(data) @defer.inlineCallbacks - def get_feedback(self, room_id=None, msg_sender_id=None, msg_id=None, - user_id=None, fb_sender_id=None, fb_type=None): + def get_feedback(self, event_id): yield self.auth.check_joined_room(room_id, user_id) # Pull out the feedback from the db - fb = yield self.store.get_feedback( - room_id=room_id, msg_id=msg_id, msg_sender_id=msg_sender_id, - fb_sender_id=fb_sender_id, fb_type=fb_type - ) + fb = yield self.store.get_feedback(event_id) if fb: defer.returnValue(fb) diff --git a/synapse/rest/room.py b/synapse/rest/room.py index 1fc0c996b8..3f153df8e3 100644 --- a/synapse/rest/room.py +++ b/synapse/rest/room.py @@ -285,25 +285,28 @@ class FeedbackRestServlet(RestServlet): feedback_type): user = yield (self.auth.get_user_by_req(request)) - if feedback_type not in Feedback.LIST: - raise SynapseError(400, "Bad feedback type.", - errcode=Codes.BAD_JSON) - - msg_handler = self.handlers.message_handler - feedback = yield msg_handler.get_feedback( - room_id=urllib.unquote(room_id), - msg_sender_id=msg_sender_id, - msg_id=msg_id, - user_id=user.to_string(), - fb_sender_id=fb_sender_id, - fb_type=feedback_type - ) - - if not feedback: - raise SynapseError(404, "Feedback not found.", - errcode=Codes.NOT_FOUND) + # TODO (erikj): Implement this? + raise NotImplementedError("Getting feedback is not supported") - defer.returnValue((200, json.loads(feedback.content))) +# if feedback_type not in Feedback.LIST: +# raise SynapseError(400, "Bad feedback type.", +# errcode=Codes.BAD_JSON) +# +# msg_handler = self.handlers.message_handler +# feedback = yield msg_handler.get_feedback( +# room_id=urllib.unquote(room_id), +# msg_sender_id=msg_sender_id, +# msg_id=msg_id, +# user_id=user.to_string(), +# fb_sender_id=fb_sender_id, +# fb_type=feedback_type +# ) +# +# if not feedback: +# raise SynapseError(404, "Feedback not found.", +# errcode=Codes.NOT_FOUND) +# +# defer.returnValue((200, json.loads(feedback.content))) @defer.inlineCallbacks def on_PUT(self, request, room_id, sender_id, msg_id, fb_sender_id, diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py index afdd75f46d..182b6ebadd 100644 --- a/synapse/storage/__init__.py +++ b/synapse/storage/__init__.py @@ -21,13 +21,11 @@ from synapse.api.events.room import ( from .directory import DirectoryStore from .feedback import FeedbackStore -from .message import MessageStore from .presence import PresenceStore from .profile import ProfileStore from .registration import RegistrationStore from .room import RoomStore from .roommember import RoomMemberStore -from .roomdata import RoomDataStore from .stream import StreamStore from .pdu import StatePduStore, PduStore from .transactions import TransactionStore @@ -36,7 +34,7 @@ import json import os -class DataStore(RoomDataStore, RoomMemberStore, MessageStore, RoomStore, +class DataStore(RoomMemberStore, RoomStore, RegistrationStore, StreamStore, ProfileStore, FeedbackStore, PresenceStore, PduStore, StatePduStore, TransactionStore, DirectoryStore): @@ -78,7 +76,7 @@ class DataStore(RoomDataStore, RoomMemberStore, MessageStore, RoomStore, def _store_event(self, event): vals = { "event_id": event.event_id, - "event_type", event.type, + "event_type": event.type, "sender": event.user_id, "room_id": event.room_id, "content": json.dumps(event.content), @@ -105,7 +103,7 @@ class DataStore(RoomDataStore, RoomMemberStore, MessageStore, 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(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 " diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py index 7fef8601e7..533f509709 100644 --- a/synapse/storage/_base.py +++ b/synapse/storage/_base.py @@ -293,7 +293,7 @@ class SQLBaseStore(object): 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["content"] = json.loads(d["content"}) + d["content"] = json.loads(d["content"]) del d["unrecognized_keys"] return self.event_factory.create_event( diff --git a/synapse/storage/feedback.py b/synapse/storage/feedback.py index dd5f3fbc10..e60f98d1e1 100644 --- a/synapse/storage/feedback.py +++ b/synapse/storage/feedback.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from twisted.internet import defer + from ._base import SQLBaseStore, Table from synapse.api.events.room import FeedbackEvent @@ -31,7 +33,7 @@ class FeedbackStore(SQLBaseStore): "sender": event.user_id, }) - @defer.inlineCallback + @defer.inlineCallbacks def get_feedback_for_event(self, event_id): sql = ( "SELECT events.* FROM events INNER JOIN feedback " diff --git a/synapse/storage/roommember.py b/synapse/storage/roommember.py index c99cefbcfc..14c0152e8a 100644 --- a/synapse/storage/roommember.py +++ b/synapse/storage/roommember.py @@ -112,7 +112,7 @@ class RoomMemberStore(SQLBaseStore): args = [user_id] args.extend(membership_list) - where_clause "user_id = ? AND (%s)" % ( + where_clause = "user_id = ? AND (%s)" % ( " OR ".join(["membership = ?" for _ in membership_list]), ) -- cgit 1.5.1