summaryrefslogtreecommitdiff
path: root/synapse/storage/directory.py
diff options
context:
space:
mode:
authorErik Johnston <erikj@matrix.org>2015-11-19 13:21:10 +0000
committerErik Johnston <erikj@matrix.org>2015-11-19 13:21:10 +0000
commiteb3677f58ffeddc534bc8ceb2adb060d0794b817 (patch)
tree4377eb0dc5e221862489bdcc802e50e2f1f41cb1 /synapse/storage/directory.py
Imported Upstream version 0.11.0
Diffstat (limited to 'synapse/storage/directory.py')
-rw-r--r--synapse/storage/directory.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/synapse/storage/directory.py b/synapse/storage/directory.py
new file mode 100644
index 00000000..d92028ea
--- /dev/null
+++ b/synapse/storage/directory.py
@@ -0,0 +1,152 @@
+# -*- coding: utf-8 -*-
+# Copyright 2014, 2015 OpenMarket Ltd
+#
+# 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.
+
+from ._base import SQLBaseStore
+from synapse.util.caches.descriptors import cached
+
+from synapse.api.errors import SynapseError
+
+from twisted.internet import defer
+
+from collections import namedtuple
+
+
+RoomAliasMapping = namedtuple(
+ "RoomAliasMapping",
+ ("room_id", "room_alias", "servers",)
+)
+
+
+class DirectoryStore(SQLBaseStore):
+
+ @defer.inlineCallbacks
+ def get_association_from_room_alias(self, room_alias):
+ """ Get's the room_id and server list for a given room_alias
+
+ Args:
+ room_alias (RoomAlias)
+
+ Returns:
+ Deferred: results in namedtuple with keys "room_id" and
+ "servers" or None if no association can be found
+ """
+ room_id = yield self._simple_select_one_onecol(
+ "room_aliases",
+ {"room_alias": room_alias.to_string()},
+ "room_id",
+ allow_none=True,
+ desc="get_association_from_room_alias",
+ )
+
+ if not room_id:
+ defer.returnValue(None)
+ return
+
+ servers = yield self._simple_select_onecol(
+ "room_alias_servers",
+ {"room_alias": room_alias.to_string()},
+ "server",
+ desc="get_association_from_room_alias",
+ )
+
+ if not servers:
+ defer.returnValue(None)
+ return
+
+ defer.returnValue(
+ RoomAliasMapping(room_id, room_alias.to_string(), servers)
+ )
+
+ @defer.inlineCallbacks
+ def create_room_alias_association(self, room_alias, room_id, servers):
+ """ Creates an associatin between a room alias and room_id/servers
+
+ Args:
+ room_alias (RoomAlias)
+ room_id (str)
+ servers (list)
+
+ Returns:
+ Deferred
+ """
+ try:
+ yield self._simple_insert(
+ "room_aliases",
+ {
+ "room_alias": room_alias.to_string(),
+ "room_id": room_id,
+ },
+ desc="create_room_alias_association",
+ )
+ except self.database_engine.module.IntegrityError:
+ raise SynapseError(
+ 409, "Room alias %s already exists" % room_alias.to_string()
+ )
+
+ for server in servers:
+ # TODO(erikj): Fix this to bulk insert
+ yield self._simple_insert(
+ "room_alias_servers",
+ {
+ "room_alias": room_alias.to_string(),
+ "server": server,
+ },
+ desc="create_room_alias_association",
+ )
+ self.get_aliases_for_room.invalidate((room_id,))
+
+ @defer.inlineCallbacks
+ def delete_room_alias(self, room_alias):
+ room_id = yield self.runInteraction(
+ "delete_room_alias",
+ self._delete_room_alias_txn,
+ room_alias,
+ )
+
+ self.get_aliases_for_room.invalidate((room_id,))
+ defer.returnValue(room_id)
+
+ def _delete_room_alias_txn(self, txn, room_alias):
+ txn.execute(
+ "SELECT room_id FROM room_aliases WHERE room_alias = ?",
+ (room_alias.to_string(),)
+ )
+
+ res = txn.fetchone()
+ if res:
+ room_id = res[0]
+ else:
+ return None
+
+ txn.execute(
+ "DELETE FROM room_aliases WHERE room_alias = ?",
+ (room_alias.to_string(),)
+ )
+
+ txn.execute(
+ "DELETE FROM room_alias_servers WHERE room_alias = ?",
+ (room_alias.to_string(),)
+ )
+
+ return room_id
+
+ @cached()
+ def get_aliases_for_room(self, room_id):
+ return self._simple_select_onecol(
+ "room_aliases",
+ {"room_id": room_id},
+ "room_alias",
+ desc="get_aliases_for_room",
+ )