diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2019-06-08 21:53:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-08 21:53:45 +0800 |
commit | 23a2ee3510ad1b1e7e89edc526ed394c71a8ba24 (patch) | |
tree | cb2ad04a3f6c12e266f84f2a187be8f9a348f438 | |
parent | 6fb31a54610d319fbcb6c930d2c4457c8be82c96 (diff) | |
download | gitea-23a2ee3510ad1b1e7e89edc526ed394c71a8ba24.tar.gz gitea-23a2ee3510ad1b1e7e89edc526ed394c71a8ba24.zip |
Add command to convert mysql database from utf8 to utf8mb4 (#7144)
* add command to convert mysql database from utf8 to utf8mb4
* Update cmd/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update cmd/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update cmd/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update models/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update models/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update cmd/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
* Update cmd/convert.go
Co-Authored-By: John Olheiser <42128690+jolheiser@users.noreply.github.com>
-rw-r--r-- | cmd/convert.go | 49 | ||||
-rw-r--r-- | main.go | 1 | ||||
-rw-r--r-- | models/convert.go | 27 |
3 files changed, 77 insertions, 0 deletions
diff --git a/cmd/convert.go b/cmd/convert.go new file mode 100644 index 0000000000..cb0510c722 --- /dev/null +++ b/cmd/convert.go @@ -0,0 +1,49 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli" +) + +// CmdConvert represents the available convert sub-command. +var CmdConvert = cli.Command{ + Name: "convert", + Usage: "Convert the database", + Description: "A command to convert an existing MySQL database from utf8 to utf8mb4", + Action: runConvert, +} + +func runConvert(ctx *cli.Context) error { + if err := initDB(); err != nil { + return err + } + + log.Trace("AppPath: %s", setting.AppPath) + log.Trace("AppWorkPath: %s", setting.AppWorkPath) + log.Trace("Custom path: %s", setting.CustomPath) + log.Trace("Log path: %s", setting.LogRootPath) + models.LoadConfigs() + + if models.DbCfg.Type != "mysql" { + fmt.Println("This command can only be used with a MySQL database") + return nil + } + + if err := models.ConvertUtf8ToUtf8mb4(); err != nil { + log.Fatal("Failed to convert database from utf8 to utf8mb4: %v", err) + return err + } + + fmt.Println("Converted successfully, please confirm your database's character set is now utf8mb4") + + return nil +} @@ -67,6 +67,7 @@ arguments - which can alternatively be run by running the subcommand web.` cmd.CmdGenerate, cmd.CmdMigrate, cmd.CmdKeys, + cmd.CmdConvert, } // Now adjust these commands to add our global configuration options diff --git a/models/convert.go b/models/convert.go new file mode 100644 index 0000000000..c34be973c6 --- /dev/null +++ b/models/convert.go @@ -0,0 +1,27 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import "fmt" + +// ConvertUtf8ToUtf8mb4 converts database and tables from utf8 to utf8mb4 if it's mysql +func ConvertUtf8ToUtf8mb4() error { + _, err := x.Exec(fmt.Sprintf("ALTER DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci", DbCfg.Name)) + if err != nil { + return err + } + + tables, err := x.DBMetas() + if err != nil { + return err + } + for _, table := range tables { + if _, err := x.Exec(fmt.Sprintf("ALTER TABLE `%s` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;", table.Name)); err != nil { + return err + } + } + + return nil +} |