summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <paul@matrix.org>2014-09-03 16:11:34 +0100
committerPaul "LeoNerd" Evans <paul@matrix.org>2014-09-03 16:11:34 +0100
commitb8906b0ea80149f1219161d24135ccc8d0f014ea (patch)
tree8391df33a27fca1764658eb56c2275f3a6d152f2
parentKill the state (diff)
downloadsynapse-b8906b0ea80149f1219161d24135ccc8d0f014ea.tar.xz
Kill the 'state' presence key in DB, name it 'presence' instead to match the over-the-wire API
-rwxr-xr-xsynapse/app/homeserver.py2
-rw-r--r--synapse/handlers/presence.py3
-rw-r--r--synapse/storage/presence.py6
-rw-r--r--synapse/storage/schema/delta/v3.sql34
-rw-r--r--synapse/storage/schema/presence.sql2
-rw-r--r--tests/handlers/test_presence.py22
-rw-r--r--tests/handlers/test_presencelike.py8
-rw-r--r--tests/rest/test_presence.py10
8 files changed, 59 insertions, 28 deletions
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(
             []