2019-01-18 03:01:04 +03:00
// 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 migrations
import (
"fmt"
"code.gitea.io/gitea/models"
2019-01-18 17:50:38 +03:00
"code.gitea.io/gitea/modules/log"
2019-01-18 03:01:04 +03:00
"github.com/go-xorm/xorm"
2019-06-23 18:22:43 +03:00
"xorm.io/core"
2019-01-18 03:01:04 +03:00
)
func renameRepoIsBareToIsEmpty ( x * xorm . Engine ) error {
type Repository struct {
ID int64 ` xorm:"pk autoincr" `
IsBare bool
IsEmpty bool ` xorm:"INDEX" `
}
2019-01-20 04:20:52 +03:00
// First remove the index
2019-01-18 03:01:04 +03:00
sess := x . NewSession ( )
defer sess . Close ( )
if err := sess . Begin ( ) ; err != nil {
return err
}
2019-01-18 17:50:38 +03:00
2019-01-18 03:01:04 +03:00
var err error
2019-01-18 17:50:38 +03:00
if models . DbCfg . Type == core . POSTGRES || models . DbCfg . Type == core . SQLITE {
_ , err = sess . Exec ( "DROP INDEX IF EXISTS IDX_repository_is_bare" )
2019-01-21 13:12:45 +03:00
} else if models . DbCfg . Type == core . MSSQL {
2019-05-05 21:58:49 +03:00
_ , err = sess . Exec ( ` DECLARE @ ConstraintName VARCHAR ( 256 )
DECLARE @ SQL NVARCHAR ( 256 )
SELECT @ ConstraintName = obj . name FROM sys . columns col LEFT OUTER JOIN sys . objects obj ON obj . object_id = col . default_object_id AND obj . type = 'D' WHERE col . object_id = OBJECT_ID ( ' repository ' ) AND obj . name IS NOT NULL AND col . name = ' is_bare '
SET @ SQL = N ' ALTER TABLE [ repository ] DROP CONSTRAINT [ ' + @ ConstraintName + N ']'
EXEC sp_executesql @ SQL ` )
if err != nil {
return err
}
2019-04-24 20:43:38 +03:00
} else if models . DbCfg . Type == core . MYSQL {
indexes , err := sess . QueryString ( ` SHOW INDEX FROM repository WHERE KEY_NAME = 'IDX_repository_is_bare' ` )
if err != nil {
return err
}
if len ( indexes ) >= 1 {
_ , err = sess . Exec ( "DROP INDEX IDX_repository_is_bare ON repository" )
2019-06-12 22:41:28 +03:00
if err != nil {
return fmt . Errorf ( "Drop index failed: %v" , err )
}
2019-04-24 20:43:38 +03:00
}
2019-01-18 03:01:04 +03:00
} else {
2019-01-18 17:50:38 +03:00
_ , err = sess . Exec ( "DROP INDEX IDX_repository_is_bare ON repository" )
2019-01-18 03:01:04 +03:00
}
2019-04-24 20:43:38 +03:00
2019-01-18 03:01:04 +03:00
if err != nil {
2019-01-18 17:50:38 +03:00
return fmt . Errorf ( "Drop index failed: %v" , err )
}
2019-01-20 04:20:52 +03:00
if err = sess . Commit ( ) ; err != nil {
return err
}
if err := sess . Begin ( ) ; err != nil {
return err
}
2019-01-18 17:50:38 +03:00
if err := sess . Sync2 ( new ( Repository ) ) ; err != nil {
return err
}
if _ , err := sess . Exec ( "UPDATE repository SET is_empty = is_bare;" ) ; err != nil {
return err
}
if models . DbCfg . Type != core . SQLITE {
_ , err = sess . Exec ( "ALTER TABLE repository DROP COLUMN is_bare" )
if err != nil {
return fmt . Errorf ( "Drop column failed: %v" , err )
2019-01-18 03:01:04 +03:00
}
}
2019-01-18 17:50:38 +03:00
if err = sess . Commit ( ) ; err != nil {
return err
}
if models . DbCfg . Type == core . SQLITE {
log . Warn ( "TABLE repository's COLUMN is_bare should be DROP but sqlite is not supported, you could manually do that." )
}
return nil
2019-01-18 03:01:04 +03:00
}