From b8906b0ea80149f1219161d24135ccc8d0f014ea Mon Sep 17 00:00:00 2001 From: "Paul \"LeoNerd\" Evans" Date: Wed, 3 Sep 2014 16:11:34 +0100 Subject: [PATCH] Kill the 'state' presence key in DB, name it 'presence' instead to match the over-the-wire API --- synapse/app/homeserver.py | 2 +- synapse/handlers/presence.py | 3 --- synapse/storage/presence.py | 6 ++--- synapse/storage/schema/delta/v3.sql | 34 +++++++++++++++++++++++++++++ synapse/storage/schema/presence.sql | 2 +- tests/handlers/test_presence.py | 22 +++++++++---------- tests/handlers/test_presencelike.py | 8 +++---- tests/rest/test_presence.py | 10 ++++----- 8 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 synapse/storage/schema/delta/v3.sql diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index db2e9ebb0c..acdc7ccb31 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -57,7 +57,7 @@ SCHEMAS = [ # Remember to update this number every time an incompatible change is made to # database schema files, so the users will be informed on server restarts. -SCHEMA_VERSION = 2 +SCHEMA_VERSION = 3 class SynapseHomeServer(HomeServer): diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index e911e18511..7a8ebf7954 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -180,7 +180,6 @@ class PresenceHandler(BaseHandler): state = yield self.store.get_presence_state(target_user.localpart) if "mtime" in state: del state["mtime"] - state["presence"] = state.pop("state") if target_user in self._user_cachemap: state["last_active"] = ( @@ -227,7 +226,6 @@ class PresenceHandler(BaseHandler): target_user.localpart, state["presence"]) state_to_store = dict(state) - state_to_store["state"] = state_to_store.pop("presence") statuscache=self._get_or_offline_usercache(target_user) was_level = self.STATE_LEVELS[statuscache.get_state()["presence"]] @@ -596,7 +594,6 @@ class PresenceHandler(BaseHandler): if state is None: state = yield self.store.get_presence_state(user.localpart) del state["mtime"] - state["presence"] = state.pop("state") if user in self._user_cachemap: state["last_active"] = ( diff --git a/synapse/storage/presence.py b/synapse/storage/presence.py index a529104f4d..da40c0454c 100644 --- a/synapse/storage/presence.py +++ b/synapse/storage/presence.py @@ -35,17 +35,17 @@ class PresenceStore(SQLBaseStore): return self._simple_select_one( table="presence", keyvalues={"user_id": user_localpart}, - retcols=["state", "status_msg", "mtime"], + retcols=["presence", "status_msg", "mtime"], ) def set_presence_state(self, user_localpart, new_state): return self._simple_update_one( table="presence", keyvalues={"user_id": user_localpart}, - updatevalues={"state": new_state["state"], + updatevalues={"presence": new_state["presence"], "status_msg": new_state["status_msg"], "mtime": self._clock.time_msec()}, - retcols=["state"], + retcols=["presence"], ) def allow_presence_visible(self, observed_localpart, observer_userid): diff --git a/synapse/storage/schema/delta/v3.sql b/synapse/storage/schema/delta/v3.sql new file mode 100644 index 0000000000..589de8e14e --- /dev/null +++ b/synapse/storage/schema/delta/v3.sql @@ -0,0 +1,34 @@ +/* Copyright 2014 matrix.org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- SQLite3 doesn't support renaming or dropping columns. We'll have to go the +-- long way round + +CREATE TABLE NEW_presence( + user_id INTEGER NOT NULL, + presence INTEGER, + status_msg TEXT, + mtime INTEGER, + FOREIGN KEY(user_id) REFERENCES users(id) +); + +-- rename the 'state' field to 'presence' +INSERT INTO NEW_presence (user_id, presence, status_msg, mtime) + SELECT user_id, state, status_msg, mtime FROM presence; + +DROP TABLE presence; +ALTER TABLE NEW_presence RENAME TO presence; + +PRAGMA user_version = 3; diff --git a/synapse/storage/schema/presence.sql b/synapse/storage/schema/presence.sql index b1081d3aab..e8736ee87b 100644 --- a/synapse/storage/schema/presence.sql +++ b/synapse/storage/schema/presence.sql @@ -14,7 +14,7 @@ */ CREATE TABLE IF NOT EXISTS presence( user_id INTEGER NOT NULL, - state INTEGER, + presence INTEGER, status_msg TEXT, mtime INTEGER, -- miliseconds since last state change FOREIGN KEY(user_id) REFERENCES users(id) diff --git a/tests/handlers/test_presence.py b/tests/handlers/test_presence.py index 74ac3ea8f5..9efc35376a 100644 --- a/tests/handlers/test_presence.py +++ b/tests/handlers/test_presence.py @@ -134,7 +134,7 @@ class PresenceStateTestCase(unittest.TestCase): def test_get_my_state(self): mocked_get = self.datastore.get_presence_state mocked_get.return_value = defer.succeed( - {"state": ONLINE, "status_msg": "Online"} + {"presence": ONLINE, "status_msg": "Online"} ) state = yield self.handler.get_state( @@ -151,7 +151,7 @@ class PresenceStateTestCase(unittest.TestCase): def test_get_allowed_state(self): mocked_get = self.datastore.get_presence_state mocked_get.return_value = defer.succeed( - {"state": ONLINE, "status_msg": "Online"} + {"presence": ONLINE, "status_msg": "Online"} ) state = yield self.handler.get_state( @@ -168,7 +168,7 @@ class PresenceStateTestCase(unittest.TestCase): def test_get_same_room_state(self): mocked_get = self.datastore.get_presence_state mocked_get.return_value = defer.succeed( - {"state": ONLINE, "status_msg": "Online"} + {"presence": ONLINE, "status_msg": "Online"} ) self.room_members = [self.u_apple, self.u_clementine] @@ -186,7 +186,7 @@ class PresenceStateTestCase(unittest.TestCase): def test_get_disallowed_state(self): mocked_get = self.datastore.get_presence_state mocked_get.return_value = defer.succeed( - {"state": ONLINE, "status_msg": "Online"} + {"presence": ONLINE, "status_msg": "Online"} ) self.room_members = [] @@ -201,14 +201,14 @@ class PresenceStateTestCase(unittest.TestCase): @defer.inlineCallbacks def test_set_my_state(self): mocked_set = self.datastore.set_presence_state - mocked_set.return_value = defer.succeed({"state": OFFLINE}) + mocked_set.return_value = defer.succeed({"presence": OFFLINE}) yield self.handler.set_state( target_user=self.u_apple, auth_user=self.u_apple, state={"presence": UNAVAILABLE, "status_msg": "Away"}) mocked_set.assert_called_with("apple", - {"state": UNAVAILABLE, "status_msg": "Away"} + {"presence": UNAVAILABLE, "status_msg": "Away"} ) self.mock_start.assert_called_with(self.u_apple, state={ @@ -624,7 +624,7 @@ class PresencePushTestCase(unittest.TestCase): self.room_members = [self.u_apple, self.u_elderberry] self.datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) # TODO(paul): Gut-wrenching @@ -793,7 +793,7 @@ class PresencePushTestCase(unittest.TestCase): self.room_members = [self.u_apple, self.u_onion] self.datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) # TODO(paul): Gut-wrenching @@ -1043,7 +1043,7 @@ class PresencePollingTestCase(unittest.TestCase): def get_presence_state(user_localpart): return defer.succeed( - {"state": self.current_user_state[user_localpart], + {"presence": self.current_user_state[user_localpart], "status_msg": None, "mtime": 123456000} ) @@ -1051,8 +1051,8 @@ class PresencePollingTestCase(unittest.TestCase): def set_presence_state(user_localpart, new_state): was = self.current_user_state[user_localpart] - self.current_user_state[user_localpart] = new_state["state"] - return defer.succeed({"state": was}) + self.current_user_state[user_localpart] = new_state["presence"] + return defer.succeed({"presence": was}) self.datastore.set_presence_state = set_presence_state def get_presence_list(user_localpart, accepted): diff --git a/tests/handlers/test_presencelike.py b/tests/handlers/test_presencelike.py index fc0ef8c705..2f551f1b6b 100644 --- a/tests/handlers/test_presencelike.py +++ b/tests/handlers/test_presencelike.py @@ -144,14 +144,14 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase): ] mocked_set = self.datastore.set_presence_state - mocked_set.return_value = defer.succeed({"state": OFFLINE}) + mocked_set.return_value = defer.succeed({"presence": OFFLINE}) yield self.handlers.presence_handler.set_state( target_user=self.u_apple, auth_user=self.u_apple, state={"presence": UNAVAILABLE, "status_msg": "Away"}) mocked_set.assert_called_with("apple", - {"state": UNAVAILABLE, "status_msg": "Away"} + {"presence": UNAVAILABLE, "status_msg": "Away"} ) @defer.inlineCallbacks @@ -162,7 +162,7 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase): ] self.datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) # TODO(paul): Gut-wrenching @@ -244,7 +244,7 @@ class PresenceProfilelikeDataTestCase(unittest.TestCase): ] self.datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) # TODO(paul): Gut-wrenching diff --git a/tests/rest/test_presence.py b/tests/rest/test_presence.py index f2751f56d3..f355bcf712 100644 --- a/tests/rest/test_presence.py +++ b/tests/rest/test_presence.py @@ -91,7 +91,7 @@ class PresenceStateTestCase(unittest.TestCase): def test_get_my_status(self): mocked_get = self.datastore.get_presence_state mocked_get.return_value = defer.succeed( - {"state": ONLINE, "status_msg": "Available"} + {"presence": ONLINE, "status_msg": "Available"} ) (code, response) = yield self.mock_resource.trigger("GET", @@ -107,7 +107,7 @@ class PresenceStateTestCase(unittest.TestCase): @defer.inlineCallbacks def test_set_my_status(self): mocked_set = self.datastore.set_presence_state - mocked_set.return_value = defer.succeed({"state": OFFLINE}) + mocked_set.return_value = defer.succeed({"presence": OFFLINE}) (code, response) = yield self.mock_resource.trigger("PUT", "/presence/%s/status" % (myid), @@ -115,7 +115,7 @@ class PresenceStateTestCase(unittest.TestCase): self.assertEquals(200, code) mocked_set.assert_called_with("apple", - {"state": UNAVAILABLE, "status_msg": "Away"} + {"presence": UNAVAILABLE, "status_msg": "Away"} ) @@ -312,7 +312,7 @@ class PresenceEventStreamTestCase(unittest.TestCase): self.room_members = [self.u_apple, self.u_banana] self.mock_datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) self.mock_datastore.get_presence_list.return_value = defer.succeed( [] @@ -332,7 +332,7 @@ class PresenceEventStreamTestCase(unittest.TestCase): ) self.mock_datastore.set_presence_state.return_value = defer.succeed( - {"state": ONLINE} + {"presence": ONLINE} ) self.mock_datastore.get_presence_list.return_value = defer.succeed( []