From 320a8f6f187e44bcb3aaf5d35d56a127303a7851 Mon Sep 17 00:00:00 2001 From: Till Faelligen Date: Fri, 8 Apr 2022 18:12:38 +0200 Subject: [PATCH] Fix issues; Use prepareWithFilters --- syncapi/storage/sqlite3/account_data_table.go | 39 +++++++------------ syncapi/storage/sqlite3/filtering.go | 8 ++++ 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/syncapi/storage/sqlite3/account_data_table.go b/syncapi/storage/sqlite3/account_data_table.go index fd31cd558..2226b7e5f 100644 --- a/syncapi/storage/sqlite3/account_data_table.go +++ b/syncapi/storage/sqlite3/account_data_table.go @@ -41,10 +41,10 @@ const insertAccountDataSQL = "" + " ON CONFLICT (user_id, room_id, type) DO UPDATE" + " SET id = $5" +// further parameters are added by prepareWithFilters const selectAccountDataInRangeSQL = "" + "SELECT room_id, type FROM syncapi_account_data_type" + - " WHERE user_id = $1 AND id > $2 AND id <= $3" + - " ORDER BY id ASC" + " WHERE user_id = $1 AND id > $2 AND id <= $3" const selectMaxAccountDataIDSQL = "" + "SELECT MAX(id) FROM syncapi_account_data_type" @@ -94,18 +94,25 @@ func (s *accountDataStatements) SelectAccountDataInRange( ctx context.Context, userID string, r types.Range, - accountDataFilterPart *gomatrixserverlib.EventFilter, + filter *gomatrixserverlib.EventFilter, ) (data map[string][]string, err error) { data = make(map[string][]string) + stmt, params, err := prepareWithFilters( + s.db, nil, selectAccountDataInRangeSQL, + []interface{}{ + userID, r.Low(), r.High(), + }, + filter.Senders, filter.NotSenders, + filter.Types, filter.NotTypes, + []string{}, filter.Limit, FilterOrderAsc, + ) - rows, err := s.selectAccountDataInRangeStmt.QueryContext(ctx, userID, r.Low(), r.High()) + rows, err := stmt.QueryContext(ctx, params...) if err != nil { return } defer internal.CloseAndLogIfError(ctx, rows, "selectAccountDataInRange: rows.close() failed") - var entries int - for rows.Next() { var dataType string var roomID string @@ -114,31 +121,11 @@ func (s *accountDataStatements) SelectAccountDataInRange( return } - // check if we should add this by looking at the filter. - // It would be nice if we could do this in SQL-land, but the mix of variadic - // and positional parameters makes the query annoyingly hard to do, it's easier - // and clearer to do it in Go-land. If there are no filters for [not]types then - // this gets skipped. - for _, includeType := range *accountDataFilterPart.Types { - if includeType != dataType { // TODO: wildcard support - continue - } - } - for _, excludeType := range *accountDataFilterPart.NotTypes { - if excludeType == dataType { // TODO: wildcard support - continue - } - } - if len(data[roomID]) > 0 { data[roomID] = append(data[roomID], dataType) } else { data[roomID] = []string{dataType} } - entries++ - if entries >= accountDataFilterPart.Limit { - break - } } return data, nil diff --git a/syncapi/storage/sqlite3/filtering.go b/syncapi/storage/sqlite3/filtering.go index 1a4cd9a86..54b12ddf8 100644 --- a/syncapi/storage/sqlite3/filtering.go +++ b/syncapi/storage/sqlite3/filtering.go @@ -35,6 +35,8 @@ func prepareWithFilters( for _, v := range *senders { params, offset = append(params, v), offset+1 } + } else { + query += ` AND sender = ""` } } if notsenders != nil { @@ -43,6 +45,8 @@ func prepareWithFilters( for _, v := range *notsenders { params, offset = append(params, v), offset+1 } + } else { + query += ` AND sender NOT = ""` } } if types != nil { @@ -51,6 +55,8 @@ func prepareWithFilters( for _, v := range *types { params, offset = append(params, v), offset+1 } + } else { + query += ` AND type = ""` } } if nottypes != nil { @@ -59,6 +65,8 @@ func prepareWithFilters( for _, v := range *nottypes { params, offset = append(params, v), offset+1 } + } else { + query += ` AND type NOT = ""` } } if count := len(excludeEventIDs); count > 0 {