Fix blob inconsistency in mysql (#196)

By default gorm uses the type `varbinary(255)` for []byte in database models. 255 characters isn't enough for a plugin config therefore we use longblob instead.
This commit is contained in:
饺子w 2019-06-12 00:16:25 +08:00 committed by Jannis Mattheis
parent 05a1aa2651
commit 11e0a4b0df
1 changed files with 33 additions and 1 deletions

View File

@ -35,7 +35,14 @@ func New(dialect, connection, defaultUser, defaultPass string, strength int, cre
db.DB().SetMaxOpenConns(1) db.DB().SetMaxOpenConns(1)
} }
db.AutoMigrate(new(model.User), new(model.Application), new(model.Message), new(model.Client), new(model.PluginConf)) if err := db.AutoMigrate(new(model.User), new(model.Application), new(model.Message), new(model.Client), new(model.PluginConf)).Error; err != nil {
return nil, err
}
if err := prepareBlobColumn(dialect, db); err != nil {
return nil, err
}
userCount := 0 userCount := 0
db.Find(new(model.User)).Count(&userCount) db.Find(new(model.User)).Count(&userCount)
if createDefaultUserIfNotExist && userCount == 0 { if createDefaultUserIfNotExist && userCount == 0 {
@ -45,6 +52,31 @@ func New(dialect, connection, defaultUser, defaultPass string, strength int, cre
return &GormDatabase{DB: db}, nil return &GormDatabase{DB: db}, nil
} }
func prepareBlobColumn(dialect string, db *gorm.DB) error {
blobType := ""
switch dialect {
case "mysql":
blobType = "longblob"
case "postgres":
blobType = "bytea"
}
if blobType != "" {
for _, target := range []struct {
Table interface{}
Column string
}{
{model.Message{}, "extras"},
{model.PluginConf{}, "config"},
{model.PluginConf{}, "storage"},
} {
if err := db.Model(target.Table).ModifyColumn(target.Column, blobType).Error; err != nil {
return err
}
}
}
return nil
}
func createDirectoryIfSqlite(dialect string, connection string) { func createDirectoryIfSqlite(dialect string, connection string) {
if dialect == "sqlite3" { if dialect == "sqlite3" {
if _, err := os.Stat(filepath.Dir(connection)); os.IsNotExist(err) { if _, err := os.Stat(filepath.Dir(connection)); os.IsNotExist(err) {