-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Showing
3 changed files
with
77 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |