aboutsummaryrefslogtreecommitdiff
path: root/roomserver/storage/sqlite3
diff options
context:
space:
mode:
Diffstat (limited to 'roomserver/storage/sqlite3')
-rw-r--r--roomserver/storage/sqlite3/events_table.go4
-rw-r--r--roomserver/storage/sqlite3/room_aliases_table.go6
-rw-r--r--roomserver/storage/sqlite3/rooms_table.go16
-rw-r--r--roomserver/storage/sqlite3/state_block_table.go49
-rw-r--r--roomserver/storage/sqlite3/state_block_table_test.go86
-rw-r--r--roomserver/storage/sqlite3/state_snapshot_table.go10
-rw-r--r--roomserver/storage/sqlite3/storage.go16
7 files changed, 33 insertions, 154 deletions
diff --git a/roomserver/storage/sqlite3/events_table.go b/roomserver/storage/sqlite3/events_table.go
index feb06150..1dda34c3 100644
--- a/roomserver/storage/sqlite3/events_table.go
+++ b/roomserver/storage/sqlite3/events_table.go
@@ -247,9 +247,9 @@ func (s *eventStatements) BulkSelectStateEventByNID(
ctx context.Context, txn *sql.Tx, eventNIDs []types.EventNID,
stateKeyTuples []types.StateKeyTuple,
) ([]types.StateEntry, error) {
- tuples := stateKeyTupleSorter(stateKeyTuples)
+ tuples := types.StateKeyTupleSorter(stateKeyTuples)
sort.Sort(tuples)
- eventTypeNIDArray, eventStateKeyNIDArray := tuples.typesAndStateKeysAsArrays()
+ eventTypeNIDArray, eventStateKeyNIDArray := tuples.TypesAndStateKeysAsArrays()
params := make([]interface{}, 0, len(eventNIDs)+len(eventTypeNIDArray)+len(eventStateKeyNIDArray))
selectOrig := strings.Replace(bulkSelectStateEventByNIDSQL, "($1)", sqlutil.QueryVariadic(len(eventNIDs)), 1)
for _, v := range eventNIDs {
diff --git a/roomserver/storage/sqlite3/room_aliases_table.go b/roomserver/storage/sqlite3/room_aliases_table.go
index 7c7bead9..3bdbbaa3 100644
--- a/roomserver/storage/sqlite3/room_aliases_table.go
+++ b/roomserver/storage/sqlite3/room_aliases_table.go
@@ -63,12 +63,12 @@ type roomAliasesStatements struct {
deleteRoomAliasStmt *sql.Stmt
}
-func createRoomAliasesTable(db *sql.DB) error {
+func CreateRoomAliasesTable(db *sql.DB) error {
_, err := db.Exec(roomAliasesSchema)
return err
}
-func prepareRoomAliasesTable(db *sql.DB) (tables.RoomAliases, error) {
+func PrepareRoomAliasesTable(db *sql.DB) (tables.RoomAliases, error) {
s := &roomAliasesStatements{
db: db,
}
@@ -113,8 +113,8 @@ func (s *roomAliasesStatements) SelectAliasesFromRoomID(
defer internal.CloseAndLogIfError(ctx, rows, "selectAliasesFromRoomID: rows.close() failed")
+ var alias string
for rows.Next() {
- var alias string
if err = rows.Scan(&alias); err != nil {
return
}
diff --git a/roomserver/storage/sqlite3/rooms_table.go b/roomserver/storage/sqlite3/rooms_table.go
index cd60c678..03ad4b3d 100644
--- a/roomserver/storage/sqlite3/rooms_table.go
+++ b/roomserver/storage/sqlite3/rooms_table.go
@@ -86,12 +86,12 @@ type roomStatements struct {
selectRoomIDsStmt *sql.Stmt
}
-func createRoomsTable(db *sql.DB) error {
+func CreateRoomsTable(db *sql.DB) error {
_, err := db.Exec(roomsSchema)
return err
}
-func prepareRoomsTable(db *sql.DB) (tables.Rooms, error) {
+func PrepareRoomsTable(db *sql.DB) (tables.Rooms, error) {
s := &roomStatements{
db: db,
}
@@ -108,7 +108,7 @@ func prepareRoomsTable(db *sql.DB) (tables.Rooms, error) {
}.Prepare(db)
}
-func (s *roomStatements) SelectRoomIDs(ctx context.Context, txn *sql.Tx) ([]string, error) {
+func (s *roomStatements) SelectRoomIDsWithEvents(ctx context.Context, txn *sql.Tx) ([]string, error) {
stmt := sqlutil.TxStmt(txn, s.selectRoomIDsStmt)
rows, err := stmt.QueryContext(ctx)
if err != nil {
@@ -116,8 +116,8 @@ func (s *roomStatements) SelectRoomIDs(ctx context.Context, txn *sql.Tx) ([]stri
}
defer internal.CloseAndLogIfError(ctx, rows, "selectRoomIDsStmt: rows.close() failed")
var roomIDs []string
+ var roomID string
for rows.Next() {
- var roomID string
if err = rows.Scan(&roomID); err != nil {
return nil, err
}
@@ -241,9 +241,9 @@ func (s *roomStatements) SelectRoomVersionsForRoomNIDs(
}
defer internal.CloseAndLogIfError(ctx, rows, "selectRoomVersionsForRoomNIDsStmt: rows.close() failed")
result := make(map[types.RoomNID]gomatrixserverlib.RoomVersion)
+ var roomNID types.RoomNID
+ var roomVersion gomatrixserverlib.RoomVersion
for rows.Next() {
- var roomNID types.RoomNID
- var roomVersion gomatrixserverlib.RoomVersion
if err = rows.Scan(&roomNID, &roomVersion); err != nil {
return nil, err
}
@@ -270,8 +270,8 @@ func (s *roomStatements) BulkSelectRoomIDs(ctx context.Context, txn *sql.Tx, roo
}
defer internal.CloseAndLogIfError(ctx, rows, "bulkSelectRoomIDsStmt: rows.close() failed")
var roomIDs []string
+ var roomID string
for rows.Next() {
- var roomID string
if err = rows.Scan(&roomID); err != nil {
return nil, err
}
@@ -298,8 +298,8 @@ func (s *roomStatements) BulkSelectRoomNIDs(ctx context.Context, txn *sql.Tx, ro
}
defer internal.CloseAndLogIfError(ctx, rows, "bulkSelectRoomNIDsStmt: rows.close() failed")
var roomNIDs []types.RoomNID
+ var roomNID types.RoomNID
for rows.Next() {
- var roomNID types.RoomNID
if err = rows.Scan(&roomNID); err != nil {
return nil, err
}
diff --git a/roomserver/storage/sqlite3/state_block_table.go b/roomserver/storage/sqlite3/state_block_table.go
index 3c829cdc..4e67d4da 100644
--- a/roomserver/storage/sqlite3/state_block_table.go
+++ b/roomserver/storage/sqlite3/state_block_table.go
@@ -20,7 +20,6 @@ import (
"database/sql"
"encoding/json"
"fmt"
- "sort"
"strings"
"github.com/matrix-org/dendrite/internal"
@@ -64,12 +63,12 @@ type stateBlockStatements struct {
bulkSelectStateBlockEntriesStmt *sql.Stmt
}
-func createStateBlockTable(db *sql.DB) error {
+func CreateStateBlockTable(db *sql.DB) error {
_, err := db.Exec(stateDataSchema)
return err
}
-func prepareStateBlockTable(db *sql.DB) (tables.StateBlock, error) {
+func PrepareStateBlockTable(db *sql.DB) (tables.StateBlock, error) {
s := &stateBlockStatements{
db: db,
}
@@ -85,9 +84,9 @@ func (s *stateBlockStatements) BulkInsertStateData(
entries types.StateEntries,
) (id types.StateBlockNID, err error) {
entries = entries[:util.SortAndUnique(entries)]
- nids := types.EventNIDs{} // zero slice to not store 'null' in the DB
- for _, e := range entries {
- nids = append(nids, e.EventNID)
+ nids := make(types.EventNIDs, entries.Len())
+ for i := range entries {
+ nids[i] = entries[i].EventNID
}
js, err := json.Marshal(nids)
if err != nil {
@@ -122,13 +121,13 @@ func (s *stateBlockStatements) BulkSelectStateBlockEntries(
results := make([][]types.EventNID, len(stateBlockNIDs))
i := 0
+ var stateBlockNID types.StateBlockNID
+ var result json.RawMessage
for ; rows.Next(); i++ {
- var stateBlockNID types.StateBlockNID
- var result json.RawMessage
if err = rows.Scan(&stateBlockNID, &result); err != nil {
return nil, err
}
- r := []types.EventNID{}
+ var r []types.EventNID
if err = json.Unmarshal(result, &r); err != nil {
return nil, fmt.Errorf("json.Unmarshal: %w", err)
}
@@ -142,35 +141,3 @@ func (s *stateBlockStatements) BulkSelectStateBlockEntries(
}
return results, err
}
-
-type stateKeyTupleSorter []types.StateKeyTuple
-
-func (s stateKeyTupleSorter) Len() int { return len(s) }
-func (s stateKeyTupleSorter) Less(i, j int) bool { return s[i].LessThan(s[j]) }
-func (s stateKeyTupleSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
-
-// Check whether a tuple is in the list. Assumes that the list is sorted.
-func (s stateKeyTupleSorter) contains(value types.StateKeyTuple) bool {
- i := sort.Search(len(s), func(i int) bool { return !s[i].LessThan(value) })
- return i < len(s) && s[i] == value
-}
-
-// List the unique eventTypeNIDs and eventStateKeyNIDs.
-// Assumes that the list is sorted.
-func (s stateKeyTupleSorter) typesAndStateKeysAsArrays() (eventTypeNIDs []int64, eventStateKeyNIDs []int64) {
- eventTypeNIDs = make([]int64, len(s))
- eventStateKeyNIDs = make([]int64, len(s))
- for i := range s {
- eventTypeNIDs[i] = int64(s[i].EventTypeNID)
- eventStateKeyNIDs[i] = int64(s[i].EventStateKeyNID)
- }
- eventTypeNIDs = eventTypeNIDs[:util.SortAndUnique(int64Sorter(eventTypeNIDs))]
- eventStateKeyNIDs = eventStateKeyNIDs[:util.SortAndUnique(int64Sorter(eventStateKeyNIDs))]
- return
-}
-
-type int64Sorter []int64
-
-func (s int64Sorter) Len() int { return len(s) }
-func (s int64Sorter) Less(i, j int) bool { return s[i] < s[j] }
-func (s int64Sorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
diff --git a/roomserver/storage/sqlite3/state_block_table_test.go b/roomserver/storage/sqlite3/state_block_table_test.go
deleted file mode 100644
index 98439f5c..00000000
--- a/roomserver/storage/sqlite3/state_block_table_test.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2017-2018 New Vector Ltd
-// Copyright 2019-2020 The Matrix.org Foundation C.I.C.
-//
-// 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.
-
-package sqlite3
-
-import (
- "sort"
- "testing"
-
- "github.com/matrix-org/dendrite/roomserver/types"
-)
-
-func TestStateKeyTupleSorter(t *testing.T) {
- input := stateKeyTupleSorter{
- {EventTypeNID: 1, EventStateKeyNID: 2},
- {EventTypeNID: 1, EventStateKeyNID: 4},
- {EventTypeNID: 2, EventStateKeyNID: 2},
- {EventTypeNID: 1, EventStateKeyNID: 1},
- }
- want := []types.StateKeyTuple{
- {EventTypeNID: 1, EventStateKeyNID: 1},
- {EventTypeNID: 1, EventStateKeyNID: 2},
- {EventTypeNID: 1, EventStateKeyNID: 4},
- {EventTypeNID: 2, EventStateKeyNID: 2},
- }
- doNotWant := []types.StateKeyTuple{
- {EventTypeNID: 0, EventStateKeyNID: 0},
- {EventTypeNID: 1, EventStateKeyNID: 3},
- {EventTypeNID: 2, EventStateKeyNID: 1},
- {EventTypeNID: 3, EventStateKeyNID: 1},
- }
- wantTypeNIDs := []int64{1, 2}
- wantStateKeyNIDs := []int64{1, 2, 4}
-
- // Sort the input and check it's in the right order.
- sort.Sort(input)
- gotTypeNIDs, gotStateKeyNIDs := input.typesAndStateKeysAsArrays()
-
- for i := range want {
- if input[i] != want[i] {
- t.Errorf("Wanted %#v at index %d got %#v", want[i], i, input[i])
- }
-
- if !input.contains(want[i]) {
- t.Errorf("Wanted %#v.contains(%#v) to be true but got false", input, want[i])
- }
- }
-
- for i := range doNotWant {
- if input.contains(doNotWant[i]) {
- t.Errorf("Wanted %#v.contains(%#v) to be false but got true", input, doNotWant[i])
- }
- }
-
- if len(wantTypeNIDs) != len(gotTypeNIDs) {
- t.Fatalf("Wanted type NIDs %#v got %#v", wantTypeNIDs, gotTypeNIDs)
- }
-
- for i := range wantTypeNIDs {
- if wantTypeNIDs[i] != gotTypeNIDs[i] {
- t.Fatalf("Wanted type NIDs %#v got %#v", wantTypeNIDs, gotTypeNIDs)
- }
- }
-
- if len(wantStateKeyNIDs) != len(gotStateKeyNIDs) {
- t.Fatalf("Wanted state key NIDs %#v got %#v", wantStateKeyNIDs, gotStateKeyNIDs)
- }
-
- for i := range wantStateKeyNIDs {
- if wantStateKeyNIDs[i] != gotStateKeyNIDs[i] {
- t.Fatalf("Wanted type NIDs %#v got %#v", wantTypeNIDs, gotTypeNIDs)
- }
- }
-}
diff --git a/roomserver/storage/sqlite3/state_snapshot_table.go b/roomserver/storage/sqlite3/state_snapshot_table.go
index 1f5e9ee3..b8136b75 100644
--- a/roomserver/storage/sqlite3/state_snapshot_table.go
+++ b/roomserver/storage/sqlite3/state_snapshot_table.go
@@ -68,12 +68,12 @@ type stateSnapshotStatements struct {
bulkSelectStateBlockNIDsStmt *sql.Stmt
}
-func createStateSnapshotTable(db *sql.DB) error {
+func CreateStateSnapshotTable(db *sql.DB) error {
_, err := db.Exec(stateSnapshotSchema)
return err
}
-func prepareStateSnapshotTable(db *sql.DB) (tables.StateSnapshot, error) {
+func PrepareStateSnapshotTable(db *sql.DB) (tables.StateSnapshot, error) {
s := &stateSnapshotStatements{
db: db,
}
@@ -96,12 +96,10 @@ func (s *stateSnapshotStatements) InsertState(
return
}
insertStmt := sqlutil.TxStmt(txn, s.insertStateStmt)
- var id int64
- err = insertStmt.QueryRowContext(ctx, stateBlockNIDs.Hash(), int64(roomNID), string(stateBlockNIDsJSON)).Scan(&id)
+ err = insertStmt.QueryRowContext(ctx, stateBlockNIDs.Hash(), int64(roomNID), string(stateBlockNIDsJSON)).Scan(&stateNID)
if err != nil {
return 0, err
}
- stateNID = types.StateSnapshotNID(id)
return
}
@@ -127,9 +125,9 @@ func (s *stateSnapshotStatements) BulkSelectStateBlockNIDs(
defer internal.CloseAndLogIfError(ctx, rows, "bulkSelectStateBlockNIDs: rows.close() failed")
results := make([]types.StateBlockNIDList, len(stateNIDs))
i := 0
+ var stateBlockNIDsJSON string
for ; rows.Next(); i++ {
result := &results[i]
- var stateBlockNIDsJSON string
if err := rows.Scan(&result.StateSnapshotNID, &stateBlockNIDsJSON); err != nil {
return nil, err
}
diff --git a/roomserver/storage/sqlite3/storage.go b/roomserver/storage/sqlite3/storage.go
index a4e32d52..8325fdad 100644
--- a/roomserver/storage/sqlite3/storage.go
+++ b/roomserver/storage/sqlite3/storage.go
@@ -89,19 +89,19 @@ func (d *Database) create(db *sql.DB) error {
if err := CreateEventsTable(db); err != nil {
return err
}
- if err := createRoomsTable(db); err != nil {
+ if err := CreateRoomsTable(db); err != nil {
return err
}
- if err := createStateBlockTable(db); err != nil {
+ if err := CreateStateBlockTable(db); err != nil {
return err
}
- if err := createStateSnapshotTable(db); err != nil {
+ if err := CreateStateSnapshotTable(db); err != nil {
return err
}
if err := CreatePrevEventsTable(db); err != nil {
return err
}
- if err := createRoomAliasesTable(db); err != nil {
+ if err := CreateRoomAliasesTable(db); err != nil {
return err
}
if err := CreateInvitesTable(db); err != nil {
@@ -137,15 +137,15 @@ func (d *Database) prepare(db *sql.DB, writer sqlutil.Writer, cache caching.Room
if err != nil {
return err
}
- rooms, err := prepareRoomsTable(db)
+ rooms, err := PrepareRoomsTable(db)
if err != nil {
return err
}
- stateBlock, err := prepareStateBlockTable(db)
+ stateBlock, err := PrepareStateBlockTable(db)
if err != nil {
return err
}
- stateSnapshot, err := prepareStateSnapshotTable(db)
+ stateSnapshot, err := PrepareStateSnapshotTable(db)
if err != nil {
return err
}
@@ -153,7 +153,7 @@ func (d *Database) prepare(db *sql.DB, writer sqlutil.Writer, cache caching.Room
if err != nil {
return err
}
- roomAliases, err := prepareRoomAliasesTable(db)
+ roomAliases, err := PrepareRoomAliasesTable(db)
if err != nil {
return err
}