summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2014-08-18 16:00:46 +0100
committerErik Johnston <erik@matrix.org>2014-08-18 16:00:46 +0100
commit709a92cee89709811c51cac7d8c66922093be673 (patch)
tree1d1d1ca90bceaf2c7749a90f6ff4b54efbaf97cc
parentMerge branch 'master' of github.com:matrix-org/synapse into sql_refactor (diff)
downloadsynapse-709a92cee89709811c51cac7d8c66922093be673.tar.xz
SQL doesn't allow AUTOINCREMENT on non PRIMARY KEY columns.
-rw-r--r--synapse/storage/__init__.py21
-rw-r--r--synapse/storage/schema/im.sql2
-rw-r--r--tests/rest/test_presence.py2
-rw-r--r--tests/rest/test_profile.py1
4 files changed, 23 insertions, 3 deletions
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index 9f78f3f9bd..b846081d49 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -45,6 +45,9 @@ class DataStore(RoomMemberStore, RoomStore,
         self.event_factory = hs.get_event_factory()
         self.hs = hs
 
+        self.min_token_deferred = self._get_min_token()
+        self.min_token = None
+
     @defer.inlineCallbacks
     def persist_event(self, event, backfilled=False):
         if event.type == RoomMemberEvent.TYPE:
@@ -82,7 +85,7 @@ class DataStore(RoomMemberStore, RoomStore,
     @defer.inlineCallbacks
     def _store_event(self, event, backfilled):
         # FIXME (erikj): This should be removed when we start amalgamating
-        # event and pdu storage.
+        # event and pdu storage
         yield self.hs.get_federation().fill_out_prev_events(event)
 
         vals = {
@@ -95,7 +98,10 @@ class DataStore(RoomMemberStore, RoomStore,
         }
 
         if backfilled:
-            vals["token_ordering"] = "-1"
+            if not self.min_token_deferred.called:
+                yield self.min_token_deferred
+            self.min_token -= 1
+            vals["token_ordering"] = self.min_token
 
         unrec = {
             k: v
@@ -151,6 +157,17 @@ class DataStore(RoomMemberStore, RoomStore,
 
         defer.returnValue([self._parse_event_from_row(r) for r in results])
 
+    @defer.inlineCallbacks
+    def _get_min_token(self):
+        row = yield self._execute(
+            None,
+            "SELECT MIN(token_ordering) FROM events"
+        )
+
+        self.min_token = rows[0][0] if rows and rows[0] else 0
+
+        defer.returnValue(self.min_token)
+
 
 def schema_path(schema):
     """ Get a filesystem path for the named database schema
diff --git a/synapse/storage/schema/im.sql b/synapse/storage/schema/im.sql
index b0240e39af..0fb3dbee55 100644
--- a/synapse/storage/schema/im.sql
+++ b/synapse/storage/schema/im.sql
@@ -14,7 +14,7 @@
  */
 
 CREATE TABLE IF NOT EXISTS events(
-    token_ordering INTEGER AUTOINCREMENT,
+    token_ordering INTEGER PRIMARY KEY AUTOINCREMENT,
     topological_ordering INTEGER NOT NULL,
     event_id TEXT NOT NULL,
     type TEXT NOT NULL,
diff --git a/tests/rest/test_presence.py b/tests/rest/test_presence.py
index 91d4d1ff6c..99287823e4 100644
--- a/tests/rest/test_presence.py
+++ b/tests/rest/test_presence.py
@@ -51,6 +51,7 @@ class PresenceStateTestCase(unittest.TestCase):
         hs = HomeServer("test",
             db_pool=None,
             http_client=None,
+            datastore=None,
             resource_for_client=self.mock_server,
             resource_for_federation=self.mock_server,
         )
@@ -109,6 +110,7 @@ class PresenceListTestCase(unittest.TestCase):
         hs = HomeServer("test",
             db_pool=None,
             http_client=None,
+            datastore=None,
             resource_for_client=self.mock_server,
             resource_for_federation=self.mock_server
         )
diff --git a/tests/rest/test_profile.py b/tests/rest/test_profile.py
index ff1e92805e..ee47daf4c2 100644
--- a/tests/rest/test_profile.py
+++ b/tests/rest/test_profile.py
@@ -46,6 +46,7 @@ class ProfileTestCase(unittest.TestCase):
             resource_for_client=self.mock_server,
             federation=Mock(),
             replication_layer=Mock(),
+            datastore=None,
         )
 
         def _get_user_by_token(token=None):