2019-06-08 16:53:45 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-06-08 16:53:45 +03:00
2021-09-19 14:49:59 +03:00
package db
2019-06-08 16:53:45 +03:00
2019-08-24 12:24:45 +03:00
import (
"fmt"
2022-01-02 16:12:35 +03:00
"strconv"
2019-08-24 12:24:45 +03:00
2022-01-02 16:12:35 +03:00
"code.gitea.io/gitea/modules/log"
2019-08-24 12:24:45 +03:00
"code.gitea.io/gitea/modules/setting"
2021-06-30 00:00:02 +03:00
2022-01-02 16:12:35 +03:00
"xorm.io/xorm"
2021-06-30 00:00:02 +03:00
"xorm.io/xorm/schemas"
2019-08-24 12:24:45 +03:00
)
2019-06-08 16:53:45 +03:00
2020-09-11 11:25:06 +03:00
// ConvertUtf8ToUtf8mb4 converts database and tables from utf8 to utf8mb4 if it's mysql and set ROW_FORMAT=dynamic
2019-06-08 16:53:45 +03:00
func ConvertUtf8ToUtf8mb4 ( ) error {
2021-06-30 00:00:02 +03:00
if x . Dialect ( ) . URI ( ) . DBType != schemas . MYSQL {
return nil
}
2019-08-24 12:24:45 +03:00
_ , err := x . Exec ( fmt . Sprintf ( "ALTER DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci" , setting . Database . Name ) )
2019-06-08 16:53:45 +03:00
if err != nil {
return err
}
tables , err := x . DBMetas ( )
if err != nil {
return err
}
for _ , table := range tables {
2020-09-11 11:25:06 +03:00
if _ , err := x . Exec ( fmt . Sprintf ( "ALTER TABLE `%s` ROW_FORMAT=dynamic;" , table . Name ) ) ; err != nil {
return err
}
2019-06-08 16:53:45 +03:00
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
}
2022-01-02 16:12:35 +03:00
// Cell2Int64 converts a xorm.Cell type to int64,
// and handles possible irregular cases.
func Cell2Int64 ( val xorm . Cell ) int64 {
switch ( * val ) . ( type ) {
case [ ] uint8 :
log . Trace ( "Cell2Int64 ([]uint8): %v" , * val )
v , _ := strconv . ParseInt ( string ( ( * val ) . ( [ ] uint8 ) ) , 10 , 64 )
return v
}
return ( * val ) . ( int64 )
}