Try to get room version from m.room.create event at first NID assign

This commit is contained in:
Neil Alexander 2020-02-26 17:40:17 +00:00
parent 892180cb2c
commit 15f9672c7d
4 changed files with 36 additions and 14 deletions

View file

@ -49,7 +49,7 @@ CREATE TABLE IF NOT EXISTS roomserver_rooms (
// Same as insertEventTypeNIDSQL // Same as insertEventTypeNIDSQL
const insertRoomNIDSQL = "" + const insertRoomNIDSQL = "" +
"INSERT INTO roomserver_rooms (room_id) VALUES ($1)" + "INSERT INTO roomserver_rooms (room_id, room_version) VALUES ($1, $2)" +
" ON CONFLICT ON CONSTRAINT roomserver_room_id_unique" + " ON CONFLICT ON CONSTRAINT roomserver_room_id_unique" +
" DO NOTHING RETURNING (room_nid)" " DO NOTHING RETURNING (room_nid)"
@ -93,11 +93,11 @@ func (s *roomStatements) prepare(db *sql.DB) (err error) {
} }
func (s *roomStatements) insertRoomNID( func (s *roomStatements) insertRoomNID(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string, roomVersion string,
) (types.RoomNID, error) { ) (types.RoomNID, error) {
var roomNID int64 var roomNID int64
stmt := common.TxStmt(txn, s.insertRoomNIDStmt) stmt := common.TxStmt(txn, s.insertRoomNIDStmt)
err := stmt.QueryRowContext(ctx, roomID).Scan(&roomNID) err := stmt.QueryRowContext(ctx, roomID, roomVersion).Scan(&roomNID)
return types.RoomNID(roomNID), err return types.RoomNID(roomNID), err
} }

View file

@ -18,6 +18,7 @@ package postgres
import ( import (
"context" "context"
"database/sql" "database/sql"
"encoding/json"
// Import the postgres database driver. // Import the postgres database driver.
_ "github.com/lib/pq" _ "github.com/lib/pq"
@ -70,7 +71,17 @@ func (d *Database) StoreEvent(
} }
} }
if roomNID, err = d.assignRoomNID(ctx, nil, event.RoomID()); err != nil { roomVersion := ""
if event.Type() == gomatrixserverlib.MRoomCreate {
var createContent gomatrixserverlib.CreateContent
if err := json.Unmarshal(event.Content(), createContent); err == nil {
if createContent.RoomVersion != nil {
roomVersion = *createContent.RoomVersion
}
}
}
if roomNID, err = d.assignRoomNID(ctx, nil, event.RoomID(), roomVersion); err != nil {
return 0, types.StateAtEvent{}, err return 0, types.StateAtEvent{}, err
} }
@ -123,13 +134,13 @@ func (d *Database) StoreEvent(
} }
func (d *Database) assignRoomNID( func (d *Database) assignRoomNID(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string, roomVersion string,
) (types.RoomNID, error) { ) (types.RoomNID, error) {
// Check if we already have a numeric ID in the database. // Check if we already have a numeric ID in the database.
roomNID, err := d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err := d.statements.selectRoomNID(ctx, txn, roomID)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// We don't have a numeric ID so insert one into the database. // We don't have a numeric ID so insert one into the database.
roomNID, err = d.statements.insertRoomNID(ctx, txn, roomID) roomNID, err = d.statements.insertRoomNID(ctx, txn, roomID, roomVersion)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// We raced with another insert so run the select again. // We raced with another insert so run the select again.
roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID)
@ -516,7 +527,7 @@ func (d *Database) MembershipUpdater(
} }
}() }()
roomNID, err := d.assignRoomNID(ctx, txn, roomID) roomNID, err := d.assignRoomNID(ctx, txn, roomID, "")
if err != nil { if err != nil {
return nil, err return nil, err
} }

View file

@ -38,7 +38,7 @@ const roomsSchema = `
// Same as insertEventTypeNIDSQL // Same as insertEventTypeNIDSQL
const insertRoomNIDSQL = ` const insertRoomNIDSQL = `
INSERT INTO roomserver_rooms (room_id) VALUES ($1) INSERT INTO roomserver_rooms (room_id, room_version) VALUES ($1, $2)
ON CONFLICT DO NOTHING; ON CONFLICT DO NOTHING;
` `
@ -82,11 +82,11 @@ func (s *roomStatements) prepare(db *sql.DB) (err error) {
} }
func (s *roomStatements) insertRoomNID( func (s *roomStatements) insertRoomNID(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string, roomVersion string,
) (types.RoomNID, error) { ) (types.RoomNID, error) {
var err error var err error
insertStmt := common.TxStmt(txn, s.insertRoomNIDStmt) insertStmt := common.TxStmt(txn, s.insertRoomNIDStmt)
if _, err = insertStmt.ExecContext(ctx, roomID); err == nil { if _, err = insertStmt.ExecContext(ctx, roomID, roomVersion); err == nil {
return s.selectRoomNID(ctx, txn, roomID) return s.selectRoomNID(ctx, txn, roomID)
} else { } else {
return types.RoomNID(0), err return types.RoomNID(0), err

View file

@ -18,6 +18,7 @@ package sqlite3
import ( import (
"context" "context"
"database/sql" "database/sql"
"encoding/json"
"errors" "errors"
"net/url" "net/url"
@ -91,7 +92,17 @@ func (d *Database) StoreEvent(
} }
} }
if roomNID, err = d.assignRoomNID(ctx, txn, event.RoomID()); err != nil { roomVersion := ""
if event.Type() == gomatrixserverlib.MRoomCreate {
var createContent gomatrixserverlib.CreateContent
if err := json.Unmarshal(event.Content(), createContent); err == nil {
if createContent.RoomVersion != nil {
roomVersion = *createContent.RoomVersion
}
}
}
if roomNID, err = d.assignRoomNID(ctx, txn, event.RoomID(), roomVersion); err != nil {
return err return err
} }
@ -151,13 +162,13 @@ func (d *Database) StoreEvent(
} }
func (d *Database) assignRoomNID( func (d *Database) assignRoomNID(
ctx context.Context, txn *sql.Tx, roomID string, ctx context.Context, txn *sql.Tx, roomID string, roomVersion string,
) (roomNID types.RoomNID, err error) { ) (roomNID types.RoomNID, err error) {
// Check if we already have a numeric ID in the database. // Check if we already have a numeric ID in the database.
roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
// We don't have a numeric ID so insert one into the database. // We don't have a numeric ID so insert one into the database.
roomNID, err = d.statements.insertRoomNID(ctx, txn, roomID) roomNID, err = d.statements.insertRoomNID(ctx, txn, roomID, roomVersion)
if err == nil { if err == nil {
// Now get the numeric ID back out of the database // Now get the numeric ID back out of the database
roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID)
@ -651,7 +662,7 @@ func (d *Database) MembershipUpdater(
} }
}() }()
roomNID, err := d.assignRoomNID(ctx, txn, roomID) roomNID, err := d.assignRoomNID(ctx, txn, roomID, "")
if err != nil { if err != nil {
return nil, err return nil, err
} }