migrations.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package migrations
  2. import (
  3. "database/sql"
  4. "embed"
  5. "github.com/lopezator/migrator"
  6. log "maunium.net/go/maulogger/v2"
  7. "maunium.net/go/mautrix/crypto/sql_store_upgrade"
  8. )
  9. //go:embed *.sql
  10. var embeddedMigrations embed.FS
  11. func migrationFromFile(description, filename string) *migrator.Migration {
  12. return &migrator.Migration{
  13. Name: description,
  14. Func: func(tx *sql.Tx) error {
  15. data, err := embeddedMigrations.ReadFile(filename)
  16. if err != nil {
  17. return err
  18. }
  19. if _, err := tx.Exec(string(data)); err != nil {
  20. return err
  21. }
  22. return nil
  23. },
  24. }
  25. }
  26. func migrationFromFileWithDialect(dialect, description, sqliteFile, postgresFile string) *migrator.Migration {
  27. switch dialect {
  28. case "sqlite3":
  29. return migrationFromFile(description, sqliteFile)
  30. case "postgres":
  31. return migrationFromFile(description, postgresFile)
  32. default:
  33. return nil
  34. }
  35. }
  36. func Run(db *sql.DB, baseLog log.Logger, dialect string) error {
  37. subLogger := baseLog.Sub("Migrations")
  38. logger := migrator.LoggerFunc(func(msg string, args ...interface{}) {
  39. subLogger.Infof(msg, args...)
  40. })
  41. m, err := migrator.New(
  42. migrator.TableName("version"),
  43. migrator.WithLogger(logger),
  44. migrator.Migrations(
  45. migrationFromFile("Initial Schema", "01-initial.sql"),
  46. migrationFromFile("Attachments", "02-attachments.sql"),
  47. migrationFromFile("Emoji", "03-emoji.sql"),
  48. migrationFromFile("Custom Puppets", "04-custom-puppet.sql"),
  49. migrationFromFile(
  50. "Additional puppet fields",
  51. "05-additional-puppet-fields.sql",
  52. ),
  53. migrationFromFileWithDialect(
  54. dialect,
  55. "Remove unique user constraint",
  56. "06-remove-unique-user-constraint.sqlite.sql",
  57. "06-remove-unique-user-constraint.postgres.sql",
  58. ),
  59. migrationFromFile("Guild Bridging", "07-guilds.sql"),
  60. &migrator.Migration{
  61. Name: "Add crypto store to database",
  62. Func: func(tx *sql.Tx) error {
  63. return sql_store_upgrade.Upgrades[0](tx, dialect)
  64. },
  65. },
  66. &migrator.Migration{
  67. Name: "Add account_id to crypto store",
  68. Func: func(tx *sql.Tx) error {
  69. return sql_store_upgrade.Upgrades[1](tx, dialect)
  70. },
  71. },
  72. &migrator.Migration{
  73. Name: "Add megolm withheld data to crypto store",
  74. Func: func(tx *sql.Tx) error {
  75. return sql_store_upgrade.Upgrades[2](tx, dialect)
  76. },
  77. },
  78. &migrator.Migration{
  79. Name: "Add cross-signing keys to crypto store",
  80. Func: func(tx *sql.Tx) error {
  81. return sql_store_upgrade.Upgrades[3](tx, dialect)
  82. },
  83. },
  84. &migrator.Migration{
  85. Name: "Replace VARCHAR(255) with TEXT in the crypto database",
  86. Func: func(tx *sql.Tx) error {
  87. return sql_store_upgrade.Upgrades[4](tx, dialect)
  88. },
  89. },
  90. &migrator.Migration{
  91. Name: "Split last_used into last_encrypted and last_decrypted in crypto store",
  92. Func: func(tx *sql.Tx) error {
  93. return sql_store_upgrade.Upgrades[5](tx, dialect)
  94. },
  95. },
  96. migrationFromFile(
  97. "Add encryption column to portal table",
  98. "14-add-encrypted-column-to-portal-table.sql",
  99. ),
  100. ),
  101. )
  102. if err != nil {
  103. return err
  104. }
  105. if err := m.Migrate(db); err != nil {
  106. return err
  107. }
  108. return nil
  109. }