Separate migrations
This commit is contained in:
parent
d27bcca3e9
commit
40122b5423
|
@ -34,26 +34,6 @@ func UpServerNames(ctx context.Context, tx *sql.Tx, serverName gomatrixserverlib
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
if _, err := tx.ExecContext(ctx, q); err != nil {
|
||||||
return fmt.Errorf("add server name to %q error: %w", table, err)
|
return fmt.Errorf("add server name to %q error: %w", table, err)
|
||||||
}
|
}
|
||||||
q = fmt.Sprintf(
|
|
||||||
"UPDATE %s SET server_name = %s WHERE server_name = '';",
|
|
||||||
pq.QuoteIdentifier(table), pq.QuoteLiteral(string(serverName)),
|
|
||||||
)
|
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
|
||||||
return fmt.Errorf("write server names to %q error: %w", table, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func DownServerNames(ctx context.Context, tx *sql.Tx) error {
|
|
||||||
for _, table := range serverNamesTables {
|
|
||||||
q := fmt.Sprintf(
|
|
||||||
"ALTER TABLE IF EXISTS %s DELETE COLUMN server_name;",
|
|
||||||
pq.QuoteIdentifier(table),
|
|
||||||
)
|
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
|
||||||
return fmt.Errorf("remove server name from %q error: %w", table, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package deltas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/lib/pq"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
// I know what you're thinking: you're wondering "why doesn't this use $1
|
||||||
|
// and pass variadic parameters to ExecContext?" — the answer is because
|
||||||
|
// PostgreSQL doesn't expect the table name to be specified as a substituted
|
||||||
|
// argument in that way so it results in a syntax error in the query.
|
||||||
|
|
||||||
|
func UpServerNamesPopulate(ctx context.Context, tx *sql.Tx, serverName gomatrixserverlib.ServerName) error {
|
||||||
|
for _, table := range serverNamesTables {
|
||||||
|
q := fmt.Sprintf(
|
||||||
|
"UPDATE %s SET server_name = %s WHERE server_name = '';",
|
||||||
|
pq.QuoteIdentifier(table), pq.QuoteLiteral(string(serverName)),
|
||||||
|
)
|
||||||
|
if _, err := tx.ExecContext(ctx, q); err != nil {
|
||||||
|
return fmt.Errorf("write server names to %q error: %w", table, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -45,6 +45,12 @@ func NewDatabase(base *base.BaseDendrite, dbProperties *config.DatabaseOptions,
|
||||||
Up: deltas.UpRenameTables,
|
Up: deltas.UpRenameTables,
|
||||||
Down: deltas.DownRenameTables,
|
Down: deltas.DownRenameTables,
|
||||||
})
|
})
|
||||||
|
m.AddMigrations(sqlutil.Migration{
|
||||||
|
Version: "userapi: server names",
|
||||||
|
Up: func(ctx context.Context, txn *sql.Tx) error {
|
||||||
|
return deltas.UpServerNames(ctx, txn, serverName)
|
||||||
|
},
|
||||||
|
})
|
||||||
if err = m.Up(base.Context()); err != nil {
|
if err = m.Up(base.Context()); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -100,11 +106,10 @@ func NewDatabase(base *base.BaseDendrite, dbProperties *config.DatabaseOptions,
|
||||||
|
|
||||||
m = sqlutil.NewMigrator(db)
|
m = sqlutil.NewMigrator(db)
|
||||||
m.AddMigrations(sqlutil.Migration{
|
m.AddMigrations(sqlutil.Migration{
|
||||||
Version: "userapi: server names",
|
Version: "userapi: server names populate",
|
||||||
Up: func(ctx context.Context, txn *sql.Tx) error {
|
Up: func(ctx context.Context, txn *sql.Tx) error {
|
||||||
return deltas.UpServerNames(ctx, txn, serverName)
|
return deltas.UpServerNamesPopulate(ctx, txn, serverName)
|
||||||
},
|
},
|
||||||
Down: deltas.DownServerNames,
|
|
||||||
})
|
})
|
||||||
if err = m.Up(base.Context()); err != nil {
|
if err = m.Up(base.Context()); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -42,26 +42,6 @@ func UpServerNames(ctx context.Context, tx *sql.Tx, serverName gomatrixserverlib
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
if _, err := tx.ExecContext(ctx, q); err != nil {
|
||||||
return fmt.Errorf("add server name to %q error: %w", table, err)
|
return fmt.Errorf("add server name to %q error: %w", table, err)
|
||||||
}
|
}
|
||||||
q = fmt.Sprintf(
|
|
||||||
"UPDATE %s SET server_name = %s WHERE server_name = '';",
|
|
||||||
pq.QuoteIdentifier(table), pq.QuoteLiteral(string(serverName)),
|
|
||||||
)
|
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
|
||||||
return fmt.Errorf("write server names to %q error: %w", table, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func DownServerNames(ctx context.Context, tx *sql.Tx) error {
|
|
||||||
for _, table := range serverNamesTables {
|
|
||||||
q := fmt.Sprintf(
|
|
||||||
"ALTER TABLE %s DELETE COLUMN server_name;",
|
|
||||||
pq.QuoteIdentifier(table),
|
|
||||||
)
|
|
||||||
if _, err := tx.ExecContext(ctx, q); err != nil {
|
|
||||||
return fmt.Errorf("remove server name from %q error: %w", table, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package deltas
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/lib/pq"
|
||||||
|
"github.com/matrix-org/gomatrixserverlib"
|
||||||
|
)
|
||||||
|
|
||||||
|
// I know what you're thinking: you're wondering "why doesn't this use $1
|
||||||
|
// and pass variadic parameters to ExecContext?" — the answer is because
|
||||||
|
// PostgreSQL doesn't expect the table name to be specified as a substituted
|
||||||
|
// argument in that way so it results in a syntax error in the query.
|
||||||
|
|
||||||
|
func UpServerNamesPopulate(ctx context.Context, tx *sql.Tx, serverName gomatrixserverlib.ServerName) error {
|
||||||
|
for _, table := range serverNamesTables {
|
||||||
|
q := fmt.Sprintf(
|
||||||
|
"SELECT name FROM sqlite_schema WHERE type='table' AND name=%s;",
|
||||||
|
pq.QuoteIdentifier(table),
|
||||||
|
)
|
||||||
|
var c int
|
||||||
|
if err := tx.QueryRowContext(ctx, q).Scan(&c); err != nil || c == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
q = fmt.Sprintf(
|
||||||
|
"UPDATE %s SET server_name = %s WHERE server_name = '';",
|
||||||
|
pq.QuoteIdentifier(table), pq.QuoteLiteral(string(serverName)),
|
||||||
|
)
|
||||||
|
if _, err := tx.ExecContext(ctx, q); err != nil {
|
||||||
|
return fmt.Errorf("write server names to %q error: %w", table, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -43,6 +43,12 @@ func NewDatabase(base *base.BaseDendrite, dbProperties *config.DatabaseOptions,
|
||||||
Up: deltas.UpRenameTables,
|
Up: deltas.UpRenameTables,
|
||||||
Down: deltas.DownRenameTables,
|
Down: deltas.DownRenameTables,
|
||||||
})
|
})
|
||||||
|
m.AddMigrations(sqlutil.Migration{
|
||||||
|
Version: "userapi: server names",
|
||||||
|
Up: func(ctx context.Context, txn *sql.Tx) error {
|
||||||
|
return deltas.UpServerNames(ctx, txn, serverName)
|
||||||
|
},
|
||||||
|
})
|
||||||
if err = m.Up(base.Context()); err != nil {
|
if err = m.Up(base.Context()); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -98,11 +104,10 @@ func NewDatabase(base *base.BaseDendrite, dbProperties *config.DatabaseOptions,
|
||||||
|
|
||||||
m = sqlutil.NewMigrator(db)
|
m = sqlutil.NewMigrator(db)
|
||||||
m.AddMigrations(sqlutil.Migration{
|
m.AddMigrations(sqlutil.Migration{
|
||||||
Version: "userapi: server names",
|
Version: "userapi: server names populate",
|
||||||
Up: func(ctx context.Context, txn *sql.Tx) error {
|
Up: func(ctx context.Context, txn *sql.Tx) error {
|
||||||
return deltas.UpServerNames(ctx, txn, serverName)
|
return deltas.UpServerNamesPopulate(ctx, txn, serverName)
|
||||||
},
|
},
|
||||||
Down: deltas.DownServerNames,
|
|
||||||
})
|
})
|
||||||
if err = m.Up(base.Context()); err != nil {
|
if err = m.Up(base.Context()); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
Loading…
Reference in a new issue