1
0
mirror of https://github.com/muety/wakapi.git synced 2023-08-10 21:12:56 +03:00

fix: index migration for sqlite

This commit is contained in:
Ferdinand Mütsch 2022-10-28 10:32:47 +02:00
parent 9424c49760
commit 6e5bc38e5e

View File

@ -5,6 +5,8 @@ import (
"github.com/muety/wakapi/config" "github.com/muety/wakapi/config"
"github.com/muety/wakapi/models" "github.com/muety/wakapi/models"
"gorm.io/gorm" "gorm.io/gorm"
"regexp"
"strings"
) )
// due to an error in the model definition, idx_time_user used to only cover 'user_id', but not time column // due to an error in the model definition, idx_time_user used to only cover 'user_id', but not time column
@ -16,23 +18,51 @@ func init() {
f: func(db *gorm.DB, cfg *config.Config) error { f: func(db *gorm.DB, cfg *config.Config) error {
migrator := db.Migrator() migrator := db.Migrator()
indexes, err := migrator.GetIndexes(&models.Heartbeat{}) if !migrator.HasTable(&models.Heartbeat{}) {
if err != nil { return nil
return err
} }
for _, idx := range indexes { var drop bool
if idx.Table() == "heartbeats" && idx.Name() == "idx_time_user" { if cfg.Db.IsSQLite() {
if len(idx.Columns()) == 1 { // sqlite migrator doesn't support GetIndexes() currently
if err := migrator.DropIndex(&models.Heartbeat{}, "idx_time_user"); err != nil { var ddl string
return err if err := db.
} Table("sqlite_schema").
logbuch.Info("index 'idx_time_user' needs to be recreated, this may take a while") Select("sql").
return nil Where("type = 'index'").
Where("tbl_name = 'heartbeats'").
Where("name = 'idx_time_user'").
Scan(&ddl).Error; err != nil {
return err
}
matches := regexp.MustCompile("(?i)\\((.+)\\)$").FindStringSubmatch(ddl)
if len(matches) > 0 && !strings.Contains(matches[0], "`user_id`") || !strings.Contains(matches[0], "`time`") {
drop = true
}
} else {
indexes, err := migrator.GetIndexes(&models.Heartbeat{})
if err != nil {
return err
}
for _, idx := range indexes {
if idx.Table() == "heartbeats" && idx.Name() == "idx_time_user" && len(idx.Columns()) == 1 {
drop = true
break
} }
} }
} }
if !drop {
return nil
}
if err := migrator.DropIndex(&models.Heartbeat{}, "idx_time_user"); err != nil {
return err
}
logbuch.Info("index 'idx_time_user' needs to be recreated, this may take a while")
return nil return nil
}, },
} }