diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/room_aliases_table.go b/src/github.com/matrix-org/dendrite/roomserver/storage/room_aliases_table.go index 433835d7a..b08ce96cd 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/room_aliases_table.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/room_aliases_table.go @@ -39,14 +39,18 @@ const selectRoomIDFromAliasSQL = "" + const selectAliasesFromRoomIDSQL = "" + "SELECT alias FROM roomserver_room_aliases WHERE room_id = $1" +const selectAliasesFromRoomIDsSQL = "" + + "SELECT alias, room_id FROM roomserver_room_aliases WHERE room_id = ANY($1)" + const deleteRoomAliasSQL = "" + "DELETE FROM roomserver_room_aliases WHERE alias = $1" type roomAliasesStatements struct { - insertRoomAliasStmt *sql.Stmt - selectRoomIDFromAliasStmt *sql.Stmt - selectAliasesFromRoomIDStmt *sql.Stmt - deleteRoomAliasStmt *sql.Stmt + insertRoomAliasStmt *sql.Stmt + selectRoomIDFromAliasStmt *sql.Stmt + selectAliasesFromRoomIDStmt *sql.Stmt + selectAliasesFromRoomIDsStmt *sql.Stmt + deleteRoomAliasStmt *sql.Stmt } func (s *roomAliasesStatements) prepare(db *sql.DB) (err error) { @@ -58,6 +62,7 @@ func (s *roomAliasesStatements) prepare(db *sql.DB) (err error) { {&s.insertRoomAliasStmt, insertRoomAliasSQL}, {&s.selectRoomIDFromAliasStmt, selectRoomIDFromAliasSQL}, {&s.selectAliasesFromRoomIDStmt, selectAliasesFromRoomIDSQL}, + {&s.selectAliasesFromRoomIDsStmt, selectAliasesFromRoomIDsSQL}, {&s.deleteRoomAliasStmt, deleteRoomAliasSQL}, }.prepare(db) } @@ -94,6 +99,29 @@ func (s *roomAliasesStatements) selectAliasesFromRoomID(roomID string) (aliases return } +func (s *roomAliasesStatements) selectAliasesFromRoomIDs(roomIDs []string) (aliases map[string][]string, err error) { + aliases = make(map[string][]string) + rows, err := s.selectAliasesFromRoomIDsStmt.Query(roomIDs) + if err != nil { + return + } + + for rows.Next() { + var alias, roomID string + if err = rows.Scan(&alias, &roomID); err != nil { + return + } + + if len(aliases[roomID]) > 0 { + aliases[roomID] = append(aliases[roomID], alias) + } else { + aliases[roomID] = []string{alias} + } + } + + return +} + func (s *roomAliasesStatements) deleteRoomAlias(alias string) (err error) { _, err = s.deleteRoomAliasStmt.Exec(alias) return diff --git a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go index e459519a2..09f1fe8ff 100644 --- a/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go +++ b/src/github.com/matrix-org/dendrite/roomserver/storage/storage.go @@ -370,6 +370,13 @@ func (d *Database) GetAliasesFromRoomID(roomID string) ([]string, error) { return d.statements.selectAliasesFromRoomID(roomID) } +// GetAliasesFromRoomIDs returns a map of the aliases bound to a given set of +// room IDs, ordered by room ID (ie map[roomID] = []alias) +// Returns an error if the retrieval failed +func (d *Database) GetAliasesFromRoomIDs(roomIDs []string) (map[string][]string, error) { + return d.statements.selectAliasesFromRoomIDs(roomIDs) +} + // RemoveRoomAlias implements alias.RoomserverAliasAPIDB func (d *Database) RemoveRoomAlias(alias string) error { return d.statements.deleteRoomAlias(alias)