Add function for batch aliases retrieval

This commit is contained in:
Brendan Abolivier 2017-08-08 15:41:26 +01:00
parent 9e772402d4
commit 706be4edb6
No known key found for this signature in database
GPG key ID: 8EF1500759F70623
2 changed files with 39 additions and 4 deletions

View file

@ -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

View file

@ -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)